diff --git a/.bazelrc b/.bazelrc index 855bc5770e169..a27e9186cefa6 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,13 +1,17 @@ startup --host_jvm_args=-Xmx8g startup --unlimit_coredumps +build --java_language_version=17 +build --java_runtime_version=17 +build --tool_java_language_version=17 +build --tool_java_runtime_version=17 + run --color=yes build:release --workspace_status_command=./build/print-workspace-status.sh --stamp build:release --config=ci build --incompatible_strict_action_env --incompatible_enable_cc_toolchain_resolution build:ci --remote_cache=http://172.16.4.21:8080/tidb --remote_timeout="10s" test:ci --verbose_failures -test:ci --test_timeout=180 test:ci --test_env=GO_TEST_WRAP_TESTV=1 --test_verbose_timeout_warnings test:ci --remote_cache=http://172.16.4.21:8080/tidb --remote_timeout="10s" test:ci --test_env=TZ=Asia/Shanghai --test_output=errors --experimental_ui_max_stdouterr_bytes=104857600 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ccc42ebaa1ee0..b1d1d17e8acd9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,3 +2,4 @@ /sessionctx/variable @pingcap/tidb-configuration-reviewer /config/config.toml.example @pingcap/tidb-configuration-reviewer /session/bootstrap.go @pingcap/tidb-configuration-reviewer +/telemetry/ @pingcap/telemetry-reviewer diff --git a/.github/licenserc.yml b/.github/licenserc.yml index 6185610c1464a..f6bb9182fa9da 100644 --- a/.github/licenserc.yml +++ b/.github/licenserc.yml @@ -36,4 +36,5 @@ header: - 'dumpling/' - 'tidb-binlog/driver/example' - 'tidb-binlog/proto/go-binlog/secondary_binlog.pb.go' + - '**/*.sql' comment: on-failure diff --git a/.github/workflows/license-checker.yml b/.github/workflows/license-checker.yml index c6c9bdeca8597..d02b288459d7c 100644 --- a/.github/workflows/license-checker.yml +++ b/.github/workflows/license-checker.yml @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Check License Header - uses: apache/skywalking-eyes@main + uses: apache/skywalking-eyes@v0.3.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.golangci.yml b/.golangci.yml index f82bace0fbd8c..91ca980280857 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -3,7 +3,6 @@ run: linters: disable-all: true enable: - - misspell - ineffassign - typecheck - varcheck @@ -20,7 +19,6 @@ linters: - bodyclose - exportloopref - rowserrcheck - - unconvert - makezero - durationcheck - prealloc diff --git a/DEPS.bzl b/DEPS.bzl index 909a95484d13c..1393b0bffd061 100644 --- a/DEPS.bzl +++ b/DEPS.bzl @@ -173,8 +173,8 @@ def go_deps(): name = "com_github_aws_aws_sdk_go", build_file_proto_mode = "disable_global", importpath = "github.com/aws/aws-sdk-go", - sum = "h1:r0puXncSaAfRt7Btml2swUo74Kao+vKhO3VLjwDjK54=", - version = "v1.35.3", + sum = "h1:hAwyfe7eZa7sM+S5mIJZFiNFwJMia9Whz6CYblioLoU=", + version = "v1.36.30", ) go_repository( name = "com_github_aymerick_raymond", @@ -1298,8 +1298,8 @@ def go_deps(): name = "com_github_google_btree", build_file_proto_mode = "disable_global", importpath = "github.com/google/btree", - sum = "h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=", - version = "v1.0.1", + sum = "h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=", + version = "v1.1.2", ) go_repository( name = "com_github_google_go_cmp", @@ -1354,15 +1354,15 @@ def go_deps(): name = "com_github_google_uuid", build_file_proto_mode = "disable_global", importpath = "github.com/google/uuid", - sum = "h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=", - version = "v1.1.2", + sum = "h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=", + version = "v1.3.0", ) go_repository( name = "com_github_googleapis_gax_go_v2", build_file_proto_mode = "disable_global", importpath = "github.com/googleapis/gax-go/v2", - sum = "h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU=", - version = "v2.1.1", + sum = "h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE=", + version = "v2.2.0", ) go_repository( name = "com_github_gopherjs_gopherjs", @@ -2139,6 +2139,14 @@ def go_deps(): sum = "h1:oacPXPKHJg0hcngVVrdtTnfGJiS+PtwoQwTBZGFlV4k=", version = "v3.3.0", ) + go_repository( + name = "com_github_mgechev_dots", + build_file_proto_mode = "disable", + importpath = "github.com/mgechev/dots", + sum = "h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0=", + version = "v0.0.0-20210922191527-e955255bf517", + ) + go_repository( name = "com_github_mgechev_revive", build_file_proto_mode = "disable", @@ -2339,8 +2347,8 @@ def go_deps(): name = "com_github_nxadm_tail", build_file_proto_mode = "disable_global", importpath = "github.com/nxadm/tail", - sum = "h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=", - version = "v1.4.8", + sum = "h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=", + version = "v1.4.4", ) go_repository( name = "com_github_oklog_ulid", @@ -2502,8 +2510,8 @@ def go_deps(): name = "com_github_pingcap_kvproto", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/kvproto", - sum = "h1:nP2wmyw9JTRsk5rm+tZtfAso6c/1FvuaFNbXTaYz3FE=", - version = "v0.0.0-20220705053936-aa9c2d20cd2a", + sum = "h1:PAXtUVMJnyQQS8t9GzihIFmh6FBXu0JziWbIVknLniA=", + version = "v0.0.0-20220711062932-08b02befd813", ) go_repository( name = "com_github_pingcap_log", @@ -2523,8 +2531,8 @@ def go_deps(): name = "com_github_pingcap_tipb", build_file_proto_mode = "disable_global", importpath = "github.com/pingcap/tipb", - sum = "h1:XaTE4ZhQbQtQZtAVzlZh/Pf6SjFfMSTe1ia2nGcl36Y=", - version = "v0.0.0-20220706024432-7be3cc83a7d5", + sum = "h1:FBaTXU8C3xgt/drM58VHxojHo/QoG1oPsgWTGvaSpO4=", + version = "v0.0.0-20220718022156-3e2483c20a9e", ) go_repository( name = "com_github_pkg_browser", @@ -3004,8 +3012,8 @@ def go_deps(): name = "com_github_tikv_client_go_v2", build_file_proto_mode = "disable_global", importpath = "github.com/tikv/client-go/v2", - sum = "h1:VAyYcN1Nw7RupQszUYqOkueEVapWSxKFU7uBaYY5Dv8=", - version = "v2.0.1-0.20220627063500-947d923945fd", + sum = "h1:fCAWVzUJYee1pDqYTBt5j2G1WuUfOL7A2mZoONoaHgs=", + version = "v2.0.1-0.20220721031657-e38d2b07de3f", ) go_repository( name = "com_github_tikv_pd_client", @@ -3320,8 +3328,8 @@ def go_deps(): name = "com_google_cloud_go_compute", build_file_proto_mode = "disable_global", importpath = "cloud.google.com/go/compute", - sum = "h1:EKki8sSdvDU0OO9mAXGwPXOTOgPz2l08R0/IutDH11I=", - version = "v1.2.0", + sum = "h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM=", + version = "v1.5.0", ) go_repository( name = "com_google_cloud_go_datastore", @@ -3714,8 +3722,8 @@ def go_deps(): name = "org_golang_google_api", build_file_proto_mode = "disable_global", importpath = "google.golang.org/api", - sum = "h1:yHW5s2SFyDapr/43kYtIQmoaaFVW4baLMLwqV4auj2A=", - version = "v0.69.0", + sum = "h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE=", + version = "v0.74.0", ) go_repository( name = "org_golang_google_appengine", @@ -3728,15 +3736,15 @@ def go_deps(): name = "org_golang_google_genproto", build_file_proto_mode = "disable_global", importpath = "google.golang.org/genproto", - sum = "h1:divpuJZKgX3Qt7MFDE5v62yu0yQcQbTCD9VJp9leX58=", - version = "v0.0.0-20220216160803-4663080d8bc8", + sum = "h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI=", + version = "v0.0.0-20220324131243-acbaeb5b85eb", ) go_repository( name = "org_golang_google_grpc", build_file_proto_mode = "disable_global", importpath = "google.golang.org/grpc", - sum = "h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=", - version = "v1.44.0", + sum = "h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=", + version = "v1.45.0", ) go_repository( name = "org_golang_google_grpc_cmd_protoc_gen_go_grpc", @@ -3756,8 +3764,8 @@ def go_deps(): name = "org_golang_x_crypto", build_file_proto_mode = "disable_global", importpath = "golang.org/x/crypto", - sum = "h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=", - version = "v0.0.0-20220214200702-86341886e292", + sum = "h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=", + version = "v0.0.0-20210921155107-089bfa567519", ) go_repository( name = "org_golang_x_exp", @@ -3806,15 +3814,15 @@ def go_deps(): name = "org_golang_x_net", build_file_proto_mode = "disable_global", importpath = "golang.org/x/net", - sum = "h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=", - version = "v0.0.0-20220127200216-cd36cc0744dd", + sum = "h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4=", + version = "v0.0.0-20220412020605-290c469a71a5", ) go_repository( name = "org_golang_x_oauth2", build_file_proto_mode = "disable_global", importpath = "golang.org/x/oauth2", - sum = "h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=", - version = "v0.0.0-20211104180415-d3ed0bb246c8", + sum = "h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=", + version = "v0.0.0-20220411215720-9780585627b5", ) go_repository( name = "org_golang_x_sync", diff --git a/Makefile b/Makefile index 6f45837b2d2b1..631afca546073 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ dev: checklist check explaintest gogenerate br_unit_test test_part_parser_dev ut # Install the check tools. check-setup:tools/bin/revive tools/bin/goword -check: fmt check-parallel unconvert lint tidy testSuite check-static vet errdoc +check: check-parallel lint tidy testSuite check-static errdoc fmt: @echo "gofmt (simplify)" @@ -412,6 +412,7 @@ dumpling_integration_test: dumpling_bins failpoint-enable build_dumpling dumpling_bins: @which bin/tidb-server @which bin/minio + @which bin/mc @which bin/tidb-lightning @which bin/sync_diff_inspector @@ -437,10 +438,13 @@ bazel_coverage_test: failpoint-enable bazel_ci_prepare bazel --output_user_root=/home/jenkins/.tidb/tmp coverage --config=ci --@io_bazel_rules_go//go/config:cover_format=go_cover \ -- //... -//cmd/... -//tests/graceshutdown/... \ -//tests/globalkilltest/... -//tests/readonlytest/... -//br/pkg/task:task_test + bazel --output_user_root=/home/jenkins/.tidb/tmp coverage --config=ci --@io_bazel_rules_go//go/config:cover_format=go_cover --define gotags=featuretag \ + -- //... -//cmd/... -//tests/graceshutdown/... \ + -//tests/globalkilltest/... -//tests/readonlytest/... -//br/pkg/task:task_test bazel_build: bazel_ci_prepare mkdir -p bin - bazel --output_user_root=/home/jenkins/.tidb/tmp build -k --config=ci //tidb-server/... //br/cmd/... //cmd/... --//build:with_nogo_flag=true + bazel --output_user_root=/home/jenkins/.tidb/tmp build -k --config=ci //tidb-server/... //br/cmd/... //cmd/... //util/... //dumpling/cmd/... //tidb-binlog/... --//build:with_nogo_flag=true cp bazel-out/k8-fastbuild/bin/tidb-server/tidb-server_/tidb-server ./bin cp bazel-out/k8-fastbuild/bin/cmd/importer/importer_/importer ./bin cp bazel-out/k8-fastbuild/bin/tidb-server/tidb-server-check_/tidb-server-check ./bin diff --git a/WORKSPACE b/WORKSPACE index 818097c85455f..736c69a061442 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -33,7 +33,7 @@ go_rules_dependencies() go_register_toolchains( nogo = "@//build:tidb_nogo", - version = "1.18.3", + version = "1.18.4", ) gazelle_dependencies() diff --git a/bindinfo/bind_test.go b/bindinfo/bind_test.go index 6e9d6384cab4f..6f5a446cdb92d 100644 --- a/bindinfo/bind_test.go +++ b/bindinfo/bind_test.go @@ -331,6 +331,49 @@ func TestExplain(t *testing.T) { tk.MustExec("drop global binding for SELECT * from t1 union SELECT * from t1") } +func TestBindSemiJoinRewrite(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t1(id int)") + tk.MustExec("create table t2(id int)") + require.True(t, tk.HasKeywordInOperatorInfo("select * from t1 where exists(select 1 from t2 where t1.id=t2.id)", "semi join")) + require.True(t, tk.NotHasKeywordInOperatorInfo("select * from t1 where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t2 where t1.id=t2.id)", "semi join")) + + tk.MustExec(` +create global binding for + select * from t1 where exists(select 1 from t2 where t1.id=t2.id) +using + select * from t1 where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t2 where t1.id=t2.id) +`) + + require.True(t, tk.NotHasKeywordInOperatorInfo("select * from t1 where exists(select 1 from t2 where t1.id=t2.id)", "semi join")) +} + +func TestBindCTEMerge(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(id int)") + require.True(t, tk.HasPlan("with cte as (select * from t1) select * from cte", "CTEFullScan")) + require.False(t, tk.HasPlan("with cte as (select /*+ MERGE() */ * from t1) select * from cte", "CTEFullScan")) + tk.MustExec(` +create global binding for + with cte as (select * from t1) select * from cte +using + with cte as (select /*+ MERGE() */ * from t1) select * from cte +`) + + require.False(t, tk.HasPlan("with cte as (select * from t1) select * from cte", "CTEFullScan")) +} + // TestBindingSymbolList tests sql with "?, ?, ?, ?", fixes #13871 func TestBindingSymbolList(t *testing.T) { store, dom, clean := testkit.CreateMockStoreAndDomain(t) diff --git a/bindinfo/capture_test.go b/bindinfo/capture_test.go index 7ebb419a8adaf..0836196d86852 100644 --- a/bindinfo/capture_test.go +++ b/bindinfo/capture_test.go @@ -441,7 +441,7 @@ func TestUpdateSubqueryCapture(t *testing.T) { tk.MustExec("admin capture bindings") rows := tk.MustQuery("show global bindings").Rows() require.Len(t, rows, 1) - bindSQL := "UPDATE /*+ use_index(@`upd_1` `test`.`t1` `idx_b`), use_index(@`sel_1` `test`.`t2` ), hash_join(@`upd_1` `test`.`t1`), use_index(@`sel_2` `test`.`t2` )*/ `test`.`t1` SET `b`=1 WHERE `b` = 2 AND (`a` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1) OR `c` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1))" + bindSQL := "UPDATE /*+ hash_join(@`upd_1` `test`.`t1`), use_index(@`upd_1` `test`.`t1` `idx_b`), use_index(@`sel_1` `test`.`t2` ), use_index(@`sel_2` `test`.`t2` )*/ `test`.`t1` SET `b`=1 WHERE `b` = 2 AND (`a` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1) OR `c` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1))" require.Equal(t, bindSQL, rows[0][1]) tk.MustExec(bindSQL) require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 0) @@ -566,7 +566,7 @@ func TestIssue25505(t *testing.T) { spmMap := map[string]string{} spmMap["with recursive `cte` ( `a` ) as ( select ? union select `a` + ? from `test` . `t1` where `a` < ? ) select * from `cte`"] = - "WITH RECURSIVE `cte` (`a`) AS (SELECT 2 UNION SELECT `a` + 1 FROM `test`.`t1` WHERE `a` < 5) SELECT /*+ use_index(@`sel_3` `test`.`t1` `idx_ab`), hash_agg(@`sel_1`)*/ * FROM `cte`" + "WITH RECURSIVE `cte` (`a`) AS (SELECT 2 UNION SELECT `a` + 1 FROM `test`.`t1` WHERE `a` < 5) SELECT /*+ hash_agg(@`sel_1`), use_index(@`sel_3` `test`.`t1` `idx_ab`)*/ * FROM `cte`" spmMap["with recursive `cte1` ( `a` , `b` ) as ( select * from `test` . `t` where `b` = ? union select `a` + ? , `b` + ? from `cte1` where `a` < ? ) select * from `test` . `t`"] = "WITH RECURSIVE `cte1` (`a`, `b`) AS (SELECT * FROM `test`.`t` WHERE `b` = 1 UNION SELECT `a` + 1,`b` + 1 FROM `cte1` WHERE `a` < 2) SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t`" spmMap["with `cte1` as ( select * from `test` . `t` ) , `cte2` as ( select ? ) select * from `test` . `t`"] = @@ -574,11 +574,11 @@ func TestIssue25505(t *testing.T) { spmMap["with `cte` as ( select * from `test` . `t` where `b` = ? ) select * from `test` . `t`"] = "WITH `cte` AS (SELECT * FROM `test`.`t` WHERE `b` = 6) SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t`" spmMap["with recursive `cte` ( `a` ) as ( select ? union select `a` + ? from `test` . `t1` where `a` > ? ) select * from `cte`"] = - "WITH RECURSIVE `cte` (`a`) AS (SELECT 2 UNION SELECT `a` + 1 FROM `test`.`t1` WHERE `a` > 5) SELECT /*+ use_index(@`sel_3` `test`.`t1` `idx_b`), hash_agg(@`sel_1`)*/ * FROM `cte`" + "WITH RECURSIVE `cte` (`a`) AS (SELECT 2 UNION SELECT `a` + 1 FROM `test`.`t1` WHERE `a` > 5) SELECT /*+ hash_agg(@`sel_1`), use_index(@`sel_3` `test`.`t1` `idx_b`)*/ * FROM `cte`" spmMap["with `cte` as ( with `cte1` as ( select * from `test` . `t2` where `a` > ? and `b` > ? ) select * from `cte1` ) select * from `cte` join `test` . `t1` on `t1` . `a` = `cte` . `a`"] = - "WITH `cte` AS (WITH `cte1` AS (SELECT * FROM `test`.`t2` WHERE `a` > 1 AND `b` > 1) SELECT * FROM `cte1`) SELECT /*+ use_index(@`sel_3` `test`.`t2` `idx_ab`), use_index(@`sel_1` `test`.`t1` `idx_ab`), inl_join(@`sel_1` `test`.`t1`)*/ * FROM `cte` JOIN `test`.`t1` ON `t1`.`a` = `cte`.`a`" + "WITH `cte` AS (WITH `cte1` AS (SELECT * FROM `test`.`t2` WHERE `a` > 1 AND `b` > 1) SELECT * FROM `cte1`) SELECT /*+ inl_join(@`sel_1` `test`.`t1`), use_index(@`sel_1` `test`.`t1` `idx_ab`), use_index(@`sel_3` `test`.`t2` `idx_ab`)*/ * FROM `cte` JOIN `test`.`t1` ON `t1`.`a` = `cte`.`a`" spmMap["with `cte` as ( with `cte1` as ( select * from `test` . `t2` where `a` = ? and `b` = ? ) select * from `cte1` ) select * from `cte` join `test` . `t1` on `t1` . `a` = `cte` . `a`"] = - "WITH `cte` AS (WITH `cte1` AS (SELECT * FROM `test`.`t2` WHERE `a` = 1 AND `b` = 1) SELECT * FROM `cte1`) SELECT /*+ use_index(@`sel_3` `test`.`t2` `idx_a`), use_index(@`sel_1` `test`.`t1` `idx_a`), inl_join(@`sel_1` `test`.`t1`)*/ * FROM `cte` JOIN `test`.`t1` ON `t1`.`a` = `cte`.`a`" + "WITH `cte` AS (WITH `cte1` AS (SELECT * FROM `test`.`t2` WHERE `a` = 1 AND `b` = 1) SELECT * FROM `cte1`) SELECT /*+ inl_join(@`sel_1` `test`.`t1`), use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_3` `test`.`t2` `idx_a`)*/ * FROM `cte` JOIN `test`.`t1` ON `t1`.`a` = `cte`.`a`" tk.MustExec("with cte as (with cte1 as (select /*+use_index(t2 idx_a)*/ * from t2 where a = 1 and b = 1) select * from cte1) select /*+use_index(t1 idx_a)*/ * from cte join t1 on t1.a=cte.a;") tk.MustExec("with cte as (with cte1 as (select /*+use_index(t2 idx_a)*/ * from t2 where a = 1 and b = 1) select * from cte1) select /*+use_index(t1 idx_a)*/ * from cte join t1 on t1.a=cte.a;") diff --git a/br/README.md b/br/README.md index 19304cdc90434..39e96581bc0c5 100644 --- a/br/README.md +++ b/br/README.md @@ -125,7 +125,7 @@ mysql --host 127.0.0.1 -P4000 -E -e "SELECT COUNT(*) FROM test.order_line" -uroo ## Compatibility test -See [COMPATBILE_TEST](./COMPATIBLE_TEST.md) +See [COMPATBILE_TEST](./COMPATIBILITY_TEST.md) ## Contributing diff --git a/br/cmd/br/BUILD.bazel b/br/cmd/br/BUILD.bazel index 2958366d93c4f..e558bf367b4ec 100644 --- a/br/cmd/br/BUILD.bazel +++ b/br/cmd/br/BUILD.bazel @@ -13,6 +13,7 @@ go_library( importpath = "github.com/pingcap/tidb/br/cmd/br", visibility = ["//visibility:private"], deps = [ + "//br/pkg/conn", "//br/pkg/errors", "//br/pkg/gluetidb", "//br/pkg/gluetikv", @@ -22,6 +23,7 @@ go_library( "//br/pkg/redact", "//br/pkg/restore", "//br/pkg/rtree", + "//br/pkg/streamhelper/config", "//br/pkg/summary", "//br/pkg/task", "//br/pkg/trace", diff --git a/br/cmd/br/cmd.go b/br/cmd/br/cmd.go index 3c5bf674da430..f3aeb3393df52 100644 --- a/br/cmd/br/cmd.go +++ b/br/cmd/br/cmd.go @@ -36,6 +36,14 @@ var ( "*.*", fmt.Sprintf("!%s.*", utils.TemporaryDBName("*")), "!mysql.*", + "mysql.user", + "mysql.db", + "mysql.tables_priv", + "mysql.columns_priv", + "mysql.global_priv", + "mysql.global_grants", + "mysql.default_roles", + "mysql.role_edges", "!sys.*", "!INFORMATION_SCHEMA.*", "!PERFORMANCE_SCHEMA.*", diff --git a/br/cmd/br/debug.go b/br/cmd/br/debug.go index 81f9543d1c349..c62dd677f9a66 100644 --- a/br/cmd/br/debug.go +++ b/br/cmd/br/debug.go @@ -16,6 +16,7 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/conn" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/metautil" @@ -53,6 +54,7 @@ func NewDebugCommand() *cobra.Command { meta.AddCommand(decodeBackupMetaCommand()) meta.AddCommand(encodeBackupMetaCommand()) meta.AddCommand(setPDConfigCommand()) + meta.AddCommand(searchStreamBackupCommand()) meta.Hidden = true return meta @@ -383,7 +385,7 @@ func setPDConfigCommand() *cobra.Command { return errors.Trace(err) } - mgr, err := task.NewMgr(ctx, tidbGlue, cfg.PD, cfg.TLS, task.GetKeepalive(&cfg), cfg.CheckRequirements, false) + mgr, err := task.NewMgr(ctx, tidbGlue, cfg.PD, cfg.TLS, task.GetKeepalive(&cfg), cfg.CheckRequirements, false, conn.NormalVersionChecker) if err != nil { return errors.Trace(err) } @@ -398,3 +400,71 @@ func setPDConfigCommand() *cobra.Command { } return pdConfigCmd } + +func searchStreamBackupCommand() *cobra.Command { + searchBackupCMD := &cobra.Command{ + Use: "search-log-backup", + Short: "search log backup by key", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + ctx, cancel := context.WithCancel(GetDefaultContext()) + defer cancel() + + searchKey, err := cmd.Flags().GetString("search-key") + if err != nil { + return errors.Trace(err) + } + if searchKey == "" { + return errors.New("key param can't be empty") + } + keyBytes, err := hex.DecodeString(searchKey) + if err != nil { + return errors.Trace(err) + } + + startTs, err := cmd.Flags().GetUint64("start-ts") + if err != nil { + return errors.Trace(err) + } + endTs, err := cmd.Flags().GetUint64("end-ts") + if err != nil { + return errors.Trace(err) + } + + var cfg task.Config + if err = cfg.ParseFromFlags(cmd.Flags()); err != nil { + return errors.Trace(err) + } + _, s, err := task.GetStorage(ctx, cfg.Storage, &cfg) + if err != nil { + return errors.Trace(err) + } + comparator := restore.NewStartWithComparator() + bs := restore.NewStreamBackupSearch(s, comparator, keyBytes) + bs.SetStartTS(startTs) + bs.SetEndTs(endTs) + + kvs, err := bs.Search(ctx) + if err != nil { + return errors.Trace(err) + } + + kvsBytes, err := json.MarshalIndent(kvs, "", " ") + if err != nil { + return errors.Trace(err) + } + + cmd.Println("search result") + cmd.Println(string(kvsBytes)) + + return nil + }, + } + + flags := searchBackupCMD.Flags() + flags.String("search-key", "", "hex encoded key") + flags.Uint64("start-ts", 0, "search from start TSO, default is no start TSO limit") + flags.Uint64("end-ts", 0, "search to end TSO, default is no end TSO limit") + + return searchBackupCMD +} diff --git a/br/cmd/br/restore.go b/br/cmd/br/restore.go index a228605fb51b7..b5a692c0dc03d 100644 --- a/br/cmd/br/restore.go +++ b/br/cmd/br/restore.go @@ -3,8 +3,11 @@ package main import ( + "fmt" + "github.com/pingcap/errors" "github.com/pingcap/log" + berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/gluetikv" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/task" @@ -38,11 +41,31 @@ func runRestoreCommand(command *cobra.Command, cmdName string) error { } if err := task.RunRestore(GetDefaultContext(), tidbGlue, cmdName, &cfg); err != nil { log.Error("failed to restore", zap.Error(err)) + printWorkaroundOnFullRestoreError(command, err) return errors.Trace(err) } return nil } +// print workaround when we met not fresh or incompatible cluster error on full cluster restore +func printWorkaroundOnFullRestoreError(command *cobra.Command, err error) { + if !errors.ErrorEqual(err, berrors.ErrRestoreNotFreshCluster) && + !errors.ErrorEqual(err, berrors.ErrRestoreIncompatibleSys) { + return + } + fmt.Println("#######################################################################") + switch { + case errors.ErrorEqual(err, berrors.ErrRestoreNotFreshCluster): + fmt.Println("# the target cluster is not fresh, br cannot restore system tables.") + case errors.ErrorEqual(err, berrors.ErrRestoreIncompatibleSys): + fmt.Println("# the target cluster is not compatible with the backup data,") + fmt.Println("# br cannot restore system tables.") + } + fmt.Println("# you can use the following command to skip restoring system tables:") + fmt.Printf("# br restore %s --filter '*.*' --filter '!mysql.*' \n", command.Use) + fmt.Println("#######################################################################") +} + func runRestoreRawCommand(command *cobra.Command, cmdName string) error { cfg := task.RestoreRawConfig{ RawKvConfig: task.RawKvConfig{Config: task.Config{LogProgress: HasLogFile()}}, diff --git a/br/cmd/br/stream.go b/br/cmd/br/stream.go index c59ae6d859af0..f452e38917ea5 100644 --- a/br/cmd/br/stream.go +++ b/br/cmd/br/stream.go @@ -16,6 +16,7 @@ package main import ( "github.com/pingcap/errors" + advancercfg "github.com/pingcap/tidb/br/pkg/streamhelper/config" "github.com/pingcap/tidb/br/pkg/task" "github.com/pingcap/tidb/br/pkg/trace" "github.com/pingcap/tidb/br/pkg/utils" @@ -49,6 +50,7 @@ func NewStreamCommand() *cobra.Command { newStreamStatusCommand(), newStreamTruncateCommand(), newStreamCheckCommand(), + newStreamAdvancerCommand(), ) command.SetHelpFunc(func(command *cobra.Command, strings []string) { task.HiddenFlagsForStream(command.Root().PersistentFlags()) @@ -157,6 +159,21 @@ func newStreamCheckCommand() *cobra.Command { return command } +func newStreamAdvancerCommand() *cobra.Command { + command := &cobra.Command{ + Use: "advancer", + Short: "Start a central worker for advancing the checkpoint. (only for debuging, this subcommand should be integrated to TiDB)", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + return streamCommand(cmd, task.StreamCtl) + }, + Hidden: true, + } + task.DefineStreamCommonFlags(command.Flags()) + advancercfg.DefineFlagsForCheckpointAdvancerConfig(command.Flags()) + return command +} + func streamCommand(command *cobra.Command, cmdName string) error { var cfg task.StreamConfig var err error @@ -192,6 +209,13 @@ func streamCommand(command *cobra.Command, cmdName string) error { if err = cfg.ParseStreamPauseFromFlags(command.Flags()); err != nil { return errors.Trace(err) } + case task.StreamCtl: + if err = cfg.ParseStreamCommonFromFlags(command.Flags()); err != nil { + return errors.Trace(err) + } + if err = cfg.AdvancerCfg.GetFromFlags(command.Flags()); err != nil { + return errors.Trace(err) + } default: if err = cfg.ParseStreamCommonFromFlags(command.Flags()); err != nil { return errors.Trace(err) diff --git a/br/pkg/backup/BUILD.bazel b/br/pkg/backup/BUILD.bazel index 14f4d1a87c6f9..0ee2f27af135f 100644 --- a/br/pkg/backup/BUILD.bazel +++ b/br/pkg/backup/BUILD.bazel @@ -29,6 +29,7 @@ go_library( "//meta", "//meta/autoid", "//parser/model", + "//sessionctx", "//statistics/handle", "//util", "//util/codec", diff --git a/br/pkg/backup/client.go b/br/pkg/backup/client.go index 22a47de065a71..598f9d50c3006 100644 --- a/br/pkg/backup/client.go +++ b/br/pkg/backup/client.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/ranger" @@ -472,21 +473,31 @@ func skipUnsupportedDDLJob(job *model.Job) bool { } // WriteBackupDDLJobs sends the ddl jobs are done in (lastBackupTS, backupTS] to metaWriter. -func WriteBackupDDLJobs(metaWriter *metautil.MetaWriter, store kv.Storage, lastBackupTS, backupTS uint64) error { +func WriteBackupDDLJobs(metaWriter *metautil.MetaWriter, se sessionctx.Context, store kv.Storage, lastBackupTS, backupTS uint64) error { snapshot := store.GetSnapshot(kv.NewVersion(backupTS)) snapMeta := meta.NewSnapshotMeta(snapshot) lastSnapshot := store.GetSnapshot(kv.NewVersion(lastBackupTS)) lastSnapMeta := meta.NewSnapshotMeta(lastSnapshot) - lastSchemaVersion, err := lastSnapMeta.GetSchemaVersion() + lastSchemaVersion, err := lastSnapMeta.GetSchemaVersionWithNonEmptyDiff() if err != nil { return errors.Trace(err) } - allJobs, err := ddl.GetAllDDLJobs(snapMeta) + backupSchemaVersion, err := snapMeta.GetSchemaVersionWithNonEmptyDiff() + if err != nil { + return errors.Trace(err) + } + + version, err := store.CurrentVersion(kv.GlobalTxnScope) + if err != nil { + return errors.Trace(err) + } + newestMeta := meta.NewSnapshotMeta(store.GetSnapshot(kv.NewVersion(version.Ver))) + allJobs, err := ddl.GetAllDDLJobs(se, newestMeta) if err != nil { return errors.Trace(err) } log.Debug("get all jobs", zap.Int("jobs", len(allJobs))) - historyJobs, err := ddl.GetAllHistoryDDLJobs(snapMeta) + historyJobs, err := ddl.GetAllHistoryDDLJobs(newestMeta) if err != nil { return errors.Trace(err) } @@ -500,7 +511,7 @@ func WriteBackupDDLJobs(metaWriter *metautil.MetaWriter, store kv.Storage, lastB } if (job.State == model.JobStateDone || job.State == model.JobStateSynced) && - (job.BinlogInfo != nil && job.BinlogInfo.SchemaVersion > lastSchemaVersion) { + (job.BinlogInfo != nil && job.BinlogInfo.SchemaVersion > lastSchemaVersion && job.BinlogInfo.SchemaVersion <= backupSchemaVersion) { if job.BinlogInfo.DBInfo != nil { // ignore all placement policy info during incremental backup for now. job.BinlogInfo.DBInfo.PlacementPolicyRef = nil @@ -533,9 +544,11 @@ func (bc *Client) BackupRanges( metaWriter *metautil.MetaWriter, progressCallBack func(ProgressUnit), ) error { + log.Info("Backup Ranges Started", rtree.ZapRanges(ranges)) init := time.Now() + defer func() { - log.Info("Backup Ranges", zap.Duration("take", time.Since(init))) + log.Info("Backup Ranges Completed", zap.Duration("take", time.Since(init))) }() if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { @@ -580,13 +593,15 @@ func (bc *Client) BackupRange( start := time.Now() defer func() { elapsed := time.Since(start) - logutil.CL(ctx).Info("backup range finished", zap.Duration("take", elapsed)) + logutil.CL(ctx).Info("backup range completed", + logutil.Key("startKey", req.StartKey), logutil.Key("endKey", req.EndKey), + zap.Duration("take", elapsed)) key := "range start:" + hex.EncodeToString(req.StartKey) + " end:" + hex.EncodeToString(req.EndKey) if err != nil { summary.CollectFailureUnit(key, err) } }() - logutil.CL(ctx).Info("backup started", + logutil.CL(ctx).Info("backup range started", logutil.Key("startKey", req.StartKey), logutil.Key("endKey", req.EndKey), zap.Uint64("rateLimit", req.RateLimit), zap.Uint32("concurrency", req.Concurrency)) @@ -597,12 +612,13 @@ func (bc *Client) BackupRange( return errors.Trace(err) } + logutil.CL(ctx).Info("backup push down started") push := newPushDown(bc.mgr, len(allStores)) results, err := push.pushBackup(ctx, req, allStores, progressCallBack) if err != nil { return errors.Trace(err) } - logutil.CL(ctx).Info("finish backup push down", zap.Int("small-range-count", results.Len())) + logutil.CL(ctx).Info("backup push down completed", zap.Int("small-range-count", results.Len())) // Find and backup remaining ranges. // TODO: test fine grained backup. @@ -619,9 +635,9 @@ func (bc *Client) BackupRange( logutil.Key("endKey", req.EndKey), zap.String("cf", req.Cf)) } else { - logutil.CL(ctx).Info("time range backed up", - zap.Reflect("StartVersion", req.StartVersion), - zap.Reflect("EndVersion", req.EndVersion)) + logutil.CL(ctx).Info("transactional range backup completed", + zap.Reflect("StartTS", req.StartVersion), + zap.Reflect("EndTS", req.EndVersion)) } var ascendErr error diff --git a/br/pkg/backup/client_test.go b/br/pkg/backup/client_test.go index d2a53c9934d4c..60cf42f94998a 100644 --- a/br/pkg/backup/client_test.go +++ b/br/pkg/backup/client_test.go @@ -280,7 +280,7 @@ func TestSkipUnsupportedDDLJob(t *testing.T) { metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, false, "", &cipher) ctx := context.Background() metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) - err = backup.WriteBackupDDLJobs(metaWriter, s.cluster.Storage, lastTS, ts) + err = backup.WriteBackupDDLJobs(metaWriter, tk.Session(), s.cluster.Storage, lastTS, ts) require.NoErrorf(t, err, "Error get ddl jobs: %s", err) err = metaWriter.FinishWriteMetas(ctx, metautil.AppendDDL) require.NoError(t, err, "Flush failed", err) diff --git a/br/pkg/backup/schema.go b/br/pkg/backup/schema.go index f28b5eae16066..385adbad6f55c 100644 --- a/br/pkg/backup/schema.go +++ b/br/pkg/backup/schema.go @@ -108,13 +108,13 @@ func (ss *Schemas) BackupSchemas( ) if !skipChecksum { - logger.Info("table checksum start") + logger.Info("Calculate table checksum start") start := time.Now() err := schema.calculateChecksum(ectx, store.GetClient(), backupTS, copConcurrency) if err != nil { return errors.Trace(err) } - logger.Info("table checksum finished", + logger.Info("Calculate table checksum completed", zap.Uint64("Crc64Xor", schema.crc64xor), zap.Uint64("TotalKvs", schema.totalKvs), zap.Uint64("TotalBytes", schema.totalBytes), @@ -143,7 +143,7 @@ func (ss *Schemas) BackupSchemas( if err := errg.Wait(); err != nil { return errors.Trace(err) } - log.Info("backup checksum", zap.Duration("take", time.Since(startAll))) + log.Info("Backup calculated table checksum into metas", zap.Duration("take", time.Since(startAll))) summary.CollectDuration("backup checksum", time.Since(startAll)) return metaWriter.FinishWriteMetas(ctx, op) } diff --git a/br/pkg/conn/BUILD.bazel b/br/pkg/conn/BUILD.bazel index b61518eb2f44d..ad1bcacaaac8d 100644 --- a/br/pkg/conn/BUILD.bazel +++ b/br/pkg/conn/BUILD.bazel @@ -19,6 +19,7 @@ go_library( "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_kvproto//pkg/logbackuppb", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_log//:log", "@com_github_tikv_client_go_v2//oracle", @@ -26,9 +27,7 @@ go_library( "@com_github_tikv_client_go_v2//txnkv/txnlock", "@com_github_tikv_pd_client//:client", "@org_golang_google_grpc//:grpc", - "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//codes", - "@org_golang_google_grpc//credentials", "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", "@org_uber_go_zap//:zap", diff --git a/br/pkg/conn/conn.go b/br/pkg/conn/conn.go index 75eef2c1555ab..4ccf9f6561a02 100755 --- a/br/pkg/conn/conn.go +++ b/br/pkg/conn/conn.go @@ -9,16 +9,14 @@ import ( "fmt" "net/http" "net/url" - "os" "strings" - "sync" - "time" "github.com/docker/go-units" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" backuppb "github.com/pingcap/kvproto/pkg/brpb" + logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" @@ -35,9 +33,7 @@ import ( pd "github.com/tikv/pd/client" "go.uber.org/zap" "google.golang.org/grpc" - "google.golang.org/grpc/backoff" "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" "google.golang.org/grpc/keepalive" "google.golang.org/grpc/status" ) @@ -49,83 +45,26 @@ const ( // DefaultMergeRegionKeyCount is the default region key count, 960000. DefaultMergeRegionKeyCount uint64 = 960000 - - dialTimeout = 30 * time.Second - - resetRetryTimes = 3 ) -// Pool is a lazy pool of gRPC channels. -// When `Get` called, it lazily allocates new connection if connection not full. -// If it's full, then it will return allocated channels round-robin. -type Pool struct { - mu sync.Mutex - - conns []*grpc.ClientConn - next int - cap int - newConn func(ctx context.Context) (*grpc.ClientConn, error) -} - -func (p *Pool) takeConns() (conns []*grpc.ClientConn) { - p.mu.Lock() - defer p.mu.Unlock() - p.conns, conns = nil, p.conns - p.next = 0 - return conns -} - -// Close closes the conn pool. -func (p *Pool) Close() { - for _, c := range p.takeConns() { - if err := c.Close(); err != nil { - log.Warn("failed to close clientConn", zap.String("target", c.Target()), zap.Error(err)) - } - } -} - -// Get tries to get an existing connection from the pool, or make a new one if the pool not full. -func (p *Pool) Get(ctx context.Context) (*grpc.ClientConn, error) { - p.mu.Lock() - defer p.mu.Unlock() - if len(p.conns) < p.cap { - c, err := p.newConn(ctx) - if err != nil { - return nil, err - } - p.conns = append(p.conns, c) - return c, nil - } - - conn := p.conns[p.next] - p.next = (p.next + 1) % p.cap - return conn, nil -} - -// NewConnPool creates a new Pool by the specified conn factory function and capacity. -func NewConnPool(capacity int, newConn func(ctx context.Context) (*grpc.ClientConn, error)) *Pool { - return &Pool{ - cap: capacity, - conns: make([]*grpc.ClientConn, 0, capacity), - newConn: newConn, +type VersionCheckerType int - mu: sync.Mutex{}, - } -} +const ( + // default version checker + NormalVersionChecker VersionCheckerType = iota + // version checker for PiTR + StreamVersionChecker +) // Mgr manages connections to a TiDB cluster. type Mgr struct { *pdutil.PdController - tlsConf *tls.Config - dom *domain.Domain - storage kv.Storage // Used to access SQL related interfaces. - tikvStore tikv.Storage // Used to access TiKV specific interfaces. - grpcClis struct { - mu sync.Mutex - clis map[uint64]*grpc.ClientConn - } - keepalive keepalive.ClientParameters + dom *domain.Domain + storage kv.Storage // Used to access SQL related interfaces. + tikvStore tikv.Storage // Used to access TiKV specific interfaces. ownsStorage bool + + *utils.StoreManager } // StoreBehavior is the action to do in GetAllTiKVStores when a non-TiKV @@ -247,6 +186,7 @@ func NewMgr( storeBehavior StoreBehavior, checkRequirements bool, needDomain bool, + versionCheckerType VersionCheckerType, ) (*Mgr, error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("conn.NewMgr", opentracing.ChildOf(span.Context())) @@ -262,7 +202,16 @@ func NewMgr( return nil, errors.Trace(err) } if checkRequirements { - err = version.CheckClusterVersion(ctx, controller.GetPDClient(), version.CheckVersionForBR) + var checker version.VerChecker + switch versionCheckerType { + case NormalVersionChecker: + checker = version.CheckVersionForBR + case StreamVersionChecker: + checker = version.CheckVersionForBRPiTR + default: + return nil, errors.Errorf("unknown command type, comman code is %d", versionCheckerType) + } + err = version.CheckClusterVersion(ctx, controller.GetPDClient(), checker) if err != nil { return nil, errors.Annotate(err, "running BR in incompatible version of cluster, "+ "if you believe it's OK, use --check-requirements=false to skip.") @@ -298,122 +247,31 @@ func NewMgr( storage: storage, tikvStore: tikvStorage, dom: dom, - tlsConf: tlsConf, ownsStorage: g.OwnsStorage(), - grpcClis: struct { - mu sync.Mutex - clis map[uint64]*grpc.ClientConn - }{clis: make(map[uint64]*grpc.ClientConn)}, - keepalive: keepalive, + StoreManager: utils.NewStoreManager(controller.GetPDClient(), keepalive, tlsConf), } return mgr, nil } -func (mgr *Mgr) getGrpcConnLocked(ctx context.Context, storeID uint64) (*grpc.ClientConn, error) { - failpoint.Inject("hint-get-backup-client", func(v failpoint.Value) { - log.Info("failpoint hint-get-backup-client injected, "+ - "process will notify the shell.", zap.Uint64("store", storeID)) - if sigFile, ok := v.(string); ok { - file, err := os.Create(sigFile) - if err != nil { - log.Warn("failed to create file for notifying, skipping notify", zap.Error(err)) - } - if file != nil { - file.Close() - } - } - time.Sleep(3 * time.Second) - }) - store, err := mgr.GetPDClient().GetStore(ctx, storeID) - if err != nil { - return nil, errors.Trace(err) - } - opt := grpc.WithInsecure() - if mgr.tlsConf != nil { - opt = grpc.WithTransportCredentials(credentials.NewTLS(mgr.tlsConf)) - } - ctx, cancel := context.WithTimeout(ctx, dialTimeout) - bfConf := backoff.DefaultConfig - bfConf.MaxDelay = time.Second * 3 - addr := store.GetPeerAddress() - if addr == "" { - addr = store.GetAddress() - } - conn, err := grpc.DialContext( - ctx, - addr, - opt, - grpc.WithBlock(), - grpc.WithConnectParams(grpc.ConnectParams{Backoff: bfConf}), - grpc.WithKeepaliveParams(mgr.keepalive), - ) - cancel() - if err != nil { - return nil, berrors.ErrFailedToConnect.Wrap(err).GenWithStack("failed to make connection to store %d", storeID) - } - return conn, nil -} - // GetBackupClient get or create a backup client. func (mgr *Mgr) GetBackupClient(ctx context.Context, storeID uint64) (backuppb.BackupClient, error) { - if ctx.Err() != nil { - return nil, errors.Trace(ctx.Err()) - } - - mgr.grpcClis.mu.Lock() - defer mgr.grpcClis.mu.Unlock() - - if conn, ok := mgr.grpcClis.clis[storeID]; ok { - // Find a cached backup client. - return backuppb.NewBackupClient(conn), nil - } - - conn, err := mgr.getGrpcConnLocked(ctx, storeID) - if err != nil { - return nil, errors.Trace(err) + var cli backuppb.BackupClient + if err := mgr.WithConn(ctx, storeID, func(cc *grpc.ClientConn) { + cli = backuppb.NewBackupClient(cc) + }); err != nil { + return nil, err } - // Cache the conn. - mgr.grpcClis.clis[storeID] = conn - return backuppb.NewBackupClient(conn), nil + return cli, nil } -// ResetBackupClient reset the connection for backup client. -func (mgr *Mgr) ResetBackupClient(ctx context.Context, storeID uint64) (backuppb.BackupClient, error) { - if ctx.Err() != nil { - return nil, errors.Trace(ctx.Err()) - } - - mgr.grpcClis.mu.Lock() - defer mgr.grpcClis.mu.Unlock() - - if conn, ok := mgr.grpcClis.clis[storeID]; ok { - // Find a cached backup client. - log.Info("Reset backup client", zap.Uint64("storeID", storeID)) - err := conn.Close() - if err != nil { - log.Warn("close backup connection failed, ignore it", zap.Uint64("storeID", storeID)) - } - delete(mgr.grpcClis.clis, storeID) - } - var ( - conn *grpc.ClientConn - err error - ) - for retry := 0; retry < resetRetryTimes; retry++ { - conn, err = mgr.getGrpcConnLocked(ctx, storeID) - if err != nil { - log.Warn("failed to reset grpc connection, retry it", - zap.Int("retry time", retry), logutil.ShortError(err)) - time.Sleep(time.Duration(retry+3) * time.Second) - continue - } - mgr.grpcClis.clis[storeID] = conn - break - } - if err != nil { - return nil, errors.Trace(err) +func (mgr *Mgr) GetLogBackupClient(ctx context.Context, storeID uint64) (logbackup.LogBackupClient, error) { + var cli logbackup.LogBackupClient + if err := mgr.WithConn(ctx, storeID, func(cc *grpc.ClientConn) { + cli = logbackup.NewLogBackupClient(cc) + }); err != nil { + return nil, err } - return backuppb.NewBackupClient(conn), nil + return cli, nil } // GetStorage returns a kv storage. @@ -423,7 +281,7 @@ func (mgr *Mgr) GetStorage() kv.Storage { // GetTLSConfig returns the tls config. func (mgr *Mgr) GetTLSConfig() *tls.Config { - return mgr.tlsConf + return mgr.StoreManager.TLSConfig() } // GetLockResolver gets the LockResolver. @@ -436,17 +294,10 @@ func (mgr *Mgr) GetDomain() *domain.Domain { return mgr.dom } -// Close closes all client in Mgr. func (mgr *Mgr) Close() { - mgr.grpcClis.mu.Lock() - for _, cli := range mgr.grpcClis.clis { - err := cli.Close() - if err != nil { - log.Error("fail to close Mgr", zap.Error(err)) - } + if mgr.StoreManager != nil { + mgr.StoreManager.Close() } - mgr.grpcClis.mu.Unlock() - // Gracefully shutdown domain so it does not affect other TiDB DDL. // Must close domain before closing storage, otherwise it gets stuck forever. if mgr.ownsStorage { diff --git a/br/pkg/errors/errors.go b/br/pkg/errors/errors.go index 7585f7bc43673..355b7bad3668f 100644 --- a/br/pkg/errors/errors.go +++ b/br/pkg/errors/errors.go @@ -62,7 +62,10 @@ var ( ErrRestoreInvalidRange = errors.Normalize("invalid restore range", errors.RFCCodeText("BR:Restore:ErrRestoreInvalidRange")) ErrRestoreWriteAndIngest = errors.Normalize("failed to write and ingest", errors.RFCCodeText("BR:Restore:ErrRestoreWriteAndIngest")) ErrRestoreSchemaNotExists = errors.Normalize("schema not exists", errors.RFCCodeText("BR:Restore:ErrRestoreSchemaNotExists")) + ErrRestoreNotFreshCluster = errors.Normalize("cluster is not fresh", errors.RFCCodeText("BR:Restore:ErrRestoreNotFreshCluster")) + ErrRestoreIncompatibleSys = errors.Normalize("incompatible system table", errors.RFCCodeText("BR:Restore:ErrRestoreIncompatibleSys")) ErrUnsupportedSystemTable = errors.Normalize("the system table isn't supported for restoring yet", errors.RFCCodeText("BR:Restore:ErrUnsupportedSysTable")) + ErrDatabasesAlreadyExisted = errors.Normalize("databases already existed in restored cluster", errors.RFCCodeText("BR:Restore:ErrDatabasesAlreadyExisted")) // ErrStreamLogTaskExist is the error when stream log task already exists, because of supporting single task currently. ErrStreamLogTaskExist = errors.Normalize("stream task already exists", errors.RFCCodeText("BR:Stream:ErrStreamLogTaskExist")) diff --git a/br/pkg/glue/BUILD.bazel b/br/pkg/glue/BUILD.bazel index 812b2b2c8b6a7..e51549b578927 100644 --- a/br/pkg/glue/BUILD.bazel +++ b/br/pkg/glue/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "//domain", "//kv", "//parser/model", + "//sessionctx", "@com_github_fatih_color//:color", "@com_github_pingcap_log//:log", "@com_github_tikv_pd_client//:client", diff --git a/br/pkg/glue/console_glue.go b/br/pkg/glue/console_glue.go index 01c765567c62b..3b64faa14b56f 100644 --- a/br/pkg/glue/console_glue.go +++ b/br/pkg/glue/console_glue.go @@ -9,6 +9,7 @@ import ( "os" "regexp" "strings" + "time" "github.com/fatih/color" "github.com/pingcap/log" @@ -22,6 +23,43 @@ type ConsoleOperations struct { ConsoleGlue } +// An extra field appending to the task. +// return type is a {key: string, value: string} tuple. +type ExtraField func() [2]string + +// NOTE: +// Perhaps we'd better move these modifiers and terminal function to another package +// like `glue/termutil?` + +// WithTimeCost adds the task information of time costing for `ShowTask`. +func WithTimeCost() ExtraField { + start := time.Now() + return func() [2]string { + return [2]string{"take", time.Since(start).String()} + } +} + +// WithConstExtraField adds an extra field with constant values. +func WithConstExtraField(key string, value interface{}) ExtraField { + return func() [2]string { + return [2]string{key, fmt.Sprint(value)} + } +} + +// ShowTask prints a task start information, and mark as finished when the returned function called. +// This is for TUI presenting. +func (ops ConsoleOperations) ShowTask(message string, extraFields ...ExtraField) func() { + ops.Print(message) + return func() { + fields := make([]string, 0, len(extraFields)) + for _, fieldFunc := range extraFields { + field := fieldFunc() + fields = append(fields, fmt.Sprintf("%s = %s", field[0], color.New(color.Bold).Sprint(field[1]))) + } + ops.Printf("%s; %s\n", color.HiGreenString("DONE"), strings.Join(fields, ", ")) + } +} + func (ops ConsoleOperations) RootFrame() Frame { return Frame{ width: ops.GetWidth(), diff --git a/br/pkg/glue/glue.go b/br/pkg/glue/glue.go index 24b0852d31290..4c3f18714f9a3 100644 --- a/br/pkg/glue/glue.go +++ b/br/pkg/glue/glue.go @@ -8,6 +8,7 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" pd "github.com/tikv/pd/client" ) @@ -39,6 +40,7 @@ type Session interface { CreatePlacementPolicy(ctx context.Context, policy *model.PolicyInfo) error Close() GetGlobalVariable(name string) (string, error) + GetSessionCtx() sessionctx.Context } // BatchCreateTableSession is an interface to batch create table parallelly diff --git a/br/pkg/gluetidb/glue.go b/br/pkg/gluetidb/glue.go index 48d5b05b56a63..d07594f1f842d 100644 --- a/br/pkg/gluetidb/glue.go +++ b/br/pkg/gluetidb/glue.go @@ -114,6 +114,11 @@ func (g Glue) GetVersion() string { return g.tikvGlue.GetVersion() } +// GetSessionCtx implements glue.Glue +func (gs *tidbSession) GetSessionCtx() sessionctx.Context { + return gs.se +} + // Execute implements glue.Session. func (gs *tidbSession) Execute(ctx context.Context, sql string) error { return gs.ExecuteInternal(ctx, sql) diff --git a/br/pkg/lightning/backend/backend.go b/br/pkg/lightning/backend/backend.go index f8b3e79132aa9..a08ba27146eb0 100644 --- a/br/pkg/lightning/backend/backend.go +++ b/br/pkg/lightning/backend/backend.go @@ -125,16 +125,43 @@ type CheckCtx struct { DBMetas []*mydump.MDDatabaseMeta } +// TargetInfoGetter defines the interfaces to get target information. +type TargetInfoGetter interface { + // FetchRemoteTableModels obtains the models of all tables given the schema + // name. The returned table info does not need to be precise if the encoder, + // is not requiring them, but must at least fill in the following fields for + // TablesFromMeta to succeed: + // - Name + // - State (must be model.StatePublic) + // - ID + // - Columns + // * Name + // * State (must be model.StatePublic) + // * Offset (must be 0, 1, 2, ...) + // - PKIsHandle (true = do not generate _tidb_rowid) + FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) + + // CheckRequirements performs the check whether the backend satisfies the version requirements + CheckRequirements(ctx context.Context, checkCtx *CheckCtx) error +} + +// EncodingBuilder consists of operations to handle encoding backend row data formats from source. +type EncodingBuilder interface { + // NewEncoder creates an encoder of a TiDB table. + NewEncoder(ctx context.Context, tbl table.Table, options *kv.SessionOptions) (kv.Encoder, error) + // MakeEmptyRows creates an empty collection of encoded rows. + MakeEmptyRows() kv.Rows +} + // AbstractBackend is the abstract interface behind Backend. // Implementations of this interface must be goroutine safe: you can share an // instance and execute any method anywhere. type AbstractBackend interface { + EncodingBuilder + TargetInfoGetter // Close the connection to the backend. Close() - // MakeEmptyRows creates an empty collection of encoded rows. - MakeEmptyRows() kv.Rows - // RetryImportDelay returns the duration to sleep when retrying an import RetryImportDelay() time.Duration @@ -142,9 +169,6 @@ type AbstractBackend interface { // performed for this backend. Post-processing includes checksum and analyze. ShouldPostProcess() bool - // NewEncoder creates an encoder of a TiDB table. - NewEncoder(ctx context.Context, tbl table.Table, options *kv.SessionOptions) (kv.Encoder, error) - OpenEngine(ctx context.Context, config *EngineConfig, engineUUID uuid.UUID) error CloseEngine(ctx context.Context, config *EngineConfig, engineUUID uuid.UUID) error @@ -156,24 +180,6 @@ type AbstractBackend interface { CleanupEngine(ctx context.Context, engineUUID uuid.UUID) error - // CheckRequirements performs the check whether the backend satisfies the - // version requirements - CheckRequirements(ctx context.Context, checkCtx *CheckCtx) error - - // FetchRemoteTableModels obtains the models of all tables given the schema - // name. The returned table info does not need to be precise if the encoder, - // is not requiring them, but must at least fill in the following fields for - // TablesFromMeta to succeed: - // - Name - // - State (must be model.StatePublic) - // - ID - // - Columns - // * Name - // * State (must be model.StatePublic) - // * Offset (must be 0, 1, 2, ...) - // - PKIsHandle (true = do not generate _tidb_rowid) - FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) - // FlushEngine ensures all KV pairs written to an open engine has been // synchronized, such that kill-9'ing Lightning afterwards and resuming from // checkpoint can recover the exact same content. diff --git a/br/pkg/lightning/backend/kv/allocator.go b/br/pkg/lightning/backend/kv/allocator.go index 951e2641d8abf..02f46ea8c7e36 100644 --- a/br/pkg/lightning/backend/kv/allocator.go +++ b/br/pkg/lightning/backend/kv/allocator.go @@ -30,7 +30,7 @@ type panickingAllocator struct { ty autoid.AllocatorType } -// NewPanickingAllocator creates a PanickingAllocator shared by all allocation types. +// NewPanickingAllocators creates a PanickingAllocator shared by all allocation types. func NewPanickingAllocators(base int64) autoid.Allocators { sharedBase := &base return autoid.NewAllocators( diff --git a/br/pkg/lightning/backend/local/local.go b/br/pkg/lightning/backend/local/local.go index d5d9e9bea7b5c..56f4cd0987c62 100644 --- a/br/pkg/lightning/backend/local/local.go +++ b/br/pkg/lightning/backend/local/local.go @@ -201,6 +201,139 @@ type Range struct { end []byte } +type encodingBuilder struct { + metrics *metric.Metrics +} + +// NewEncodingBuilder creates an KVEncodingBuilder with local backend implementation. +func NewEncodingBuilder(ctx context.Context) backend.EncodingBuilder { + result := new(encodingBuilder) + if m, ok := metric.FromContext(ctx); ok { + result.metrics = m + } + return result +} + +// NewEncoder creates a KV encoder. +// It implements the `backend.EncodingBuilder` interface. +func (b *encodingBuilder) NewEncoder(ctx context.Context, tbl table.Table, options *kv.SessionOptions) (kv.Encoder, error) { + return kv.NewTableKVEncoder(tbl, options, b.metrics, log.FromContext(ctx)) +} + +// MakeEmptyRows creates an empty KV rows. +// It implements the `backend.EncodingBuilder` interface. +func (b *encodingBuilder) MakeEmptyRows() kv.Rows { + return kv.MakeRowsFromKvPairs(nil) +} + +type targetInfoGetter struct { + tls *common.TLS + targetDBGlue glue.Glue + pdAddr string +} + +// NewTargetInfoGetter creates an TargetInfoGetter with local backend implementation. +func NewTargetInfoGetter(tls *common.TLS, g glue.Glue, pdAddr string) backend.TargetInfoGetter { + return &targetInfoGetter{ + tls: tls, + targetDBGlue: g, + pdAddr: pdAddr, + } +} + +// FetchRemoteTableModels obtains the models of all tables given the schema name. +// It implements the `TargetInfoGetter` interface. +func (g *targetInfoGetter) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { + return tikv.FetchRemoteTableModelsFromTLS(ctx, g.tls, schemaName) +} + +// CheckRequirements performs the check whether the backend satisfies the version requirements. +// It implements the `TargetInfoGetter` interface. +func (g *targetInfoGetter) CheckRequirements(ctx context.Context, checkCtx *backend.CheckCtx) error { + // TODO: support lightning via SQL + db, _ := g.targetDBGlue.GetDB() + versionStr, err := version.FetchVersion(ctx, db) + if err != nil { + return errors.Trace(err) + } + if err := checkTiDBVersion(ctx, versionStr, localMinTiDBVersion, localMaxTiDBVersion); err != nil { + return err + } + if err := tikv.CheckPDVersion(ctx, g.tls, g.pdAddr, localMinPDVersion, localMaxPDVersion); err != nil { + return err + } + if err := tikv.CheckTiKVVersion(ctx, g.tls, g.pdAddr, localMinTiKVVersion, localMaxTiKVVersion); err != nil { + return err + } + + serverInfo := version.ParseServerInfo(versionStr) + return checkTiFlashVersion(ctx, g.targetDBGlue, checkCtx, *serverInfo.ServerVersion) +} + +func checkTiDBVersion(_ context.Context, versionStr string, requiredMinVersion, requiredMaxVersion semver.Version) error { + return version.CheckTiDBVersion(versionStr, requiredMinVersion, requiredMaxVersion) +} + +var tiFlashReplicaQuery = "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TIFLASH_REPLICA WHERE REPLICA_COUNT > 0;" + +type tblName struct { + schema string + name string +} + +type tblNames []tblName + +func (t tblNames) String() string { + var b strings.Builder + b.WriteByte('[') + for i, n := range t { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(common.UniqueTable(n.schema, n.name)) + } + b.WriteByte(']') + return b.String() +} + +// check TiFlash replicas. +// local backend doesn't support TiFlash before tidb v4.0.5 +func checkTiFlashVersion(ctx context.Context, g glue.Glue, checkCtx *backend.CheckCtx, tidbVersion semver.Version) error { + if tidbVersion.Compare(tiFlashMinVersion) >= 0 { + return nil + } + + res, err := g.GetSQLExecutor().QueryStringsWithLog(ctx, tiFlashReplicaQuery, "fetch tiflash replica info", log.FromContext(ctx)) + if err != nil { + return errors.Annotate(err, "fetch tiflash replica info failed") + } + + tiFlashTablesMap := make(map[tblName]struct{}, len(res)) + for _, tblInfo := range res { + name := tblName{schema: tblInfo[0], name: tblInfo[1]} + tiFlashTablesMap[name] = struct{}{} + } + + tiFlashTables := make(tblNames, 0) + for _, dbMeta := range checkCtx.DBMetas { + for _, tblMeta := range dbMeta.Tables { + if len(tblMeta.DataFiles) == 0 { + continue + } + name := tblName{schema: tblMeta.DB, name: tblMeta.Name} + if _, ok := tiFlashTablesMap[name]; ok { + tiFlashTables = append(tiFlashTables, name) + } + } + } + + if len(tiFlashTables) > 0 { + helpInfo := "Please either upgrade TiDB to version >= 4.0.5 or add TiFlash replica after load data." + return errors.Errorf("lightning local backend doesn't support TiFlash in this TiDB version. conflict tables: %s. "+helpInfo, tiFlashTables) + } + return nil +} + type local struct { engines sync.Map // sync version of map[uuid.UUID]*Engine @@ -236,6 +369,9 @@ type local struct { metrics *metric.Metrics writeLimiter StoreWriteLimiter logger log.Logger + + encBuilder backend.EncodingBuilder + targetInfoGetter backend.TargetInfoGetter } func openDuplicateDB(storeDir string) (*pebble.DB, error) { @@ -344,6 +480,8 @@ func NewLocalBackend( bufferPool: membuf.NewPool(membuf.WithAllocator(manual.Allocator{})), writeLimiter: writeLimiter, logger: log.FromContext(ctx), + encBuilder: NewEncodingBuilder(ctx), + targetInfoGetter: NewTargetInfoGetter(tls, g, cfg.TiDB.PdAddr), } if m, ok := metric.FromContext(ctx); ok { local.metrics = m @@ -1652,100 +1790,19 @@ func (local *local) CleanupEngine(ctx context.Context, engineUUID uuid.UUID) err } func (local *local) CheckRequirements(ctx context.Context, checkCtx *backend.CheckCtx) error { - // TODO: support lightning via SQL - db, _ := local.g.GetDB() - versionStr, err := version.FetchVersion(ctx, db) - if err != nil { - return errors.Trace(err) - } - if err := checkTiDBVersion(ctx, versionStr, localMinTiDBVersion, localMaxTiDBVersion); err != nil { - return err - } - if err := tikv.CheckPDVersion(ctx, local.tls, local.pdAddr, localMinPDVersion, localMaxPDVersion); err != nil { - return err - } - if err := tikv.CheckTiKVVersion(ctx, local.tls, local.pdAddr, localMinTiKVVersion, localMaxTiKVVersion); err != nil { - return err - } - - serverInfo := version.ParseServerInfo(versionStr) - return checkTiFlashVersion(ctx, local.g, checkCtx, *serverInfo.ServerVersion) -} - -func checkTiDBVersion(_ context.Context, versionStr string, requiredMinVersion, requiredMaxVersion semver.Version) error { - return version.CheckTiDBVersion(versionStr, requiredMinVersion, requiredMaxVersion) -} - -var tiFlashReplicaQuery = "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TIFLASH_REPLICA WHERE REPLICA_COUNT > 0;" - -type tblName struct { - schema string - name string -} - -type tblNames []tblName - -func (t tblNames) String() string { - var b strings.Builder - b.WriteByte('[') - for i, n := range t { - if i > 0 { - b.WriteString(", ") - } - b.WriteString(common.UniqueTable(n.schema, n.name)) - } - b.WriteByte(']') - return b.String() -} - -// check TiFlash replicas. -// local backend doesn't support TiFlash before tidb v4.0.5 -func checkTiFlashVersion(ctx context.Context, g glue.Glue, checkCtx *backend.CheckCtx, tidbVersion semver.Version) error { - if tidbVersion.Compare(tiFlashMinVersion) >= 0 { - return nil - } - - res, err := g.GetSQLExecutor().QueryStringsWithLog(ctx, tiFlashReplicaQuery, "fetch tiflash replica info", log.FromContext(ctx)) - if err != nil { - return errors.Annotate(err, "fetch tiflash replica info failed") - } - - tiFlashTablesMap := make(map[tblName]struct{}, len(res)) - for _, tblInfo := range res { - name := tblName{schema: tblInfo[0], name: tblInfo[1]} - tiFlashTablesMap[name] = struct{}{} - } - - tiFlashTables := make(tblNames, 0) - for _, dbMeta := range checkCtx.DBMetas { - for _, tblMeta := range dbMeta.Tables { - if len(tblMeta.DataFiles) == 0 { - continue - } - name := tblName{schema: tblMeta.DB, name: tblMeta.Name} - if _, ok := tiFlashTablesMap[name]; ok { - tiFlashTables = append(tiFlashTables, name) - } - } - } - - if len(tiFlashTables) > 0 { - helpInfo := "Please either upgrade TiDB to version >= 4.0.5 or add TiFlash replica after load data." - return errors.Errorf("lightning local backend doesn't support TiFlash in this TiDB version. conflict tables: %s. "+helpInfo, tiFlashTables) - } - return nil + return local.targetInfoGetter.CheckRequirements(ctx, checkCtx) } func (local *local) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { - return tikv.FetchRemoteTableModelsFromTLS(ctx, local.tls, schemaName) + return local.targetInfoGetter.FetchRemoteTableModels(ctx, schemaName) } func (local *local) MakeEmptyRows() kv.Rows { - return kv.MakeRowsFromKvPairs(nil) + return local.encBuilder.MakeEmptyRows() } func (local *local) NewEncoder(ctx context.Context, tbl table.Table, options *kv.SessionOptions) (kv.Encoder, error) { - return kv.NewTableKVEncoder(tbl, options, local.metrics, log.FromContext(ctx)) + return local.encBuilder.NewEncoder(ctx, tbl, options) } func engineSSTDir(storeDir string, engineUUID uuid.UUID) string { diff --git a/br/pkg/lightning/backend/local/localhelper.go b/br/pkg/lightning/backend/local/localhelper.go index ae736eaaabd37..eae62b813e531 100644 --- a/br/pkg/lightning/backend/local/localhelper.go +++ b/br/pkg/lightning/backend/local/localhelper.go @@ -497,7 +497,7 @@ func (local *local) checkRegionScatteredOrReScatter(ctx context.Context, regionI case pdpb.OperatorStatus_SUCCESS: return true, nil default: - log.FromContext(ctx).Warn("scatter-region operator status is abnormal, will scatter region again", + log.FromContext(ctx).Debug("scatter-region operator status is abnormal, will scatter region again", logutil.Region(regionInfo.Region), zap.Stringer("status", resp.GetStatus())) return false, local.splitCli.ScatterRegion(ctx, regionInfo) } diff --git a/br/pkg/lightning/backend/tidb/tidb.go b/br/pkg/lightning/backend/tidb/tidb.go index 1a9d100d39bd5..826a14bfeb4a9 100644 --- a/br/pkg/lightning/backend/tidb/tidb.go +++ b/br/pkg/lightning/backend/tidb/tidb.go @@ -90,10 +90,163 @@ type tidbEncoder struct { columnCnt int } +type encodingBuilder struct{} + +// NewEncodingBuilder creates an EncodingBuilder with TiDB backend implementation. +func NewEncodingBuilder() backend.EncodingBuilder { + return new(encodingBuilder) +} + +// NewEncoder creates a KV encoder. +// It implements the `backend.EncodingBuilder` interface. +func (b *encodingBuilder) NewEncoder(ctx context.Context, tbl table.Table, options *kv.SessionOptions) (kv.Encoder, error) { + se := kv.NewSession(options, log.FromContext(ctx)) + if options.SQLMode.HasStrictMode() { + se.GetSessionVars().SkipUTF8Check = false + se.GetSessionVars().SkipASCIICheck = false + } + + return &tidbEncoder{mode: options.SQLMode, tbl: tbl, se: se}, nil +} + +// MakeEmptyRows creates an empty KV rows. +// It implements the `backend.EncodingBuilder` interface. +func (b *encodingBuilder) MakeEmptyRows() kv.Rows { + return tidbRows(nil) +} + +type targetInfoGetter struct { + db *sql.DB +} + +// NewTargetInfoGetter creates an TargetInfoGetter with TiDB backend implementation. +func NewTargetInfoGetter(db *sql.DB) backend.TargetInfoGetter { + return &targetInfoGetter{ + db: db, + } +} + +// FetchRemoteTableModels obtains the models of all tables given the schema name. +// It implements the `backend.TargetInfoGetter` interface. +// TODO: refactor +func (b *targetInfoGetter) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { + var err error + tables := []*model.TableInfo{} + s := common.SQLWithRetry{ + DB: b.db, + Logger: log.FromContext(ctx), + } + + err = s.Transact(ctx, "fetch table columns", func(c context.Context, tx *sql.Tx) error { + var versionStr string + if versionStr, err = version.FetchVersion(ctx, tx); err != nil { + return err + } + serverInfo := version.ParseServerInfo(versionStr) + + rows, e := tx.Query(` + SELECT table_name, column_name, column_type, generation_expression, extra + FROM information_schema.columns + WHERE table_schema = ? + ORDER BY table_name, ordinal_position; + `, schemaName) + if e != nil { + return e + } + defer rows.Close() + + var ( + curTableName string + curColOffset int + curTable *model.TableInfo + ) + for rows.Next() { + var tableName, columnName, columnType, generationExpr, columnExtra string + if e := rows.Scan(&tableName, &columnName, &columnType, &generationExpr, &columnExtra); e != nil { + return e + } + if tableName != curTableName { + curTable = &model.TableInfo{ + Name: model.NewCIStr(tableName), + State: model.StatePublic, + PKIsHandle: true, + } + tables = append(tables, curTable) + curTableName = tableName + curColOffset = 0 + } + + // see: https://github.com/pingcap/parser/blob/3b2fb4b41d73710bc6c4e1f4e8679d8be6a4863e/types/field_type.go#L185-L191 + var flag uint + if strings.HasSuffix(columnType, "unsigned") { + flag |= mysql.UnsignedFlag + } + if strings.Contains(columnExtra, "auto_increment") { + flag |= mysql.AutoIncrementFlag + } + + ft := types.FieldType{} + ft.SetFlag(flag) + curTable.Columns = append(curTable.Columns, &model.ColumnInfo{ + Name: model.NewCIStr(columnName), + Offset: curColOffset, + State: model.StatePublic, + FieldType: ft, + GeneratedExprString: generationExpr, + }) + curColOffset++ + } + if err := rows.Err(); err != nil { + return err + } + // shard_row_id/auto random is only available after tidb v4.0.0 + // `show table next_row_id` is also not available before tidb v4.0.0 + if serverInfo.ServerType != version.ServerTypeTiDB || serverInfo.ServerVersion.Major < 4 { + return nil + } + + // init auto id column for each table + for _, tbl := range tables { + tblName := common.UniqueTable(schemaName, tbl.Name.O) + autoIDInfos, err := FetchTableAutoIDInfos(ctx, tx, tblName) + if err != nil { + return errors.Trace(err) + } + for _, info := range autoIDInfos { + for _, col := range tbl.Columns { + if col.Name.O == info.Column { + switch info.Type { + case "AUTO_INCREMENT": + col.AddFlag(mysql.AutoIncrementFlag) + case "AUTO_RANDOM": + col.AddFlag(mysql.PriKeyFlag) + tbl.PKIsHandle = true + // set a stub here, since we don't really need the real value + tbl.AutoRandomBits = 1 + } + } + } + } + + } + return nil + }) + return tables, err +} + +// CheckRequirements performs the check whether the backend satisfies the version requirements. +// It implements the `backend.TargetInfoGetter` interface. +func (b *targetInfoGetter) CheckRequirements(ctx context.Context, _ *backend.CheckCtx) error { + log.FromContext(ctx).Info("skipping check requirements for tidb backend") + return nil +} + type tidbBackend struct { - db *sql.DB - onDuplicate string - errorMgr *errormanager.ErrorManager + db *sql.DB + onDuplicate string + errorMgr *errormanager.ErrorManager + encBuilder backend.EncodingBuilder + targetInfoGetter backend.TargetInfoGetter } // NewTiDBBackend creates a new TiDB backend using the given database. @@ -107,7 +260,13 @@ func NewTiDBBackend(ctx context.Context, db *sql.DB, onDuplicate string, errorMg log.FromContext(ctx).Warn("unsupported action on duplicate, overwrite with `replace`") onDuplicate = config.ReplaceOnDup } - return backend.MakeBackend(&tidbBackend{db: db, onDuplicate: onDuplicate, errorMgr: errorMgr}) + return backend.MakeBackend(&tidbBackend{ + db: db, + onDuplicate: onDuplicate, + errorMgr: errorMgr, + encBuilder: NewEncodingBuilder(), + targetInfoGetter: NewTargetInfoGetter(db), + }) } func (row tidbRow) Size() uint64 { @@ -375,7 +534,7 @@ func (be *tidbBackend) Close() { } func (be *tidbBackend) MakeEmptyRows() kv.Rows { - return tidbRows(nil) + return be.encBuilder.MakeEmptyRows() } func (be *tidbBackend) RetryImportDelay() time.Duration { @@ -394,18 +553,11 @@ func (be *tidbBackend) ShouldPostProcess() bool { } func (be *tidbBackend) CheckRequirements(ctx context.Context, _ *backend.CheckCtx) error { - log.FromContext(ctx).Info("skipping check requirements for tidb backend") - return nil + return be.targetInfoGetter.CheckRequirements(ctx, nil) } func (be *tidbBackend) NewEncoder(ctx context.Context, tbl table.Table, options *kv.SessionOptions) (kv.Encoder, error) { - se := kv.NewSession(options, log.FromContext(ctx)) - if options.SQLMode.HasStrictMode() { - se.GetSessionVars().SkipUTF8Check = false - se.GetSessionVars().SkipASCIICheck = false - } - - return &tidbEncoder{mode: options.SQLMode, tbl: tbl, se: se}, nil + return be.encBuilder.NewEncoder(ctx, tbl, options) } func (be *tidbBackend) OpenEngine(context.Context, *backend.EngineConfig, uuid.UUID) error { @@ -583,108 +735,8 @@ func (be *tidbBackend) execStmts(ctx context.Context, stmtTasks []stmtTask, tabl return nil } -//nolint:nakedret // TODO: refactor -func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName string) (tables []*model.TableInfo, err error) { - s := common.SQLWithRetry{ - DB: be.db, - Logger: log.FromContext(ctx), - } - - err = s.Transact(ctx, "fetch table columns", func(c context.Context, tx *sql.Tx) error { - var versionStr string - if versionStr, err = version.FetchVersion(ctx, tx); err != nil { - return err - } - serverInfo := version.ParseServerInfo(versionStr) - - rows, e := tx.Query(` - SELECT table_name, column_name, column_type, generation_expression, extra - FROM information_schema.columns - WHERE table_schema = ? - ORDER BY table_name, ordinal_position; - `, schemaName) - if e != nil { - return e - } - defer rows.Close() - - var ( - curTableName string - curColOffset int - curTable *model.TableInfo - ) - for rows.Next() { - var tableName, columnName, columnType, generationExpr, columnExtra string - if e := rows.Scan(&tableName, &columnName, &columnType, &generationExpr, &columnExtra); e != nil { - return e - } - if tableName != curTableName { - curTable = &model.TableInfo{ - Name: model.NewCIStr(tableName), - State: model.StatePublic, - PKIsHandle: true, - } - tables = append(tables, curTable) - curTableName = tableName - curColOffset = 0 - } - - // see: https://github.com/pingcap/parser/blob/3b2fb4b41d73710bc6c4e1f4e8679d8be6a4863e/types/field_type.go#L185-L191 - var flag uint - if strings.HasSuffix(columnType, "unsigned") { - flag |= mysql.UnsignedFlag - } - if strings.Contains(columnExtra, "auto_increment") { - flag |= mysql.AutoIncrementFlag - } - - ft := types.FieldType{} - ft.SetFlag(flag) - curTable.Columns = append(curTable.Columns, &model.ColumnInfo{ - Name: model.NewCIStr(columnName), - Offset: curColOffset, - State: model.StatePublic, - FieldType: ft, - GeneratedExprString: generationExpr, - }) - curColOffset++ - } - if err := rows.Err(); err != nil { - return err - } - // shard_row_id/auto random is only available after tidb v4.0.0 - // `show table next_row_id` is also not available before tidb v4.0.0 - if serverInfo.ServerType != version.ServerTypeTiDB || serverInfo.ServerVersion.Major < 4 { - return nil - } - - // init auto id column for each table - for _, tbl := range tables { - tblName := common.UniqueTable(schemaName, tbl.Name.O) - autoIDInfos, err := FetchTableAutoIDInfos(ctx, tx, tblName) - if err != nil { - return errors.Trace(err) - } - for _, info := range autoIDInfos { - for _, col := range tbl.Columns { - if col.Name.O == info.Column { - switch info.Type { - case "AUTO_INCREMENT": - col.AddFlag(mysql.AutoIncrementFlag) - case "AUTO_RANDOM": - col.AddFlag(mysql.PriKeyFlag) - tbl.PKIsHandle = true - // set a stub here, since we don't really need the real value - tbl.AutoRandomBits = 1 - } - } - } - } - - } - return nil - }) - return +func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { + return be.targetInfoGetter.FetchRemoteTableModels(ctx, schemaName) } func (be *tidbBackend) EngineFileSizes() []backend.EngineFileSize { diff --git a/br/pkg/lightning/checkpoints/tidb.go b/br/pkg/lightning/checkpoints/tidb.go index d68bd68fd1595..ae0b01fea7680 100644 --- a/br/pkg/lightning/checkpoints/tidb.go +++ b/br/pkg/lightning/checkpoints/tidb.go @@ -19,6 +19,7 @@ import ( ) type TidbDBInfo struct { + ID int64 Name string Tables map[string]*TidbTableInfo } diff --git a/br/pkg/lightning/common/util.go b/br/pkg/lightning/common/util.go index 67a26fb3ab411..4d9465eae1868 100644 --- a/br/pkg/lightning/common/util.go +++ b/br/pkg/lightning/common/util.go @@ -371,6 +371,11 @@ func TableHasAutoRowID(info *model.TableInfo) bool { return !info.PKIsHandle && !info.IsCommonHandle } +// TableHasAutoID return whether table has auto generated id. +func TableHasAutoID(info *model.TableInfo) bool { + return TableHasAutoRowID(info) || info.GetAutoIncrementColInfo() != nil || info.ContainsAutoRandomBits() +} + // StringSliceEqual checks if two string slices are equal. func StringSliceEqual(a, b []string) bool { if len(a) != len(b) { diff --git a/br/pkg/lightning/lightning.go b/br/pkg/lightning/lightning.go index 0b48b5b4e3e81..4138623830bba 100644 --- a/br/pkg/lightning/lightning.go +++ b/br/pkg/lightning/lightning.go @@ -664,7 +664,8 @@ func (l *Lightning) handlePostTask(w http.ResponseWriter, req *http.Request) { writeJSONError(w, http.StatusBadRequest, "cannot read request", err) return } - log.L().Info("received task config", zap.ByteString("content", data)) + filteredData := utils.HideSensitive(string(data)) + log.L().Info("received task config", zap.String("content", filteredData)) cfg := config.NewConfig() if err = cfg.LoadFromGlobal(l.globalCfg); err != nil { diff --git a/br/pkg/lightning/log/log.go b/br/pkg/lightning/log/log.go index 2dab04f925182..d3ce1fcd4ff6c 100644 --- a/br/pkg/lightning/log/log.go +++ b/br/pkg/lightning/log/log.go @@ -47,6 +47,7 @@ type Config struct { FileMaxBackups int `toml:"max-backups" json:"max-backups"` } +// Adjust adjusts some fields in the config to a proper value. func (cfg *Config) Adjust() { if len(cfg.Level) == 0 { cfg.Level = defaultLogLevel @@ -75,7 +76,7 @@ var ( ) // InitLogger initializes Lightning's and also the TiDB library's loggers. -func InitLogger(cfg *Config, tidbLoglevel string) error { +func InitLogger(cfg *Config, _ string) error { tidbLogCfg := logutil.LogConfig{} // Disable annoying TiDB Log. // TODO: some error logs outputs randomly, we need to fix them in TiDB. diff --git a/br/pkg/lightning/mydump/loader.go b/br/pkg/lightning/mydump/loader.go index 40091c61b2d03..a16ad88de76c2 100644 --- a/br/pkg/lightning/mydump/loader.go +++ b/br/pkg/lightning/mydump/loader.go @@ -38,6 +38,13 @@ type MDDatabaseMeta struct { charSet string } +// NewMDDatabaseMeta creates an Mydumper database meta with specified character set. +func NewMDDatabaseMeta(charSet string) *MDDatabaseMeta { + return &MDDatabaseMeta{ + charSet: charSet, + } +} + func (m *MDDatabaseMeta) GetSchema(ctx context.Context, store storage.ExternalStorage) string { if m.SchemaFile.FileMeta.Path != "" { schema, err := ExportStatement(ctx, store, m.SchemaFile, m.charSet) @@ -73,6 +80,13 @@ type SourceFileMeta struct { FileSize int64 } +// NewMDTableMeta creates an Mydumper table meta with specified character set. +func NewMDTableMeta(charSet string) *MDTableMeta { + return &MDTableMeta{ + charSet: charSet, + } +} + func (m *MDTableMeta) GetSchema(ctx context.Context, store storage.ExternalStorage) (string, error) { schema, err := ExportStatement(ctx, store, m.SchemaFile, m.charSet) if err != nil { diff --git a/br/pkg/lightning/mydump/parquet_parser.go b/br/pkg/lightning/mydump/parquet_parser.go index 50ae2d9d63960..0f310087d31fc 100644 --- a/br/pkg/lightning/mydump/parquet_parser.go +++ b/br/pkg/lightning/mydump/parquet_parser.go @@ -403,6 +403,12 @@ func getDatumLen(v reflect.Value) int { // See: https://github.com/apache/parquet-format/blob/master/LogicalTypes.md func setDatumValue(d *types.Datum, v reflect.Value, meta *parquet.SchemaElement, logger log.Logger) error { switch v.Kind() { + case reflect.Bool: + if v.Bool() { + d.SetUint64(1) + } else { + d.SetUint64(0) + } case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: d.SetUint64(v.Uint()) case reflect.Int8, reflect.Int16: diff --git a/br/pkg/lightning/mydump/parquet_parser_test.go b/br/pkg/lightning/mydump/parquet_parser_test.go index 0231c2b4e1e6d..ae9a8151cd1be 100644 --- a/br/pkg/lightning/mydump/parquet_parser_test.go +++ b/br/pkg/lightning/mydump/parquet_parser_test.go @@ -196,6 +196,36 @@ func TestParquetVariousTypes(t *testing.T) { assert.Equal(t, val.GetValue(), reader.lastRow.Row[i].GetValue()) } } + + type TestBool struct { + BoolVal bool `parquet:"name=bool_val, type=BOOLEAN"` + } + + fileName = "test.bool.parquet" + testPath = filepath.Join(dir, fileName) + pf, err = local.NewLocalFileWriter(testPath) + require.NoError(t, err) + writer, err = writer2.NewParquetWriter(pf, new(TestBool), 2) + require.NoError(t, err) + require.NoError(t, writer.Write(&TestBool{false})) + require.NoError(t, writer.Write(&TestBool{true})) + require.NoError(t, writer.WriteStop()) + require.NoError(t, pf.Close()) + + r, err = store.Open(context.TODO(), fileName) + require.NoError(t, err) + reader, err = NewParquetParser(context.TODO(), store, r, fileName) + require.NoError(t, err) + defer reader.Close() + + // because we always reuse the datums in reader.lastRow.Row, so we can't directly + // compare will `DeepEqual` here + assert.NoError(t, reader.ReadRow()) + assert.Equal(t, types.KindUint64, reader.lastRow.Row[0].Kind()) + assert.Equal(t, uint64(0), reader.lastRow.Row[0].GetValue()) + assert.NoError(t, reader.ReadRow()) + assert.Equal(t, types.KindUint64, reader.lastRow.Row[0].Kind()) + assert.Equal(t, uint64(1), reader.lastRow.Row[0].GetValue()) } func TestParquetAurora(t *testing.T) { diff --git a/br/pkg/lightning/restore/BUILD.bazel b/br/pkg/lightning/restore/BUILD.bazel index 80befee3774fd..afb763512059c 100644 --- a/br/pkg/lightning/restore/BUILD.bazel +++ b/br/pkg/lightning/restore/BUILD.bazel @@ -6,6 +6,7 @@ go_library( "check_info.go", "check_template.go", "checksum.go", + "get_pre_info.go", "meta_manager.go", "restore.go", "table_restore.go", @@ -38,7 +39,7 @@ go_library( "//br/pkg/utils", "//br/pkg/version", "//br/pkg/version/build", - "//config", + "//ddl", "//kv", "//meta/autoid", "//parser", @@ -46,6 +47,7 @@ go_library( "//parser/format", "//parser/model", "//parser/mysql", + "//planner/core", "//store/driver", "//store/pdtypes", "//table", @@ -53,6 +55,7 @@ go_library( "//types", "//util/collate", "//util/mathutil", + "//util/mock", "@com_github_coreos_go_semver//semver", "@com_github_docker_go_units//:go-units", "@com_github_google_uuid//:uuid", @@ -80,6 +83,7 @@ go_test( "check_info_test.go", "checksum_test.go", "chunk_restore_test.go", + "get_pre_info_test.go", "meta_manager_test.go", "restore_schema_test.go", "restore_test.go", @@ -100,6 +104,7 @@ go_test( "//br/pkg/lightning/log", "//br/pkg/lightning/metric", "//br/pkg/lightning/mydump", + "//br/pkg/lightning/restore/mock", "//br/pkg/lightning/verification", "//br/pkg/lightning/web", "//br/pkg/lightning/worker", @@ -109,10 +114,13 @@ go_test( "//ddl", "//errno", "//kv", + "//meta", + "//meta/autoid", "//parser", "//parser/ast", "//parser/model", "//parser/mysql", + "//store/mockstore", "//store/pdtypes", "//table/tables", "//types", diff --git a/br/pkg/lightning/restore/check_info.go b/br/pkg/lightning/restore/check_info.go index 2be105a157fac..6927a48d09488 100644 --- a/br/pkg/lightning/restore/check_info.go +++ b/br/pkg/lightning/restore/check_info.go @@ -15,11 +15,8 @@ package restore import ( - "bytes" "context" - "database/sql" "fmt" - "io" "path/filepath" "reflect" "strconv" @@ -28,24 +25,18 @@ import ( "github.com/docker/go-units" "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/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/errormanager" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/mydump" - "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/store/pdtypes" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mathutil" "go.uber.org/zap" @@ -76,21 +67,20 @@ func (rc *Controller) isSourceInLocal() bool { } func (rc *Controller) getReplicaCount(ctx context.Context) (uint64, error) { - result := &pdtypes.ReplicationConfig{} - err := rc.tls.WithHost(rc.cfg.TiDB.PdAddr).GetJSON(ctx, pdReplicate, &result) + replConfig, err := rc.preInfoGetter.GetReplicationConfig(ctx) if err != nil { return 0, errors.Trace(err) } - return result.MaxReplicas, nil + return replConfig.MaxReplicas, nil } func (rc *Controller) getClusterAvail(ctx context.Context) (uint64, error) { - result := &pdtypes.StoresInfo{} - if err := rc.tls.WithHost(rc.cfg.TiDB.PdAddr).GetJSON(ctx, pdStores, result); err != nil { + storeInfo, err := rc.preInfoGetter.GetStorageInfo(ctx) + if err != nil { return 0, errors.Trace(err) } clusterAvail := uint64(0) - for _, store := range result.Stores { + for _, store := range storeInfo.Stores { clusterAvail += uint64(store.Status.Available) } return clusterAvail, nil @@ -171,10 +161,8 @@ func (rc *Controller) ClusterIsAvailable(ctx context.Context) { defer func() { rc.checkTemplate.Collect(Critical, passed, message) }() - checkCtx := &backend.CheckCtx{ - DBMetas: rc.dbMetas, - } - if err := rc.backend.CheckRequirements(ctx, checkCtx); err != nil { + checkCtx := WithPreInfoGetterDBMetas(ctx, rc.dbMetas) + if err := rc.preInfoGetter.CheckVersionRequirements(checkCtx); err != nil { err = common.NormalizeError(err) passed = false message = fmt.Sprintf("cluster available check failed: %s", err.Error()) @@ -196,22 +184,24 @@ func (rc *Controller) checkEmptyRegion(ctx context.Context) error { defer func() { rc.checkTemplate.Collect(Critical, passed, message) }() - storeInfo := &pdtypes.StoresInfo{} - err := rc.tls.WithHost(rc.cfg.TiDB.PdAddr).GetJSON(ctx, pdStores, storeInfo) + dbInfos, err := rc.preInfoGetter.GetAllTableStructures(ctx) + if err != nil { + return errors.Trace(err) + } + storeInfo, err := rc.preInfoGetter.GetStorageInfo(ctx) if err != nil { return errors.Trace(err) } if len(storeInfo.Stores) <= 1 { return nil } - - var result pdtypes.RegionsInfo - if err := rc.tls.WithHost(rc.cfg.TiDB.PdAddr).GetJSON(ctx, pdEmptyRegions, &result); err != nil { + emptyRegionsInfo, err := rc.preInfoGetter.GetEmptyRegionsInfo(ctx) + if err != nil { return errors.Trace(err) } regions := make(map[uint64]int) stores := make(map[uint64]*pdtypes.StoreInfo) - for _, region := range result.Regions { + for _, region := range emptyRegionsInfo.Regions { for _, peer := range region.Peers { regions[peer.StoreId]++ } @@ -221,7 +211,7 @@ func (rc *Controller) checkEmptyRegion(ctx context.Context) error { } tableCount := 0 for _, db := range rc.dbMetas { - info, ok := rc.dbInfos[db.Name] + info, ok := dbInfos[db.Name] if !ok { continue } @@ -273,13 +263,12 @@ func (rc *Controller) checkRegionDistribution(ctx context.Context) error { rc.checkTemplate.Collect(Critical, passed, message) }() - result := &pdtypes.StoresInfo{} - err := rc.tls.WithHost(rc.cfg.TiDB.PdAddr).GetJSON(ctx, pdStores, result) + storesInfo, err := rc.preInfoGetter.GetStorageInfo(ctx) if err != nil { return errors.Trace(err) } - stores := make([]*pdtypes.StoreInfo, 0, len(result.Stores)) - for _, store := range result.Stores { + stores := make([]*pdtypes.StoreInfo, 0, len(storesInfo.Stores)) + for _, store := range storesInfo.Stores { if metapb.StoreState(metapb.StoreState_value[store.Store.StateName]) != metapb.StoreState_Up { continue } @@ -296,9 +285,14 @@ func (rc *Controller) checkRegionDistribution(ctx context.Context) error { }) minStore := stores[0] maxStore := stores[len(stores)-1] + + dbInfos, err := rc.preInfoGetter.GetAllTableStructures(ctx) + if err != nil { + return errors.Trace(err) + } tableCount := 0 for _, db := range rc.dbMetas { - info, ok := rc.dbInfos[db.Name] + info, ok := dbInfos[db.Name] if !ok { continue } @@ -396,62 +390,12 @@ func (rc *Controller) HasLargeCSV(dbMetas []*mydump.MDDatabaseMeta) { } } -func (rc *Controller) estimateSourceData(ctx context.Context) (int64, error) { - sourceSize := int64(0) - originSource := int64(0) - bigTableCount := 0 - tableCount := 0 - unSortedTableCount := 0 - errMgr := errormanager.New(nil, rc.cfg, log.FromContext(ctx)) - for _, db := range rc.dbMetas { - info, ok := rc.dbInfos[db.Name] - if !ok { - continue - } - for _, tbl := range db.Tables { - originSource += tbl.TotalSize - tableInfo, ok := info.Tables[tbl.Name] - if ok { - // Do not sample small table because there may a large number of small table and it will take a long - // time to sample data for all of them. - if rc.cfg.TikvImporter.Backend == config.BackendTiDB || tbl.TotalSize < int64(config.SplitRegionSize) { - sourceSize += tbl.TotalSize - tbl.IndexRatio = 1.0 - tbl.IsRowOrdered = false - } else { - if err := rc.sampleDataFromTable(ctx, db.Name, tbl, tableInfo.Core, errMgr); err != nil { - return sourceSize, errors.Trace(err) - } - - if tbl.IndexRatio > 0 { - sourceSize += int64(float64(tbl.TotalSize) * tbl.IndexRatio) - } else { - // if sample data failed due to max-error, fallback to use source size - sourceSize += tbl.TotalSize - } - - if tbl.TotalSize > int64(config.DefaultBatchSize)*2 { - bigTableCount += 1 - if !tbl.IsRowOrdered { - unSortedTableCount += 1 - } - } - } - tableCount += 1 - } - } - } - - if rc.status != nil { - rc.status.TotalFileSize.Store(originSource) - } - // Do not import with too large concurrency because these data may be all unsorted. - if bigTableCount > 0 && unSortedTableCount > 0 { - if rc.cfg.App.TableConcurrency > rc.cfg.App.IndexConcurrency { - rc.cfg.App.TableConcurrency = rc.cfg.App.IndexConcurrency - } +func (rc *Controller) estimateSourceData(ctx context.Context) (int64, int64, bool, error) { + result, err := rc.preInfoGetter.EstimateSourceDataSize(ctx) + if err != nil { + return 0, 0, false, errors.Trace(err) } - return sourceSize, nil + return result.SizeWithIndex, result.SizeWithoutIndex, result.HasUnsortedBigTables, nil } // localResource checks the local node has enough resources for this import when local backend enabled; @@ -540,7 +484,8 @@ func (rc *Controller) CheckpointIsValid(ctx context.Context, tableInfo *mydump.M return msgs, false } - dbInfo, ok := rc.dbInfos[tableInfo.DB] + dbInfos, _ := rc.preInfoGetter.GetAllTableStructures(ctx) + dbInfo, ok := dbInfos[tableInfo.DB] if ok { t, ok := dbInfo.Tables[tableInfo.Name] if ok { @@ -573,7 +518,7 @@ func (rc *Controller) CheckpointIsValid(ctx context.Context, tableInfo *mydump.M log.FromContext(ctx).Debug("no valid checkpoint detected", zap.String("table", uniqueName)) return nil, false } - info := rc.dbInfos[tableInfo.DB].Tables[tableInfo.Name] + info := dbInfos[tableInfo.DB].Tables[tableInfo.Name] if info != nil { permFromTiDB, err := parseColumnPermutations(info.Core, columns, nil, log.FromContext(ctx)) if err != nil { @@ -595,48 +540,15 @@ func hasDefault(col *model.ColumnInfo) bool { } func (rc *Controller) readFirstRow(ctx context.Context, dataFileMeta mydump.SourceFileMeta) (cols []string, row []types.Datum, err error) { - var reader storage.ReadSeekCloser - if dataFileMeta.Type == mydump.SourceTypeParquet { - reader, err = mydump.OpenParquetReader(ctx, rc.store, dataFileMeta.Path, dataFileMeta.FileSize) - } else { - reader, err = rc.store.Open(ctx, dataFileMeta.Path) - } + cols, rows, err := rc.preInfoGetter.ReadFirstNRowsByFileMeta(ctx, dataFileMeta, 1) if err != nil { - return nil, nil, errors.Trace(err) + return nil, nil, err } - - var parser mydump.Parser - blockBufSize := int64(rc.cfg.Mydumper.ReadBlockSize) - switch dataFileMeta.Type { - case mydump.SourceTypeCSV: - hasHeader := rc.cfg.Mydumper.CSV.Header - // Create a utf8mb4 convertor to encode and decode data with the charset of CSV files. - charsetConvertor, err := mydump.NewCharsetConvertor(rc.cfg.Mydumper.DataCharacterSet, rc.cfg.Mydumper.DataInvalidCharReplace) - if err != nil { - return nil, nil, errors.Trace(err) - } - parser, err = mydump.NewCSVParser(ctx, &rc.cfg.Mydumper.CSV, reader, blockBufSize, rc.ioWorkers, hasHeader, charsetConvertor) - if err != nil { - return nil, nil, errors.Trace(err) - } - case mydump.SourceTypeSQL: - parser = mydump.NewChunkParser(ctx, rc.cfg.TiDB.SQLMode, reader, blockBufSize, rc.ioWorkers) - case mydump.SourceTypeParquet: - parser, err = mydump.NewParquetParser(ctx, rc.store, reader, dataFileMeta.Path) - if err != nil { - return nil, nil, errors.Trace(err) - } - default: - panic(fmt.Sprintf("unknown file type '%s'", dataFileMeta.Type)) - } - //nolint: errcheck - defer parser.Close() - - err = parser.ReadRow() - if err != nil && errors.Cause(err) != io.EOF { - return nil, nil, errors.Trace(err) + if len(rows) > 0 { + return cols, rows[0], nil + } else { + return cols, []types.Datum{}, nil } - return parser.Columns(), parser.LastRow().Row, nil } // SchemaIsValid checks the import file and cluster schema is match. @@ -647,7 +559,11 @@ func (rc *Controller) SchemaIsValid(ctx context.Context, tableInfo *mydump.MDTab } msgs := make([]string, 0) - info, ok := rc.dbInfos[tableInfo.DB].Tables[tableInfo.Name] + dbInfos, err := rc.preInfoGetter.GetAllTableStructures(ctx) + if err != nil { + return nil, errors.Trace(err) + } + info, ok := dbInfos[tableInfo.DB].Tables[tableInfo.Name] if !ok { msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` doesn't exists,"+ "please give a schema file in source dir or create table manually", tableInfo.DB, tableInfo.Name)) @@ -770,6 +686,10 @@ func (rc *Controller) checkCSVHeader(ctx context.Context, dbMetas []*mydump.MDDa csvCount int hasUniqueIdx bool ) + dbInfos, err := rc.preInfoGetter.GetAllTableStructures(ctx) + if err != nil { + return errors.Trace(err) + } // only check one table source files for better performance. The checked table is chosen based on following two factor: // 1. contains at least 1 csv source file, 2 is preferable // 2. table schema contains primary key or unique key @@ -794,7 +714,7 @@ outer: continue } - info := rc.dbInfos[tblMeta.DB].Tables[tblMeta.Name] + info := dbInfos[tblMeta.DB].Tables[tblMeta.Name] for _, idx := range info.Core.Indices { if idx.Primary || idx.Unique { tableHasUniqueIdx = true @@ -855,7 +775,7 @@ outer: // check if some fields are unique and not ignored // if at least one field appears in a unique key, we can sure there is something wrong, // they should be either the header line or the data is duplicated. - tableInfo := rc.dbInfos[tableMeta.DB].Tables[tableMeta.Name] + tableInfo := dbInfos[tableMeta.DB].Tables[tableMeta.Name] tableFields := make(map[string]struct{}) uniqueIdxFields := make(map[string]struct{}) ignoreColumns, err := rc.cfg.Mydumper.IgnoreColumns.GetIgnoreColumns(tableMeta.DB, tableMeta.Name, rc.cfg.Mydumper.CaseSensitive) @@ -936,166 +856,10 @@ func checkFieldCompatibility( return true } -func (rc *Controller) sampleDataFromTable( - ctx context.Context, - dbName string, - tableMeta *mydump.MDTableMeta, - tableInfo *model.TableInfo, - errMgr *errormanager.ErrorManager, -) error { - if len(tableMeta.DataFiles) == 0 { - return nil - } - sampleFile := tableMeta.DataFiles[0].FileMeta - var reader storage.ReadSeekCloser - var err error - if sampleFile.Type == mydump.SourceTypeParquet { - reader, err = mydump.OpenParquetReader(ctx, rc.store, sampleFile.Path, sampleFile.FileSize) - } else { - reader, err = rc.store.Open(ctx, sampleFile.Path) - } - if err != nil { - return errors.Trace(err) - } - idAlloc := kv.NewPanickingAllocators(0) - tbl, err := tables.TableFromMeta(idAlloc, tableInfo) - if err != nil { - return errors.Trace(err) - } - kvEncoder, err := rc.backend.NewEncoder(ctx, tbl, &kv.SessionOptions{ - SQLMode: rc.cfg.TiDB.SQLMode, - Timestamp: 0, - SysVars: rc.sysVars, - AutoRandomSeed: 0, - }) - if err != nil { - return errors.Trace(err) - } - blockBufSize := int64(rc.cfg.Mydumper.ReadBlockSize) - - var parser mydump.Parser - switch tableMeta.DataFiles[0].FileMeta.Type { - case mydump.SourceTypeCSV: - hasHeader := rc.cfg.Mydumper.CSV.Header - // Create a utf8mb4 convertor to encode and decode data with the charset of CSV files. - charsetConvertor, err := mydump.NewCharsetConvertor(rc.cfg.Mydumper.DataCharacterSet, rc.cfg.Mydumper.DataInvalidCharReplace) - if err != nil { - return errors.Trace(err) - } - parser, err = mydump.NewCSVParser(ctx, &rc.cfg.Mydumper.CSV, reader, blockBufSize, rc.ioWorkers, hasHeader, charsetConvertor) - if err != nil { - return errors.Trace(err) - } - case mydump.SourceTypeSQL: - parser = mydump.NewChunkParser(ctx, rc.cfg.TiDB.SQLMode, reader, blockBufSize, rc.ioWorkers) - case mydump.SourceTypeParquet: - parser, err = mydump.NewParquetParser(ctx, rc.store, reader, sampleFile.Path) - if err != nil { - return errors.Trace(err) - } - default: - panic(fmt.Sprintf("file '%s' with unknown source type '%s'", sampleFile.Path, sampleFile.Type.String())) - } - //nolint: errcheck - defer parser.Close() - logTask := log.FromContext(ctx).With(zap.String("table", tableMeta.Name)).Begin(zap.InfoLevel, "sample file") - igCols, err := rc.cfg.Mydumper.IgnoreColumns.GetIgnoreColumns(dbName, tableMeta.Name, rc.cfg.Mydumper.CaseSensitive) - if err != nil { - return errors.Trace(err) - } - - initializedColumns := false - var columnPermutation []int - var kvSize uint64 = 0 - var rowSize uint64 = 0 - rowCount := 0 - dataKVs := rc.backend.MakeEmptyRows() - indexKVs := rc.backend.MakeEmptyRows() - lastKey := make([]byte, 0) - tableMeta.IsRowOrdered = true - tableMeta.IndexRatio = 1.0 -outloop: - for { - offset, _ := parser.Pos() - err = parser.ReadRow() - columnNames := parser.Columns() - - switch errors.Cause(err) { - case nil: - if !initializedColumns { - if len(columnPermutation) == 0 { - columnPermutation, err = createColumnPermutation( - columnNames, - igCols.ColumnsMap(), - tableInfo, - log.FromContext(ctx)) - if err != nil { - return errors.Trace(err) - } - } - initializedColumns = true - } - case io.EOF: - break outloop - default: - err = errors.Annotatef(err, "in file offset %d", offset) - return errors.Trace(err) - } - lastRow := parser.LastRow() - rowCount += 1 - - var dataChecksum, indexChecksum verification.KVChecksum - kvs, encodeErr := kvEncoder.Encode(logTask.Logger, lastRow.Row, lastRow.RowID, columnPermutation, sampleFile.Path, offset) - if encodeErr != nil { - encodeErr = errMgr.RecordTypeError(ctx, log.FromContext(ctx), tableInfo.Name.O, sampleFile.Path, offset, - "" /* use a empty string here because we don't actually record */, encodeErr) - if encodeErr != nil { - return errors.Annotatef(encodeErr, "in file at offset %d", offset) - } - if rowCount < maxSampleRowCount { - continue - } else { - break - } - } - if tableMeta.IsRowOrdered { - kvs.ClassifyAndAppend(&dataKVs, &dataChecksum, &indexKVs, &indexChecksum) - for _, kv := range kv.KvPairsFromRows(dataKVs) { - if len(lastKey) == 0 { - lastKey = kv.Key - } else if bytes.Compare(lastKey, kv.Key) > 0 { - tableMeta.IsRowOrdered = false - break - } - } - dataKVs = dataKVs.Clear() - indexKVs = indexKVs.Clear() - } - kvSize += kvs.Size() - rowSize += uint64(lastRow.Length) - parser.RecycleRow(lastRow) - - failpoint.Inject("mock-kv-size", func(val failpoint.Value) { - kvSize += uint64(val.(int)) - }) - if rowSize > maxSampleDataSize || rowCount > maxSampleRowCount { - break - } - } - - if rowSize > 0 && kvSize > rowSize { - tableMeta.IndexRatio = float64(kvSize) / float64(rowSize) - } - log.FromContext(ctx).Info("Sample source data", zap.String("table", tableMeta.Name), zap.Float64("IndexRatio", tableMeta.IndexRatio), zap.Bool("IsSourceOrder", tableMeta.IsRowOrdered)) - return nil -} - func (rc *Controller) checkTableEmpty(ctx context.Context) error { if rc.cfg.TikvImporter.Backend == config.BackendTiDB || rc.cfg.TikvImporter.IncrementalImport { return nil } - db, _ := rc.tidbGlue.GetDB() - tableCount := 0 for _, db := range rc.dbMetas { tableCount += len(db.Tables) @@ -1104,15 +868,20 @@ func (rc *Controller) checkTableEmpty(ctx context.Context) error { var lock sync.Mutex tableNames := make([]string, 0) concurrency := mathutil.Min(tableCount, rc.cfg.App.RegionConcurrency) - ch := make(chan string, concurrency) + type tableNameComponents struct { + DBName string + TableName string + } + ch := make(chan tableNameComponents, concurrency) eg, gCtx := errgroup.WithContext(ctx) for i := 0; i < concurrency; i++ { eg.Go(func() error { - for tblName := range ch { + for tblNameComp := range ch { + fullTableName := common.UniqueTable(tblNameComp.DBName, tblNameComp.TableName) // skip tables that have checkpoint if rc.cfg.Checkpoint.Enable { - _, err := rc.checkpointsDB.Get(gCtx, tblName) + _, err := rc.checkpointsDB.Get(gCtx, fullTableName) switch { case err == nil: continue @@ -1122,13 +891,13 @@ func (rc *Controller) checkTableEmpty(ctx context.Context) error { } } - hasData, err1 := tableContainsData(gCtx, db, tblName) + isEmptyPtr, err1 := rc.preInfoGetter.IsTableEmpty(gCtx, tblNameComp.DBName, tblNameComp.TableName) if err1 != nil { return err1 } - if hasData { + if !(*isEmptyPtr) { lock.Lock() - tableNames = append(tableNames, tblName) + tableNames = append(tableNames, fullTableName) lock.Unlock() } } @@ -1139,7 +908,7 @@ loop: for _, db := range rc.dbMetas { for _, tbl := range db.Tables { select { - case ch <- common.UniqueTable(tbl.DB, tbl.Name): + case ch <- tableNameComponents{tbl.DB, tbl.Name}: case <-gCtx.Done(): break loop } @@ -1162,25 +931,3 @@ loop: } return nil } - -func tableContainsData(ctx context.Context, db utils.DBExecutor, tableName string) (bool, error) { - failpoint.Inject("CheckTableEmptyFailed", func() { - failpoint.Return(false, errors.New("mock error")) - }) - query := "select 1 from " + tableName + " limit 1" - exec := common.SQLWithRetry{ - DB: db, - Logger: log.FromContext(ctx), - } - var dump int - err := exec.QueryRow(ctx, "check table empty", query, &dump) - - switch { - case errors.ErrorEqual(err, sql.ErrNoRows): - return false, nil - case err != nil: - return false, errors.Trace(err) - default: - return true, nil - } -} diff --git a/br/pkg/lightning/restore/check_info_test.go b/br/pkg/lightning/restore/check_info_test.go index abdfcf232f0a9..2da71e4c84b90 100644 --- a/br/pkg/lightning/restore/check_info_test.go +++ b/br/pkg/lightning/restore/check_info_test.go @@ -336,10 +336,18 @@ func TestCheckCSVHeader(t *testing.T) { }, }, } + + ioWorkers := worker.NewPool(context.Background(), 1, "io") + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + srcStorage: mockStore, + ioWorkers: ioWorkers, + } rc := &Controller{ - cfg: cfg, - store: mockStore, - ioWorkers: worker.NewPool(context.Background(), 1, "io"), + cfg: cfg, + store: mockStore, + ioWorkers: ioWorkers, + preInfoGetter: preInfoGetter, } p := parser.New() @@ -398,7 +406,7 @@ func TestCheckCSVHeader(t *testing.T) { }) } - err := rc.checkCSVHeader(ctx, dbMetas) + err := rc.checkCSVHeader(WithPreInfoGetterTableStructuresCache(ctx, rc.dbInfos), dbMetas) require.NoError(t, err) if ca.level != passed { require.Equal(t, 1, rc.checkTemplate.FailedCount(ca.level)) @@ -436,10 +444,20 @@ func TestCheckTableEmpty(t *testing.T) { }, } + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: cfg, + } + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + dbMetas: dbMetas, + targetInfoGetter: targetInfoGetter, + } + rc := &Controller{ cfg: cfg, dbMetas: dbMetas, checkpointsDB: checkpoints.NewNullCheckpointsDB(), + preInfoGetter: preInfoGetter, } ctx := context.Background() @@ -459,12 +477,12 @@ func TestCheckTableEmpty(t *testing.T) { db, mock, err := sqlmock.New() require.NoError(t, err) mock.MatchExpectationsInOrder(false) - rc.tidbGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) - mock.ExpectQuery("select 1 from `test1`.`tbl1` limit 1"). + targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("select 1 from `test1`.`tbl2` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("select 1 from `test2`.`tbl1` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) // not error, need not to init check template err = rc.checkTableEmpty(ctx) @@ -474,16 +492,16 @@ func TestCheckTableEmpty(t *testing.T) { // single table contains data db, mock, err = sqlmock.New() require.NoError(t, err) - rc.tidbGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) + targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) mock.MatchExpectationsInOrder(false) // test auto retry retryable error - mock.ExpectQuery("select 1 from `test1`.`tbl1` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). WillReturnError(&gmysql.MySQLError{Number: errno.ErrPDServerTimeout}) - mock.ExpectQuery("select 1 from `test1`.`tbl1` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("select 1 from `test1`.`tbl2` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("select 1 from `test2`.`tbl1` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow(1)) rc.checkTemplate = NewSimpleTemplate() err = rc.checkTableEmpty(ctx) @@ -497,13 +515,13 @@ func TestCheckTableEmpty(t *testing.T) { // multi tables contains data db, mock, err = sqlmock.New() require.NoError(t, err) - rc.tidbGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) + targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) mock.MatchExpectationsInOrder(false) - mock.ExpectQuery("select 1 from `test1`.`tbl1` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl1` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow(1)) - mock.ExpectQuery("select 1 from `test1`.`tbl2` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) - mock.ExpectQuery("select 1 from `test2`.`tbl1` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test2`.`tbl1` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).AddRow(1)) rc.checkTemplate = NewSimpleTemplate() err = rc.checkTableEmpty(ctx) @@ -540,9 +558,9 @@ func TestCheckTableEmpty(t *testing.T) { require.NoError(t, err) db, mock, err = sqlmock.New() require.NoError(t, err) - rc.tidbGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) + targetInfoGetter.targetDBGlue = glue.NewExternalTiDBGlue(db, mysql.ModeNone) // only need to check the one that is not in checkpoint - mock.ExpectQuery("select 1 from `test1`.`tbl2` limit 1"). + mock.ExpectQuery("SELECT 1 FROM `test1`.`tbl2` LIMIT 1"). WillReturnRows(sqlmock.NewRows([]string{""}).RowError(0, sql.ErrNoRows)) err = rc.checkTableEmpty(ctx) require.NoError(t, err) diff --git a/br/pkg/lightning/restore/checksum.go b/br/pkg/lightning/restore/checksum.go index 20fc77462c196..71b02801dc2dc 100644 --- a/br/pkg/lightning/restore/checksum.go +++ b/br/pkg/lightning/restore/checksum.go @@ -32,9 +32,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/metric" "github.com/pingcap/tidb/br/pkg/pdutil" - tidbcfg "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tipb/go-tipb" "github.com/tikv/client-go/v2/oracle" @@ -68,7 +66,7 @@ type ChecksumManager interface { Checksum(ctx context.Context, tableInfo *checkpoints.TidbTableInfo) (*RemoteChecksum, error) } -func newChecksumManager(ctx context.Context, rc *Controller) (ChecksumManager, error) { +func newChecksumManager(ctx context.Context, rc *Controller, store kv.Storage) (ChecksumManager, error) { // if we don't need checksum, just return nil if rc.cfg.TikvImporter.Backend == config.BackendTiDB || rc.cfg.PostRestore.Checksum == config.OpLevelOff { return nil, nil @@ -89,19 +87,6 @@ func newChecksumManager(ctx context.Context, rc *Controller) (ChecksumManager, e return nil, errors.Trace(err) } - // TODO: make tikv.Driver{}.Open use arguments instead of global variables - if tlsOpt.CAPath != "" { - conf := tidbcfg.GetGlobalConfig() - conf.Security.ClusterSSLCA = tlsOpt.CAPath - conf.Security.ClusterSSLCert = tlsOpt.CertPath - conf.Security.ClusterSSLKey = tlsOpt.KeyPath - tidbcfg.StoreGlobalConfig(conf) - } - store, err := driver.TiKVDriver{}.Open(fmt.Sprintf("tikv://%s?disableGC=true", pdAddr)) - if err != nil { - return nil, errors.Trace(err) - } - manager = newTiKVChecksumManager(store.GetClient(), pdCli, uint(rc.cfg.TiDB.DistSQLScanConcurrency)) } else { db, err := rc.tidbGlue.GetDB() diff --git a/br/pkg/lightning/restore/get_pre_info.go b/br/pkg/lightning/restore/get_pre_info.go new file mode 100644 index 0000000000000..f76792942caa9 --- /dev/null +++ b/br/pkg/lightning/restore/get_pre_info.go @@ -0,0 +1,807 @@ +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package restore + +import ( + "bytes" + "context" + "database/sql" + "fmt" + "io" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/backend" + "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/backend/local" + "github.com/pingcap/tidb/br/pkg/lightning/backend/tidb" + "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/errormanager" + "github.com/pingcap/tidb/br/pkg/lightning/glue" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" + "github.com/pingcap/tidb/br/pkg/lightning/verification" + "github.com/pingcap/tidb/br/pkg/lightning/worker" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + _ "github.com/pingcap/tidb/planner/core" // to setup expression.EvalAstExpr. Otherwise we cannot parse the default value + "github.com/pingcap/tidb/store/pdtypes" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/mock" + "go.uber.org/zap" + "golang.org/x/exp/maps" +) + +// EstimateSourceDataSizeResult is the object for estimated data size result. +type EstimateSourceDataSizeResult struct { + // SizeWithIndex is the size with the index. + SizeWithIndex int64 + // SizeWithoutIndex is the size without the index. + SizeWithoutIndex int64 + // HasUnsortedBigTables indicates whether the source data has unsorted big tables or not. + HasUnsortedBigTables bool +} + +// PreRestoreInfoGetter defines the operations to get information from sources and target. +// These information are used in the preparation of the import ( like precheck ). +type PreRestoreInfoGetter interface { + TargetInfoGetter + // GetAllTableStructures gets all the table structures with the information from both the source and the target. + GetAllTableStructures(ctx context.Context) (map[string]*checkpoints.TidbDBInfo, error) + // ReadFirstNRowsByTableName reads the first N rows of data of an importing source table. + ReadFirstNRowsByTableName(ctx context.Context, schemaName string, tableName string, n int) (cols []string, rows [][]types.Datum, err error) + // ReadFirstNRowsByFileMeta reads the first N rows of an data file. + ReadFirstNRowsByFileMeta(ctx context.Context, dataFileMeta mydump.SourceFileMeta, n int) (cols []string, rows [][]types.Datum, err error) + // EstimateSourceDataSize estimates the datasize to generate during the import as well as some other sub-informaiton. + // It will return: + // * the estimated data size to generate during the import, + // which might include some extra index data to generate besides the source file data + // * the total data size of all the source files, + // * whether there are some unsorted big tables + EstimateSourceDataSize(ctx context.Context) (*EstimateSourceDataSizeResult, error) +} + +// TargetInfoGetter defines the operations to get information from target. +type TargetInfoGetter interface { + // FetchRemoteTableModels fetches the table structures from the remote target. + FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) + // CheckVersionRequirements performs the check whether the target satisfies the version requirements. + CheckVersionRequirements(ctx context.Context) error + // IsTableEmpty checks whether the specified table on the target DB contains data or not. + 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) map[string]string + // GetReplicationConfig gets the replication config on the target. + GetReplicationConfig(ctx context.Context) (*pdtypes.ReplicationConfig, error) + // GetStorageInfo gets the storage information on the target. + GetStorageInfo(ctx context.Context) (*pdtypes.StoresInfo, error) + // GetEmptyRegionsInfo gets the region information of all the empty regions on the target. + GetEmptyRegionsInfo(ctx context.Context) (*pdtypes.RegionsInfo, error) +} + +type preInfoGetterKey string + +const ( + preInfoGetterKeyDBMetas preInfoGetterKey = "PRE_INFO_GETTER/DB_METAS" + preInfoGetterKeyTableStructsCache preInfoGetterKey = "PRE_INFO_GETTER/TABLE_STRUCTS_CACHE" + preInfoGetterKeySysVarsCache preInfoGetterKey = "PRE_INFO_GETTER/SYS_VARS_CACHE" + preInfoGetterKeyEstimatedSourceSizeCache preInfoGetterKey = "PRE_INFO_GETTER/ESTIMATED_SOURCE_SIZE_CACHE" +) + +func WithPreInfoGetterDBMetas(ctx context.Context, dbMetas []*mydump.MDDatabaseMeta) context.Context { + return context.WithValue(ctx, preInfoGetterKeyDBMetas, dbMetas) +} + +func WithPreInfoGetterTableStructuresCache(ctx context.Context, dbInfos map[string]*checkpoints.TidbDBInfo) context.Context { + return context.WithValue(ctx, preInfoGetterKeyTableStructsCache, dbInfos) +} + +func WithPreInfoGetterSysVarsCache(ctx context.Context, sysVars map[string]string) context.Context { + return context.WithValue(ctx, preInfoGetterKeySysVarsCache, sysVars) +} + +func WithPreInfoGetterEstimatedSrcSizeCache(ctx context.Context, sizeResult *EstimateSourceDataSizeResult) context.Context { + return context.WithValue(ctx, preInfoGetterKeyEstimatedSourceSizeCache, sizeResult) +} + +// TargetInfoGetterImpl implements the operations to get information from the target. +type TargetInfoGetterImpl struct { + cfg *config.Config + targetDBGlue glue.Glue + tls *common.TLS + backend backend.TargetInfoGetter +} + +// NewTargetInfoGetterImpl creates a TargetInfoGetterImpl object. +func NewTargetInfoGetterImpl( + cfg *config.Config, + targetDB *sql.DB, +) (*TargetInfoGetterImpl, error) { + targetDBGlue := glue.NewExternalTiDBGlue(targetDB, cfg.TiDB.SQLMode) + tls, err := cfg.ToTLS() + if err != nil { + return nil, errors.Trace(err) + } + var backendTargetInfoGetter backend.TargetInfoGetter + switch cfg.TikvImporter.Backend { + case config.BackendTiDB: + backendTargetInfoGetter = tidb.NewTargetInfoGetter(targetDB) + case config.BackendLocal: + backendTargetInfoGetter = local.NewTargetInfoGetter(tls, targetDBGlue, cfg.TiDB.PdAddr) + default: + return nil, common.ErrUnknownBackend.GenWithStackByArgs(cfg.TikvImporter.Backend) + } + return &TargetInfoGetterImpl{ + targetDBGlue: targetDBGlue, + tls: tls, + backend: backendTargetInfoGetter, + }, nil +} + +// FetchRemoteTableModels fetches the table structures from the remote target. +// It implements the TargetInfoGetter interface. +func (g *TargetInfoGetterImpl) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { + if !g.targetDBGlue.OwnsSQLExecutor() { + return g.targetDBGlue.GetTables(ctx, schemaName) + } + return g.backend.FetchRemoteTableModels(ctx, schemaName) +} + +// CheckVersionRequirements performs the check whether the target satisfies the version requirements. +// It implements the TargetInfoGetter interface. +// Mydump database metas are retrieved from the context. +func (g *TargetInfoGetterImpl) CheckVersionRequirements(ctx context.Context) error { + var dbMetas []*mydump.MDDatabaseMeta + dbmetasVal := ctx.Value(preInfoGetterKeyDBMetas) + if dbmetasVal != nil { + if m, ok := dbmetasVal.([]*mydump.MDDatabaseMeta); ok { + dbMetas = m + } + } + return g.backend.CheckRequirements(ctx, &backend.CheckCtx{ + DBMetas: dbMetas, + }) +} + +// IsTableEmpty checks whether the specified table on the target DB contains data or not. +// It implements the TargetInfoGetter interface. +// It tries to select the row count from the target DB. +func (g *TargetInfoGetterImpl) IsTableEmpty(ctx context.Context, schemaName string, tableName string) (*bool, error) { + var result bool + failpoint.Inject("CheckTableEmptyFailed", func() { + failpoint.Return(nil, errors.New("mock error")) + }) + db, err := g.targetDBGlue.GetDB() + if err != nil { + return nil, errors.Trace(err) + } + exec := common.SQLWithRetry{ + DB: db, + Logger: log.FromContext(ctx), + } + var dump int + err = exec.QueryRow(ctx, "check table empty", + fmt.Sprintf("SELECT 1 FROM %s LIMIT 1", common.UniqueTable(schemaName, tableName)), + &dump, + ) + + switch { + case errors.ErrorEqual(err, sql.ErrNoRows): + result = true + case err != nil: + return nil, errors.Trace(err) + default: + result = false + } + return &result, nil +} + +// GetTargetSysVariablesForImport gets some important system variables for importing on the target. +// It implements the TargetInfoGetter interface. +// It uses the SQL to fetch sys variables from the target. +func (g *TargetInfoGetterImpl) GetTargetSysVariablesForImport(ctx context.Context) map[string]string { + sysVars := ObtainImportantVariables(ctx, g.targetDBGlue.GetSQLExecutor(), !isTiDBBackend(g.cfg)) + // override by manually set vars + maps.Copy(sysVars, g.cfg.TiDB.Vars) + 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.cfg.TiDB.PdAddr).GetJSON(ctx, pdReplicate, &result); err != nil { + return nil, errors.Trace(err) + } + return result, 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.cfg.TiDB.PdAddr).GetJSON(ctx, pdStores, result); err != nil { + return nil, errors.Trace(err) + } + return result, nil +} + +// 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.cfg.TiDB.PdAddr).GetJSON(ctx, pdEmptyRegions, &result); err != nil { + return nil, errors.Trace(err) + } + return result, nil +} + +// PreRestoreInfoGetterImpl implements the operations to get information used in importing preparation. +type PreRestoreInfoGetterImpl struct { + cfg *config.Config + srcStorage storage.ExternalStorage + ioWorkers *worker.Pool + encBuilder backend.EncodingBuilder + targetInfoGetter TargetInfoGetter + + dbMetas []*mydump.MDDatabaseMeta + mdDBMetaMap map[string]*mydump.MDDatabaseMeta + mdDBTableMetaMap map[string]map[string]*mydump.MDTableMeta +} + +// NewPreRestoreInfoGetter creates a PreRestoreInfoGetterImpl object. +func NewPreRestoreInfoGetter( + cfg *config.Config, + dbMetas []*mydump.MDDatabaseMeta, + srcStorage storage.ExternalStorage, + targetInfoGetter TargetInfoGetter, + ioWorkers *worker.Pool, + encBuilder backend.EncodingBuilder, +) (*PreRestoreInfoGetterImpl, error) { + if ioWorkers == nil { + ioWorkers = worker.NewPool(context.Background(), cfg.App.IOConcurrency, "pre_info_getter_io") + } + if encBuilder == nil { + switch cfg.TikvImporter.Backend { + case config.BackendTiDB: + encBuilder = tidb.NewEncodingBuilder() + case config.BackendLocal: + encBuilder = local.NewEncodingBuilder(context.Background()) + default: + return nil, common.ErrUnknownBackend.GenWithStackByArgs(cfg.TikvImporter.Backend) + } + } + + result := &PreRestoreInfoGetterImpl{ + cfg: cfg, + dbMetas: dbMetas, + srcStorage: srcStorage, + ioWorkers: ioWorkers, + encBuilder: encBuilder, + targetInfoGetter: targetInfoGetter, + } + result.Init() + return result, nil +} + +// Init initializes some internal data and states for PreRestoreInfoGetterImpl. +func (p *PreRestoreInfoGetterImpl) Init() { + mdDBMetaMap := make(map[string]*mydump.MDDatabaseMeta) + mdDBTableMetaMap := make(map[string]map[string]*mydump.MDTableMeta) + for _, dbMeta := range p.dbMetas { + dbName := dbMeta.Name + mdDBMetaMap[dbName] = dbMeta + mdTableMetaMap, ok := mdDBTableMetaMap[dbName] + if !ok { + mdTableMetaMap = make(map[string]*mydump.MDTableMeta) + mdDBTableMetaMap[dbName] = mdTableMetaMap + } + for _, tblMeta := range dbMeta.Tables { + tblName := tblMeta.Name + mdTableMetaMap[tblName] = tblMeta + } + } + p.mdDBMetaMap = mdDBMetaMap + p.mdDBTableMetaMap = mdDBTableMetaMap +} + +// GetAllTableStructures gets all the table structures with the information from both the source and the target. +// It implements the PreRestoreInfoGetter interface. +// It has a caching mechanism: the table structures will be obtained from the source only once. +func (p *PreRestoreInfoGetterImpl) GetAllTableStructures(ctx context.Context) (map[string]*checkpoints.TidbDBInfo, error) { + var ( + dbInfos map[string]*checkpoints.TidbDBInfo + err error + ) + dbInfosVal := ctx.Value(preInfoGetterKeyTableStructsCache) + if dbInfosVal != nil { + if v, ok := dbInfosVal.(map[string]*checkpoints.TidbDBInfo); ok { + dbInfos = v + } + } + if dbInfos != nil { + return dbInfos, nil + } + dbInfos, err = LoadSchemaInfo(ctx, p.dbMetas, func(ctx context.Context, dbName string) ([]*model.TableInfo, error) { + return p.getTableStructuresByFileMeta(ctx, p.mdDBMetaMap[dbName]) + }) + if err != nil { + return nil, errors.Trace(err) + } + return dbInfos, nil +} + +func (p *PreRestoreInfoGetterImpl) getTableStructuresByFileMeta(ctx context.Context, dbSrcFileMeta *mydump.MDDatabaseMeta) ([]*model.TableInfo, error) { + dbName := dbSrcFileMeta.Name + currentTableInfosFromDB, err := p.targetInfoGetter.FetchRemoteTableModels(ctx, dbName) + if err != nil { + return nil, errors.Trace(err) + } + currentTableInfosMap := make(map[string]*model.TableInfo) + for _, tblInfo := range currentTableInfosFromDB { + currentTableInfosMap[tblInfo.Name.L] = tblInfo + } + resultInfos := make([]*model.TableInfo, len(dbSrcFileMeta.Tables)) + for i, tableFileMeta := range dbSrcFileMeta.Tables { + if curTblInfo, ok := currentTableInfosMap[strings.ToLower(tableFileMeta.Name)]; ok { + resultInfos[i] = curTblInfo + continue + } + createTblSQL, err := tableFileMeta.GetSchema(ctx, p.srcStorage) + if err != nil { + return nil, errors.Annotatef(err, "get create table statement from schema file error: %s", tableFileMeta.Name) + } + theTableInfo, err := newTableInfo(createTblSQL, 0) + if err != nil { + errMsg := "generate table info from SQL error" + log.L().Error(errMsg, zap.Error(err), zap.String("sql", createTblSQL), zap.String("table_name", tableFileMeta.Name)) + return nil, errors.Annotatef(err, "%s: %s", errMsg, tableFileMeta.Name) + } + resultInfos[i] = theTableInfo + } + return resultInfos, nil +} + +func newTableInfo(createTblSQL string, tableID int64) (*model.TableInfo, error) { + parser := parser.New() + astNode, err := parser.ParseOneStmt(createTblSQL, "", "") + if err != nil { + errMsg := "parse sql statement error" + log.L().Error(errMsg, zap.Error(err), zap.String("sql", createTblSQL)) + return nil, errors.Trace(err) + } + sctx := mock.NewContext() + createTableStmt, ok := astNode.(*ast.CreateTableStmt) + if !ok { + return nil, errors.New("cannot transfer the parsed SQL as an CREATE TABLE statement") + } + info, err := ddl.MockTableInfo(sctx, createTableStmt, tableID) + if err != nil { + return nil, errors.Trace(err) + } + // set a auto_random bit if AUTO_RANDOM is set + setAutoRandomBits(info, createTableStmt.Cols) + info.State = model.StatePublic + return info, nil +} + +func setAutoRandomBits(tblInfo *model.TableInfo, colDefs []*ast.ColumnDef) { + if !tblInfo.PKIsHandle { + return + } + pkColName := tblInfo.GetPkName() + for _, colDef := range colDefs { + if colDef.Name.Name.L != pkColName.L || colDef.Tp.GetType() != mysql.TypeLonglong { + continue + } + // potential AUTO_RANDOM candidate column, examine the options + hasAutoRandom := false + canSetAutoRandom := true + var autoRandomBits int + for _, option := range colDef.Options { + if option.Tp == ast.ColumnOptionAutoRandom { + hasAutoRandom = true + autoRandomBits = option.AutoRandomBitLength + switch { + case autoRandomBits == types.UnspecifiedLength: + autoRandomBits = autoid.DefaultAutoRandomBits + case autoRandomBits <= 0 || autoRandomBits > autoid.MaxAutoRandomBits: + canSetAutoRandom = false + } + } + if option.Tp == ast.ColumnOptionAutoIncrement { + canSetAutoRandom = false + } + if option.Tp == ast.ColumnOptionDefaultValue { + canSetAutoRandom = false + } + } + if hasAutoRandom && canSetAutoRandom { + tblInfo.AutoRandomBits = uint64(autoRandomBits) + } + } +} + +// ReadFirstNRowsByTableName reads the first N rows of data of an importing source table. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) ReadFirstNRowsByTableName(ctx context.Context, schemaName string, tableName string, n int) ([]string, [][]types.Datum, error) { + mdTableMetaMap, ok := p.mdDBTableMetaMap[schemaName] + if !ok { + return nil, nil, errors.Errorf("cannot find the schema: %s", schemaName) + } + mdTableMeta, ok := mdTableMetaMap[tableName] + if !ok { + return nil, nil, errors.Errorf("cannot find the table: %s.%s", schemaName, tableName) + } + if len(mdTableMeta.DataFiles) <= 0 { + return nil, [][]types.Datum{}, nil + } + return p.ReadFirstNRowsByFileMeta(ctx, mdTableMeta.DataFiles[0].FileMeta, n) +} + +// ReadFirstNRowsByFileMeta reads the first N rows of an data file. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) ReadFirstNRowsByFileMeta(ctx context.Context, dataFileMeta mydump.SourceFileMeta, n int) ([]string, [][]types.Datum, error) { + var ( + reader storage.ReadSeekCloser + err error + ) + if dataFileMeta.Type == mydump.SourceTypeParquet { + reader, err = mydump.OpenParquetReader(ctx, p.srcStorage, dataFileMeta.Path, dataFileMeta.FileSize) + } else { + reader, err = p.srcStorage.Open(ctx, dataFileMeta.Path) + } + if err != nil { + return nil, nil, errors.Trace(err) + } + + var parser mydump.Parser + blockBufSize := int64(p.cfg.Mydumper.ReadBlockSize) + switch dataFileMeta.Type { + case mydump.SourceTypeCSV: + hasHeader := p.cfg.Mydumper.CSV.Header + // Create a utf8mb4 convertor to encode and decode data with the charset of CSV files. + charsetConvertor, err := mydump.NewCharsetConvertor(p.cfg.Mydumper.DataCharacterSet, p.cfg.Mydumper.DataInvalidCharReplace) + if err != nil { + return nil, nil, errors.Trace(err) + } + parser, err = mydump.NewCSVParser(ctx, &p.cfg.Mydumper.CSV, reader, blockBufSize, p.ioWorkers, hasHeader, charsetConvertor) + if err != nil { + return nil, nil, errors.Trace(err) + } + case mydump.SourceTypeSQL: + parser = mydump.NewChunkParser(ctx, p.cfg.TiDB.SQLMode, reader, blockBufSize, p.ioWorkers) + case mydump.SourceTypeParquet: + parser, err = mydump.NewParquetParser(ctx, p.srcStorage, reader, dataFileMeta.Path) + if err != nil { + return nil, nil, errors.Trace(err) + } + default: + panic(fmt.Sprintf("unknown file type '%s'", dataFileMeta.Type)) + } + //nolint: errcheck + defer parser.Close() + + rows := [][]types.Datum{} + for i := 0; i < n; i++ { + err := parser.ReadRow() + if err != nil { + if errors.Cause(err) != io.EOF { + return nil, nil, errors.Trace(err) + } else { + break + } + } + rows = append(rows, parser.LastRow().Row) + } + return parser.Columns(), rows, nil + +} + +// EstimateSourceDataSize estimates the datasize to generate during the import as well as some other sub-informaiton. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) EstimateSourceDataSize(ctx context.Context) (*EstimateSourceDataSizeResult, error) { + var result *EstimateSourceDataSizeResult + resultVal := ctx.Value(preInfoGetterKeyEstimatedSourceSizeCache) + if resultVal != nil { + if v, ok := resultVal.(*EstimateSourceDataSizeResult); ok { + result = v + } + } + if result != nil { + return result, nil + } + sizeWithIndex := int64(0) + sourceTotalSize := int64(0) + tableCount := 0 + unSortedBigTableCount := 0 + errMgr := errormanager.New(nil, p.cfg, log.FromContext(ctx)) + dbInfos, err := p.GetAllTableStructures(ctx) + if err != nil { + return nil, errors.Trace(err) + } + sysVars := p.GetTargetSysVariablesForImport(ctx) + for _, db := range p.dbMetas { + info, ok := dbInfos[db.Name] + if !ok { + continue + } + for _, tbl := range db.Tables { + sourceTotalSize += tbl.TotalSize + tableInfo, ok := info.Tables[tbl.Name] + if ok { + // Do not sample small table because there may a large number of small table and it will take a long + // time to sample data for all of them. + if isTiDBBackend(p.cfg) || tbl.TotalSize < int64(config.SplitRegionSize) { + sizeWithIndex += tbl.TotalSize + tbl.IndexRatio = 1.0 + tbl.IsRowOrdered = false + } else { + sampledIndexRatio, isRowOrderedFromSample, err := p.sampleDataFromTable(ctx, db.Name, tbl, tableInfo.Core, errMgr, sysVars) + if err != nil { + return nil, errors.Trace(err) + } + tbl.IndexRatio = sampledIndexRatio + tbl.IsRowOrdered = isRowOrderedFromSample + + if tbl.IndexRatio > 0 { + sizeWithIndex += int64(float64(tbl.TotalSize) * tbl.IndexRatio) + } else { + // if sample data failed due to max-error, fallback to use source size + sizeWithIndex += tbl.TotalSize + } + + if tbl.TotalSize > int64(config.DefaultBatchSize)*2 && !tbl.IsRowOrdered { + unSortedBigTableCount++ + } + } + tableCount += 1 + } + } + } + + result = &EstimateSourceDataSizeResult{ + SizeWithIndex: sizeWithIndex, + SizeWithoutIndex: sourceTotalSize, + HasUnsortedBigTables: (unSortedBigTableCount > 0), + } + return result, nil + +} + +// sampleDataFromTable samples the source data file to get the extra data ratio for the index +// It returns: +// * the extra data ratio with index size accounted +// * is the sample data ordered by row +func (p *PreRestoreInfoGetterImpl) sampleDataFromTable( + ctx context.Context, + dbName string, + tableMeta *mydump.MDTableMeta, + tableInfo *model.TableInfo, + errMgr *errormanager.ErrorManager, + sysVars map[string]string, +) (float64, bool, error) { + resultIndexRatio := 1.0 + isRowOrdered := false + if len(tableMeta.DataFiles) == 0 { + return resultIndexRatio, isRowOrdered, nil + } + sampleFile := tableMeta.DataFiles[0].FileMeta + var reader storage.ReadSeekCloser + var err error + if sampleFile.Type == mydump.SourceTypeParquet { + reader, err = mydump.OpenParquetReader(ctx, p.srcStorage, sampleFile.Path, sampleFile.FileSize) + } else { + reader, err = p.srcStorage.Open(ctx, sampleFile.Path) + } + if err != nil { + return 0.0, false, errors.Trace(err) + } + idAlloc := kv.NewPanickingAllocators(0) + tbl, err := tables.TableFromMeta(idAlloc, tableInfo) + if err != nil { + return 0.0, false, errors.Trace(err) + } + kvEncoder, err := p.encBuilder.NewEncoder(ctx, tbl, &kv.SessionOptions{ + SQLMode: p.cfg.TiDB.SQLMode, + Timestamp: 0, + SysVars: sysVars, + AutoRandomSeed: 0, + }) + if err != nil { + return 0.0, false, errors.Trace(err) + } + blockBufSize := int64(p.cfg.Mydumper.ReadBlockSize) + + var parser mydump.Parser + switch tableMeta.DataFiles[0].FileMeta.Type { + case mydump.SourceTypeCSV: + hasHeader := p.cfg.Mydumper.CSV.Header + // Create a utf8mb4 convertor to encode and decode data with the charset of CSV files. + charsetConvertor, err := mydump.NewCharsetConvertor(p.cfg.Mydumper.DataCharacterSet, p.cfg.Mydumper.DataInvalidCharReplace) + if err != nil { + return 0.0, false, errors.Trace(err) + } + parser, err = mydump.NewCSVParser(ctx, &p.cfg.Mydumper.CSV, reader, blockBufSize, p.ioWorkers, hasHeader, charsetConvertor) + if err != nil { + return 0.0, false, errors.Trace(err) + } + case mydump.SourceTypeSQL: + parser = mydump.NewChunkParser(ctx, p.cfg.TiDB.SQLMode, reader, blockBufSize, p.ioWorkers) + case mydump.SourceTypeParquet: + parser, err = mydump.NewParquetParser(ctx, p.srcStorage, reader, sampleFile.Path) + if err != nil { + return 0.0, false, errors.Trace(err) + } + default: + panic(fmt.Sprintf("file '%s' with unknown source type '%s'", sampleFile.Path, sampleFile.Type.String())) + } + //nolint: errcheck + defer parser.Close() + logTask := log.FromContext(ctx).With(zap.String("table", tableMeta.Name)).Begin(zap.InfoLevel, "sample file") + igCols, err := p.cfg.Mydumper.IgnoreColumns.GetIgnoreColumns(dbName, tableMeta.Name, p.cfg.Mydumper.CaseSensitive) + if err != nil { + return 0.0, false, errors.Trace(err) + } + + initializedColumns := false + var columnPermutation []int + var kvSize uint64 = 0 + var rowSize uint64 = 0 + rowCount := 0 + dataKVs := p.encBuilder.MakeEmptyRows() + indexKVs := p.encBuilder.MakeEmptyRows() + lastKey := make([]byte, 0) + isRowOrdered = true +outloop: + for { + offset, _ := parser.Pos() + err = parser.ReadRow() + columnNames := parser.Columns() + + switch errors.Cause(err) { + case nil: + if !initializedColumns { + if len(columnPermutation) == 0 { + columnPermutation, err = createColumnPermutation( + columnNames, + igCols.ColumnsMap(), + tableInfo, + log.FromContext(ctx)) + if err != nil { + return 0.0, false, errors.Trace(err) + } + } + initializedColumns = true + } + case io.EOF: + break outloop + default: + err = errors.Annotatef(err, "in file offset %d", offset) + return 0.0, false, errors.Trace(err) + } + lastRow := parser.LastRow() + rowCount += 1 + + var dataChecksum, indexChecksum verification.KVChecksum + kvs, encodeErr := kvEncoder.Encode(logTask.Logger, lastRow.Row, lastRow.RowID, columnPermutation, sampleFile.Path, offset) + if encodeErr != nil { + encodeErr = errMgr.RecordTypeError(ctx, log.FromContext(ctx), tableInfo.Name.O, sampleFile.Path, offset, + "" /* use a empty string here because we don't actually record */, encodeErr) + if encodeErr != nil { + return 0.0, false, errors.Annotatef(encodeErr, "in file at offset %d", offset) + } + if rowCount < maxSampleRowCount { + continue + } else { + break + } + } + if isRowOrdered { + kvs.ClassifyAndAppend(&dataKVs, &dataChecksum, &indexKVs, &indexChecksum) + for _, kv := range kv.KvPairsFromRows(dataKVs) { + if len(lastKey) == 0 { + lastKey = kv.Key + } else if bytes.Compare(lastKey, kv.Key) > 0 { + isRowOrdered = false + break + } + } + dataKVs = dataKVs.Clear() + indexKVs = indexKVs.Clear() + } + kvSize += kvs.Size() + rowSize += uint64(lastRow.Length) + parser.RecycleRow(lastRow) + + failpoint.Inject("mock-kv-size", func(val failpoint.Value) { + kvSize += uint64(val.(int)) + }) + if rowSize > maxSampleDataSize || rowCount > maxSampleRowCount { + break + } + } + + if rowSize > 0 && kvSize > rowSize { + resultIndexRatio = float64(kvSize) / float64(rowSize) + } + log.FromContext(ctx).Info("Sample source data", zap.String("table", tableMeta.Name), zap.Float64("IndexRatio", tableMeta.IndexRatio), zap.Bool("IsSourceOrder", tableMeta.IsRowOrdered)) + return resultIndexRatio, isRowOrdered, nil +} + +// GetReplicationConfig gets the replication config on the target. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) GetReplicationConfig(ctx context.Context) (*pdtypes.ReplicationConfig, error) { + return p.targetInfoGetter.GetReplicationConfig(ctx) +} + +// GetStorageInfo gets the storage information on the target. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) GetStorageInfo(ctx context.Context) (*pdtypes.StoresInfo, error) { + return p.targetInfoGetter.GetStorageInfo(ctx) +} + +// GetEmptyRegionsInfo gets the region information of all the empty regions on the target. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) GetEmptyRegionsInfo(ctx context.Context) (*pdtypes.RegionsInfo, error) { + return p.targetInfoGetter.GetEmptyRegionsInfo(ctx) +} + +// IsTableEmpty checks whether the specified table on the target DB contains data or not. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) IsTableEmpty(ctx context.Context, schemaName string, tableName string) (*bool, error) { + return p.targetInfoGetter.IsTableEmpty(ctx, schemaName, tableName) +} + +// FetchRemoteTableModels fetches the table structures from the remote target. +// It implements the PreRestoreInfoGetter interface. +func (p *PreRestoreInfoGetterImpl) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { + return p.targetInfoGetter.FetchRemoteTableModels(ctx, schemaName) +} + +// CheckVersionRequirements performs the check whether the target satisfies the version requirements. +// It implements the PreRestoreInfoGetter interface. +// Mydump database metas are retrieved from the context. +func (g *PreRestoreInfoGetterImpl) CheckVersionRequirements(ctx context.Context) error { + return g.targetInfoGetter.CheckVersionRequirements(ctx) +} + +// GetTargetSysVariablesForImport gets some important systam variables for importing on the target. +// It implements the PreRestoreInfoGetter interface. +// It has caching mechanism. +func (p *PreRestoreInfoGetterImpl) GetTargetSysVariablesForImport(ctx context.Context) map[string]string { + var sysVars map[string]string + sysVarsVal := ctx.Value(preInfoGetterKeySysVarsCache) + if sysVarsVal != nil { + if v, ok := sysVarsVal.(map[string]string); ok { + sysVars = v + } + } + if sysVars != nil { + return sysVars + } + return p.targetInfoGetter.GetTargetSysVariablesForImport(ctx) +} diff --git a/br/pkg/lightning/restore/get_pre_info_test.go b/br/pkg/lightning/restore/get_pre_info_test.go new file mode 100644 index 0000000000000..94bc4ec58c41e --- /dev/null +++ b/br/pkg/lightning/restore/get_pre_info_test.go @@ -0,0 +1,497 @@ +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package restore + +import ( + "context" + "fmt" + "strings" + "testing" + + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/lightning/restore/mock" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" +) + +type colDef struct { + ColName string + Def string + TypeStr string +} + +type tableDef []*colDef + +func tableDefsToMockDataMap(dbTableDefs map[string]map[string]tableDef) map[string]*mock.MockDBSourceData { + dbMockDataMap := make(map[string]*mock.MockDBSourceData) + for dbName, tblDefMap := range dbTableDefs { + tblMockDataMap := make(map[string]*mock.MockTableSourceData) + for tblName, colDefs := range tblDefMap { + colDefStrs := make([]string, len(colDefs)) + for i, colDef := range colDefs { + colDefStrs[i] = fmt.Sprintf("%s %s", colDef.ColName, colDef.Def) + } + createSQL := fmt.Sprintf("CREATE TABLE %s.%s (%s);", dbName, tblName, strings.Join(colDefStrs, ", ")) + tblMockDataMap[tblName] = &mock.MockTableSourceData{ + DBName: dbName, + TableName: tblName, + SchemaFile: &mock.MockSourceFile{ + FileName: fmt.Sprintf("/%s/%s/%s.schema.sql", dbName, tblName, tblName), + Data: []byte(createSQL), + }, + } + } + dbMockDataMap[dbName] = &mock.MockDBSourceData{ + Name: dbName, + Tables: tblMockDataMap, + } + } + return dbMockDataMap +} + +func TestGetPreInfoGenerateTableInfo(t *testing.T) { + schemaName := "db1" + tblName := "tbl1" + createTblSQL := fmt.Sprintf("create table `%s`.`%s` (a varchar(16) not null, b varchar(8) default 'DEFA')", schemaName, tblName) + tblInfo, err := newTableInfo(createTblSQL, 1) + require.Nil(t, err) + t.Logf("%+v", tblInfo) + require.Equal(t, model.NewCIStr(tblName), tblInfo.Name) + require.Equal(t, len(tblInfo.Columns), 2) + require.Equal(t, model.NewCIStr("a"), tblInfo.Columns[0].Name) + require.Nil(t, tblInfo.Columns[0].DefaultValue) + require.False(t, hasDefault(tblInfo.Columns[0])) + require.Equal(t, model.NewCIStr("b"), tblInfo.Columns[1].Name) + require.NotNil(t, tblInfo.Columns[1].DefaultValue) + + createTblSQL = fmt.Sprintf("create table `%s`.`%s` (a varchar(16), b varchar(8) default 'DEFAULT_BBBBB')", schemaName, tblName) // default value exceeds the length + tblInfo, err = newTableInfo(createTblSQL, 2) + require.NotNil(t, err) +} + +func TestGetPreInfoHasDefault(t *testing.T) { + subCases := []struct { + ColDef string + ExpectHasDefault bool + }{ + { + ColDef: "varchar(16)", + ExpectHasDefault: true, + }, + { + ColDef: "varchar(16) NOT NULL", + ExpectHasDefault: false, + }, + { + ColDef: "INTEGER PRIMARY KEY", + ExpectHasDefault: false, + }, + { + ColDef: "INTEGER AUTO_INCREMENT", + ExpectHasDefault: true, + }, + { + ColDef: "INTEGER PRIMARY KEY AUTO_INCREMENT", + ExpectHasDefault: true, + }, + { + ColDef: "BIGINT PRIMARY KEY AUTO_RANDOM", + ExpectHasDefault: false, + }, + } + for _, subCase := range subCases { + createTblSQL := fmt.Sprintf("create table `db1`.`tbl1` (a %s)", subCase.ColDef) + tblInfo, err := newTableInfo(createTblSQL, 1) + require.Nil(t, err) + require.Equal(t, subCase.ExpectHasDefault, hasDefault(tblInfo.Columns[0]), subCase.ColDef) + } +} + +func TestGetPreInfoAutoRandomBits(t *testing.T) { + subCases := []struct { + ColDef string + ExpectAutoRandomBits uint64 + }{ + { + ColDef: "varchar(16)", + ExpectAutoRandomBits: 0, + }, + { + ColDef: "varchar(16) AUTO_RANDOM", + ExpectAutoRandomBits: 0, + }, + { + ColDef: "INTEGER PRIMARY KEY AUTO_RANDOM", + ExpectAutoRandomBits: 0, + }, + { + ColDef: "BIGINT PRIMARY KEY AUTO_RANDOM AUTO_INCREMENT", + ExpectAutoRandomBits: 0, + }, + { + ColDef: "BIGINT PRIMARY KEY AUTO_RANDOM(3)", + ExpectAutoRandomBits: 3, + }, + { + ColDef: "BIGINT PRIMARY KEY AUTO_RANDOM", + ExpectAutoRandomBits: 5, + }, + { + ColDef: "BIGINT PRIMARY KEY AUTO_RANDOM(20)", + ExpectAutoRandomBits: 0, + }, + { + ColDef: "BIGINT PRIMARY KEY AUTO_RANDOM(0)", + ExpectAutoRandomBits: 0, + }, + { + ColDef: "BIGINT AUTO_RANDOM", + ExpectAutoRandomBits: 0, + }, + } + for _, subCase := range subCases { + createTblSQL := fmt.Sprintf("create table `db1`.`tbl1` (a %s)", subCase.ColDef) + tblInfo, err := newTableInfo(createTblSQL, 1) + require.Nil(t, err) + require.Equal(t, subCase.ExpectAutoRandomBits, tblInfo.AutoRandomBits, subCase.ColDef) + } +} + +func TestGetPreInfoGetAllTableStructures(t *testing.T) { + dbTableDefs := map[string]map[string]tableDef{ + "db01": { + "tbl01": { + &colDef{ + ColName: "id", + Def: "INTEGER PRIMARY KEY AUTO_INCREMENT", + TypeStr: "int", + }, + &colDef{ + ColName: "strval", + Def: "VARCHAR(64)", + TypeStr: "varchar", + }, + }, + "tbl02": { + &colDef{ + ColName: "id", + Def: "INTEGER PRIMARY KEY AUTO_INCREMENT", + TypeStr: "int", + }, + &colDef{ + ColName: "val", + Def: "VARCHAR(64)", + TypeStr: "varchar", + }, + }, + }, + "db02": { + "tbl01": { + &colDef{ + ColName: "id", + Def: "INTEGER PRIMARY KEY AUTO_INCREMENT", + TypeStr: "int", + }, + &colDef{ + ColName: "strval", + Def: "VARCHAR(64)", + TypeStr: "varchar", + }, + }, + }, + } + testMockDataMap := tableDefsToMockDataMap(dbTableDefs) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockSrc, err := mock.NewMockImportSource(testMockDataMap) + require.Nil(t, err) + + mockTarget := mock.NewMockTargetInfo() + + cfg := config.NewConfig() + cfg.TikvImporter.Backend = config.BackendLocal + ig, err := NewPreRestoreInfoGetter(cfg, mockSrc.GetAllDBFileMetas(), mockSrc.GetStorage(), mockTarget, nil, nil) + require.NoError(t, err) + tblStructMap, err := ig.GetAllTableStructures(ctx) + require.Nil(t, err) + require.Equal(t, len(dbTableDefs), len(tblStructMap), "compare db count") + for dbName, dbInfo := range tblStructMap { + tblDefMap, ok := dbTableDefs[dbName] + require.Truef(t, ok, "check db exists in db definitions: %s", dbName) + require.Equalf(t, len(tblDefMap), len(dbInfo.Tables), "compare table count: %s", dbName) + for tblName, tblStruct := range dbInfo.Tables { + tblDef, ok := tblDefMap[tblName] + require.Truef(t, ok, "check table exists in table definitions: %s.%s", dbName, tblName) + require.Equalf(t, len(tblDef), len(tblStruct.Core.Columns), "compare columns count: %s.%s", dbName, tblName) + for i, colDef := range tblStruct.Core.Columns { + expectColDef := tblDef[i] + require.Equalf(t, strings.ToLower(expectColDef.ColName), colDef.Name.L, "check column name: %s.%s", dbName, tblName) + require.Truef(t, strings.Contains(colDef.FieldType.String(), strings.ToLower(expectColDef.TypeStr)), "check column type: %s.%s", dbName, tblName) + } + } + } +} + +func TestGetPreInfoReadFirstRow(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + const testCSVData01 string = `ival,sval +111,"aaa" +222,"bbb" +` + const testSQLData01 string = `INSERT INTO db01.tbl01 (ival, sval) VALUES (333, 'ccc'); +INSERT INTO db01.tbl01 (ival, sval) VALUES (444, 'ddd');` + testDataInfos := []struct { + FileName string + Data string + FirstN int + CSVConfig *config.CSVConfig + ExpectFirstRowDatums [][]types.Datum + ExpectColumns []string + }{ + { + FileName: "/db01/tbl01/data.001.csv", + Data: testCSVData01, + FirstN: 1, + ExpectFirstRowDatums: [][]types.Datum{ + { + types.NewStringDatum("111"), + types.NewStringDatum("aaa"), + }, + }, + ExpectColumns: []string{"ival", "sval"}, + }, + { + FileName: "/db01/tbl01/data.002.csv", + Data: testCSVData01, + FirstN: 2, + ExpectFirstRowDatums: [][]types.Datum{ + { + types.NewStringDatum("111"), + types.NewStringDatum("aaa"), + }, + { + types.NewStringDatum("222"), + types.NewStringDatum("bbb"), + }, + }, + ExpectColumns: []string{"ival", "sval"}, + }, + { + FileName: "/db01/tbl01/data.001.sql", + Data: testSQLData01, + FirstN: 1, + ExpectFirstRowDatums: [][]types.Datum{ + { + types.NewUintDatum(333), + types.NewStringDatum("ccc"), + }, + }, + ExpectColumns: []string{"ival", "sval"}, + }, + { + FileName: "/db01/tbl01/data.003.csv", + Data: "", + FirstN: 1, + ExpectFirstRowDatums: [][]types.Datum{}, + ExpectColumns: nil, + }, + { + FileName: "/db01/tbl01/data.004.csv", + Data: "ival,sval", + FirstN: 1, + ExpectFirstRowDatums: [][]types.Datum{}, + ExpectColumns: []string{"ival", "sval"}, + }, + } + tblMockSourceData := &mock.MockTableSourceData{ + DBName: "db01", + TableName: "tbl01", + SchemaFile: &mock.MockSourceFile{ + FileName: "/db01/tbl01/tbl01.schema.sql", + Data: []byte("CREATE TABLE db01.tbl01(id INTEGER PRIMARY KEY AUTO_INCREMENT, ival INTEGER, sval VARCHAR(64));"), + }, + DataFiles: []*mock.MockSourceFile{}, + } + for _, testInfo := range testDataInfos { + tblMockSourceData.DataFiles = append(tblMockSourceData.DataFiles, &mock.MockSourceFile{ + FileName: testInfo.FileName, + Data: []byte(testInfo.Data), + }) + } + mockDataMap := map[string]*mock.MockDBSourceData{ + "db01": { + Name: "db01", + Tables: map[string]*mock.MockTableSourceData{ + "tbl01": tblMockSourceData, + }, + }, + } + mockSrc, err := mock.NewMockImportSource(mockDataMap) + require.Nil(t, err) + mockTarget := mock.NewMockTargetInfo() + cfg := config.NewConfig() + cfg.TikvImporter.Backend = config.BackendLocal + ig, err := NewPreRestoreInfoGetter(cfg, mockSrc.GetAllDBFileMetas(), mockSrc.GetStorage(), mockTarget, nil, nil) + require.NoError(t, err) + + cfg.Mydumper.CSV.Header = true + tblMeta := mockSrc.GetDBMetaMap()["db01"].Tables[0] + for i, dataFile := range tblMeta.DataFiles { + theDataInfo := testDataInfos[i] + cols, rowDatums, err := ig.ReadFirstNRowsByFileMeta(ctx, dataFile.FileMeta, theDataInfo.FirstN) + require.Nil(t, err) + t.Logf("%v, %v", cols, rowDatums) + require.Equal(t, theDataInfo.ExpectColumns, cols) + require.Equal(t, theDataInfo.ExpectFirstRowDatums, rowDatums) + } + + theDataInfo := testDataInfos[0] + cols, rowDatums, err := ig.ReadFirstNRowsByTableName(ctx, "db01", "tbl01", theDataInfo.FirstN) + require.NoError(t, err) + require.Equal(t, theDataInfo.ExpectColumns, cols) + require.Equal(t, theDataInfo.ExpectFirstRowDatums, rowDatums) +} + +func TestGetPreInfoSampleSource(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dataFileName := "/db01/tbl01/tbl01.data.001.csv" + mockDataMap := map[string]*mock.MockDBSourceData{ + "db01": { + Name: "db01", + Tables: map[string]*mock.MockTableSourceData{ + "tbl01": { + DBName: "db01", + TableName: "tbl01", + SchemaFile: &mock.MockSourceFile{ + FileName: "/db01/tbl01/tbl01.schema.sql", + Data: []byte("CREATE TABLE db01.tbl01 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ival INTEGER, sval VARCHAR(64));"), + }, + DataFiles: []*mock.MockSourceFile{ + { + FileName: dataFileName, + Data: []byte(nil), + }, + }, + }, + }, + }, + } + mockSrc, err := mock.NewMockImportSource(mockDataMap) + require.Nil(t, err) + mockTarget := mock.NewMockTargetInfo() + cfg := config.NewConfig() + cfg.TikvImporter.Backend = config.BackendLocal + ig, err := NewPreRestoreInfoGetter(cfg, mockSrc.GetAllDBFileMetas(), mockSrc.GetStorage(), mockTarget, nil, nil) + require.NoError(t, err) + + mdDBMeta := mockSrc.GetAllDBFileMetas()[0] + mdTblMeta := mdDBMeta.Tables[0] + dbInfos, err := ig.GetAllTableStructures(ctx) + require.NoError(t, err) + + subTests := []struct { + Data []byte + ExpectIsOrdered bool + }{ + { + Data: []byte(`id,ival,sval +1,111,"aaa" +2,222,"bbb" +`, + ), + ExpectIsOrdered: true, + }, + { + Data: []byte(`sval,ival,id +"aaa",111,1 +"bbb",222,2 +`, + ), + ExpectIsOrdered: true, + }, + { + Data: []byte(`id,ival,sval +2,222,"bbb" +1,111,"aaa" +`, + ), + ExpectIsOrdered: false, + }, + { + Data: []byte(`sval,ival,id +"aaa",111,2 +"bbb",222,1 +`, + ), + ExpectIsOrdered: false, + }, + } + for _, subTest := range subTests { + require.NoError(t, mockSrc.GetStorage().WriteFile(ctx, dataFileName, subTest.Data)) + sampledIndexRatio, isRowOrderedFromSample, err := ig.sampleDataFromTable(ctx, "db01", mdTblMeta, dbInfos["db01"].Tables["tbl01"].Core, nil, defaultImportantVariables) + require.NoError(t, err) + t.Logf("%v, %v", sampledIndexRatio, isRowOrderedFromSample) + require.Greater(t, sampledIndexRatio, 1.0) + require.Equal(t, subTest.ExpectIsOrdered, isRowOrderedFromSample) + } +} + +func TestGetPreInfoEstimateSourceSize(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + dataFileName := "/db01/tbl01/tbl01.data.001.csv" + testData := []byte(`id,ival,sval +1,111,"aaa" +2,222,"bbb" +`, + ) + mockDataMap := map[string]*mock.MockDBSourceData{ + "db01": { + Name: "db01", + Tables: map[string]*mock.MockTableSourceData{ + "tbl01": { + DBName: "db01", + TableName: "tbl01", + SchemaFile: &mock.MockSourceFile{ + FileName: "/db01/tbl01/tbl01.schema.sql", + Data: []byte("CREATE TABLE db01.tbl01 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ival INTEGER, sval VARCHAR(64));"), + }, + DataFiles: []*mock.MockSourceFile{ + { + FileName: dataFileName, + Data: testData, + }, + }, + }, + }, + }, + } + mockSrc, err := mock.NewMockImportSource(mockDataMap) + require.Nil(t, err) + mockTarget := mock.NewMockTargetInfo() + cfg := config.NewConfig() + cfg.TikvImporter.Backend = config.BackendLocal + ig, err := NewPreRestoreInfoGetter(cfg, mockSrc.GetAllDBFileMetas(), mockSrc.GetStorage(), mockTarget, nil, nil) + require.NoError(t, err) + + sizeResult, err := ig.EstimateSourceDataSize(ctx) + require.NoError(t, err) + t.Logf("estimate size: %v, file size: %v, has unsorted table: %v\n", sizeResult.SizeWithIndex, sizeResult.SizeWithoutIndex, sizeResult.HasUnsortedBigTables) + require.GreaterOrEqual(t, sizeResult.SizeWithIndex, sizeResult.SizeWithoutIndex) + require.Equal(t, int64(len(testData)), sizeResult.SizeWithoutIndex) + require.False(t, sizeResult.HasUnsortedBigTables) +} diff --git a/br/pkg/lightning/restore/meta_manager.go b/br/pkg/lightning/restore/meta_manager.go index 4391f29b8c146..81aad4a8980b7 100644 --- a/br/pkg/lightning/restore/meta_manager.go +++ b/br/pkg/lightning/restore/meta_manager.go @@ -7,17 +7,16 @@ import ( "database/sql" "encoding/json" "fmt" - "strings" "github.com/pingcap/errors" - "github.com/pingcap/tidb/br/pkg/lightning/backend/tidb" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/log" verify "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/redact" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" "go.uber.org/zap" ) @@ -179,7 +178,8 @@ func (m *dbTableMetaMgr) AllocTableRowIDs(ctx context.Context, rawRowIDMax int64 if err != nil { return nil, 0, errors.Annotate(err, "enable pessimistic transaction failed") } - needAutoID := common.TableHasAutoRowID(m.tr.tableInfo.Core) || m.tr.tableInfo.Core.GetAutoIncrementColInfo() != nil || m.tr.tableInfo.Core.ContainsAutoRandomBits() + + needAutoID := common.TableHasAutoID(m.tr.tableInfo.Core) err = exec.Transact(ctx, "init table allocator base", func(ctx context.Context, tx *sql.Tx) error { rows, err := tx.QueryContext( ctx, @@ -244,44 +244,21 @@ func (m *dbTableMetaMgr) AllocTableRowIDs(ctx context.Context, rawRowIDMax int64 // no enough info are available, fetch row_id max for table if curStatus == metaStatusInitial { - if needAutoID && maxRowIDMax == 0 { - // NOTE: currently, if a table contains auto_incremental unique key and _tidb_rowid, - // the `show table next_row_id` will returns the unique key field only. - var autoIDField string - for _, col := range m.tr.tableInfo.Core.Columns { - if mysql.HasAutoIncrementFlag(col.GetFlag()) { - autoIDField = col.Name.L - break - } else if mysql.HasPriKeyFlag(col.GetFlag()) && m.tr.tableInfo.Core.AutoRandomBits > 0 { - autoIDField = col.Name.L - break - } - } - if len(autoIDField) == 0 && common.TableHasAutoRowID(m.tr.tableInfo.Core) { - autoIDField = model.ExtraHandleName.L - } - if len(autoIDField) == 0 { - return common.ErrAllocTableRowIDs.GenWithStack("table %s contains auto increment id or _tidb_rowid, but target field not found", m.tr.tableName) + if needAutoID { + // maxRowIDMax is the max row_id that other tasks has allocated, we need to rebase the global autoid base first. + if err := rebaseGlobalAutoID(ctx, maxRowIDMax, m.tr.kvStore, m.tr.dbInfo.ID, m.tr.tableInfo.Core); err != nil { + return errors.Trace(err) } - - autoIDInfos, err := tidb.FetchTableAutoIDInfos(ctx, tx, m.tr.tableName) + newRowIDBase, newRowIDMax, err = allocGlobalAutoID(ctx, rawRowIDMax, m.tr.kvStore, m.tr.dbInfo.ID, m.tr.tableInfo.Core) if err != nil { return errors.Trace(err) } - found := false - for _, info := range autoIDInfos { - if strings.ToLower(info.Column) == autoIDField { - maxRowIDMax = info.NextID - 1 - found = true - break - } - } - if !found { - return common.ErrAllocTableRowIDs.GenWithStack("can't fetch previous auto id base for table %s field '%s'", m.tr.tableName, autoIDField) - } + } else { + // Though we don't need auto ID, we still guarantee that the row ID is unique across all lightning instances. + newRowIDBase = maxRowIDMax + newRowIDMax = newRowIDBase + rawRowIDMax } - newRowIDBase = maxRowIDMax - newRowIDMax = newRowIDBase + rawRowIDMax + // table contains no data, can skip checksum if needAutoID && newRowIDBase == 0 && newStatus < metaStatusRestoreStarted { newStatus = metaStatusRestoreStarted @@ -1153,3 +1130,51 @@ func (m *singleTaskMetaMgr) CleanupAllMetas(ctx context.Context) error { func (m *singleTaskMetaMgr) Close() { } + +func allocGlobalAutoID(ctx context.Context, n int64, store kv.Storage, dbID int64, tblInfo *model.TableInfo) (autoIDBase, autoIDMax int64, err error) { + alloc, err := getGlobalAutoIDAlloc(store, dbID, tblInfo) + if err != nil { + return 0, 0, err + } + return alloc.Alloc(ctx, uint64(n), 1, 1) +} + +func rebaseGlobalAutoID(ctx context.Context, newBase int64, store kv.Storage, dbID int64, tblInfo *model.TableInfo) error { + alloc, err := getGlobalAutoIDAlloc(store, dbID, tblInfo) + if err != nil { + return err + } + return alloc.Rebase(ctx, newBase, false) +} + +func getGlobalAutoIDAlloc(store kv.Storage, dbID int64, tblInfo *model.TableInfo) (autoid.Allocator, error) { + if store == nil { + return nil, errors.New("internal error: kv store should not be nil") + } + if dbID == 0 { + return nil, errors.New("internal error: dbID should not be 0") + } + + // We don't need the cache here because we allocate all IDs at once. + // The argument for CustomAutoIncCacheOption is the cache step. step 1 means no cache. + noCache := autoid.CustomAutoIncCacheOption(1) + tblVer := autoid.AllocOptionTableInfoVersion(tblInfo.Version) + + hasRowID := common.TableHasAutoRowID(tblInfo) + hasAutoIncID := tblInfo.GetAutoIncrementColInfo() != nil + hasAutoRandID := tblInfo.ContainsAutoRandomBits() + + // Current TiDB has some limitations for auto ID. + // 1. Auto increment ID and auto row ID are using the same RowID allocator. See https://github.com/pingcap/tidb/issues/982. + // 2. Auto random column must be a clustered primary key. That is to say, there is no implicit row ID for tables with auto random column. + // 3. There is at most one auto column in a table. + // Therefore, we assume there is only one auto column in a table and use RowID allocator if possible. + switch { + case hasRowID || hasAutoIncID: + return autoid.NewAllocator(store, dbID, tblInfo.ID, tblInfo.IsAutoIncColUnsigned(), autoid.RowIDAllocType, noCache, tblVer), nil + case hasAutoRandID: + return autoid.NewAllocator(store, dbID, tblInfo.ID, tblInfo.IsAutoRandomBitColUnsigned(), autoid.AutoRandomType, noCache, tblVer), nil + default: + return nil, errors.Errorf("internal error: table %s has no auto ID", tblInfo.Name) + } +} diff --git a/br/pkg/lightning/restore/meta_manager_test.go b/br/pkg/lightning/restore/meta_manager_test.go index 8480bf077d6de..7089c8f664519 100644 --- a/br/pkg/lightning/restore/meta_manager_test.go +++ b/br/pkg/lightning/restore/meta_manager_test.go @@ -15,9 +15,13 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/store/mockstore" tmock "github.com/pingcap/tidb/util/mock" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -29,7 +33,7 @@ type metaMgrSuite struct { checksumMgr *testChecksumMgr } -func newTableRestore(t *testing.T) *TableRestore { +func newTableRestore(t *testing.T, kvStore kv.Storage) *TableRestore { p := parser.New() se := tmock.NewContext() @@ -47,12 +51,35 @@ func newTableRestore(t *testing.T) *TableRestore { Name: tb, Core: tableInfo, } + dbInfo := &checkpoints.TidbDBInfo{ + ID: 1, + Name: schema, + Tables: map[string]*checkpoints.TidbTableInfo{ + tb: ti, + }, + } + + ctx := kv.WithInternalSourceType(context.Background(), "test") + err = kv.RunInNewTxn(ctx, kvStore, false, func(ctx context.Context, txn kv.Transaction) error { + m := meta.NewMeta(txn) + if err := m.CreateDatabase(&model.DBInfo{ID: dbInfo.ID}); err != nil { + return err + } + if err := m.CreateTableOrView(dbInfo.ID, ti.Core); err != nil { + return err + } + return nil + }) + require.NoError(t, err) tableName := common.UniqueTable(schema, tb) logger := log.With(zap.String("table", tableName)) + return &TableRestore{ + dbInfo: dbInfo, tableName: tableName, tableInfo: ti, + kvStore: kvStore, logger: logger, } } @@ -61,18 +88,24 @@ func newMetaMgrSuite(t *testing.T) (*metaMgrSuite, func()) { db, m, err := sqlmock.New() require.NoError(t, err) + storePath := t.TempDir() + kvStore, err := mockstore.NewMockStore(mockstore.WithPath(storePath)) + require.NoError(t, err) + var s metaMgrSuite s.mgr = &dbTableMetaMgr{ session: db, taskID: 1, - tr: newTableRestore(t), + tr: newTableRestore(t, kvStore), tableName: common.UniqueTable("test", TableMetaTableName), needChecksum: true, } s.mockDB = m s.checksumMgr = &testChecksumMgr{} + return &s, func() { require.NoError(t, s.mockDB.ExpectationsWereMet()) + require.NoError(t, kvStore.Close()) } } @@ -257,10 +290,11 @@ func (s *metaMgrSuite) prepareMock(rowsVal [][]driver.Value, nextRowID *int64, u 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) + if nextRowID != nil { - s.mockDB.ExpectQuery("SHOW TABLE `test`.`t1` NEXT_ROW_ID"). - WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID", "ID_TYPE"}). - AddRow("test", "t1", "_tidb_rowid", *nextRowID, "AUTO_INCREMENT")) + allocs := autoid.NewAllocatorsFromTblInfo(s.mgr.tr.kvStore, s.mgr.tr.dbInfo.ID, s.mgr.tr.tableInfo.Core) + alloc := allocs.Get(autoid.RowIDAllocType) + alloc.ForceRebase(*nextRowID - 1) } if len(updateArgs) > 0 { diff --git a/br/pkg/lightning/restore/mock/BUILD.bazel b/br/pkg/lightning/restore/mock/BUILD.bazel new file mode 100644 index 0000000000000..99b0018ee1bd1 --- /dev/null +++ b/br/pkg/lightning/restore/mock/BUILD.bazel @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "mock", + srcs = ["mock.go"], + importpath = "github.com/pingcap/tidb/br/pkg/lightning/restore/mock", + visibility = ["//visibility:public"], + deps = [ + "//br/pkg/lightning/mydump", + "//br/pkg/storage", + "//parser/model", + "//store/pdtypes", + "//util/filter", + "@com_github_pingcap_errors//:errors", + ], +) + +go_test( + name = "mock_test", + srcs = ["mock_test.go"], + embed = [":mock"], + deps = [ + "//br/pkg/lightning/restore", + "//parser/model", + "@com_github_stretchr_testify//require", + ], +) diff --git a/br/pkg/lightning/restore/mock/mock.go b/br/pkg/lightning/restore/mock/mock.go new file mode 100644 index 0000000000000..100372b594620 --- /dev/null +++ b/br/pkg/lightning/restore/mock/mock.go @@ -0,0 +1,283 @@ +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mock + +import ( + "context" + "strings" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/store/pdtypes" + "github.com/pingcap/tidb/util/filter" +) + +// MockSourceFile defines a mock source file. +type MockSourceFile struct { + FileName string + Data []byte + TotalSize int +} + +// MockTableSourceData defines a mock source information for a table. +type MockTableSourceData struct { + DBName string + TableName string + SchemaFile *MockSourceFile + DataFiles []*MockSourceFile +} + +// MockDBSourceData defines a mock source information for a database. +type MockDBSourceData struct { + Name string + Tables map[string]*MockTableSourceData +} + +// MockImportSource defines a mock import source +type MockImportSource struct { + dbSrcDataMap map[string]*MockDBSourceData + dbFileMetaMap map[string]*mydump.MDDatabaseMeta + srcStorage storage.ExternalStorage +} + +// NewMockImportSource creates a MockImportSource object. +func NewMockImportSource(dbSrcDataMap map[string]*MockDBSourceData) (*MockImportSource, error) { + ctx := context.Background() + dbFileMetaMap := make(map[string]*mydump.MDDatabaseMeta) + mapStore := storage.NewMemStorage() + for dbName, dbData := range dbSrcDataMap { + dbFileInfo := mydump.FileInfo{ + TableName: filter.Table{ + Schema: dbName, + }, + FileMeta: mydump.SourceFileMeta{Type: mydump.SourceTypeSchemaSchema}, + } + dbMeta := mydump.NewMDDatabaseMeta("binary") + dbMeta.Name = dbName + dbMeta.SchemaFile = dbFileInfo + dbMeta.Tables = []*mydump.MDTableMeta{} + for tblName, tblData := range dbData.Tables { + tblMeta := mydump.NewMDTableMeta("binary") + tblMeta.DB = dbName + tblMeta.Name = tblName + tblMeta.SchemaFile = mydump.FileInfo{ + TableName: filter.Table{ + Schema: dbName, + Name: tblName, + }, + FileMeta: mydump.SourceFileMeta{ + Path: tblData.SchemaFile.FileName, + Type: mydump.SourceTypeTableSchema, + }, + } + tblMeta.DataFiles = []mydump.FileInfo{} + if err := mapStore.WriteFile(ctx, tblData.SchemaFile.FileName, tblData.SchemaFile.Data); err != nil { + return nil, errors.Trace(err) + } + totalFileSize := 0 + for _, tblDataFile := range tblData.DataFiles { + fileSize := tblDataFile.TotalSize + if fileSize == 0 { + fileSize = len(tblDataFile.Data) + } + totalFileSize += fileSize + fileInfo := mydump.FileInfo{ + TableName: filter.Table{ + Schema: dbName, + Name: tblName, + }, + FileMeta: mydump.SourceFileMeta{ + Path: tblDataFile.FileName, + FileSize: int64(fileSize), + }, + } + switch { + case strings.HasSuffix(tblDataFile.FileName, ".csv"): + fileInfo.FileMeta.Type = mydump.SourceTypeCSV + case strings.HasSuffix(tblDataFile.FileName, ".sql"): + fileInfo.FileMeta.Type = mydump.SourceTypeSQL + default: + return nil, errors.Errorf("unsupported file type: %s", tblDataFile.FileName) + } + tblMeta.DataFiles = append(tblMeta.DataFiles, fileInfo) + if err := mapStore.WriteFile(ctx, tblDataFile.FileName, tblDataFile.Data); err != nil { + return nil, errors.Trace(err) + } + } + tblMeta.TotalSize = int64(totalFileSize) + dbMeta.Tables = append(dbMeta.Tables, tblMeta) + } + dbFileMetaMap[dbName] = dbMeta + } + return &MockImportSource{ + dbSrcDataMap: dbSrcDataMap, + dbFileMetaMap: dbFileMetaMap, + srcStorage: mapStore, + }, nil +} + +// GetStorage gets the External Storage object on the mock source. +func (m *MockImportSource) GetStorage() storage.ExternalStorage { + return m.srcStorage +} + +// GetDBMetaMap gets the Mydumper database metadata map on the mock source. +func (m *MockImportSource) GetDBMetaMap() map[string]*mydump.MDDatabaseMeta { + return m.dbFileMetaMap +} + +// GetAllDBFileMetas gets all the Mydumper database metadatas on the mock source. +func (m *MockImportSource) GetAllDBFileMetas() []*mydump.MDDatabaseMeta { + result := make([]*mydump.MDDatabaseMeta, len(m.dbFileMetaMap)) + i := 0 + for _, dbMeta := range m.dbFileMetaMap { + result[i] = dbMeta + i++ + } + return result +} + +// StorageInfo defines the storage information for a mock target. +type StorageInfo struct { + TotalSize uint64 + UsedSize uint64 + AvailableSize uint64 +} + +// MockTableInfo defines a mock table structure information for a mock target. +type MockTableInfo struct { + RowCount int + TableModel *model.TableInfo +} + +// MockTableInfo defines a mock target information. +type MockTargetInfo struct { + MaxReplicasPerRegion int + EmptyRegionCount int + StorageInfos []StorageInfo + sysVarMap map[string]string + dbTblInfoMap map[string]map[string]*MockTableInfo +} + +// NewMockTargetInfo creates a MockTargetInfo object. +func NewMockTargetInfo() *MockTargetInfo { + return &MockTargetInfo{ + StorageInfos: []StorageInfo{}, + sysVarMap: make(map[string]string), + dbTblInfoMap: make(map[string]map[string]*MockTableInfo), + } +} + +// SetSysVar sets the system variables of the mock target. +func (t *MockTargetInfo) SetSysVar(key string, value string) { + t.sysVarMap[key] = value +} + +// SetTableInfo sets the table structure information of the mock target. +func (t *MockTargetInfo) SetTableInfo(schemaName string, tableName string, tblInfo *MockTableInfo) { + if _, ok := t.dbTblInfoMap[schemaName]; !ok { + t.dbTblInfoMap[schemaName] = make(map[string]*MockTableInfo) + } + t.dbTblInfoMap[schemaName][tableName] = tblInfo +} + +// FetchRemoteTableModels fetches the table structures from the remote target. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) FetchRemoteTableModels(ctx context.Context, schemaName string) ([]*model.TableInfo, error) { + resultInfos := []*model.TableInfo{} + tblMap, ok := t.dbTblInfoMap[schemaName] + if !ok { + return resultInfos, nil + } + for _, tblInfo := range tblMap { + resultInfos = append(resultInfos, tblInfo.TableModel) + } + return resultInfos, nil +} + +// GetTargetSysVariablesForImport gets some important systam variables for importing on the target. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) GetTargetSysVariablesForImport(ctx context.Context) map[string]string { + result := make(map[string]string) + for k, v := range t.sysVarMap { + result[k] = v + } + return result +} + +// GetReplicationConfig gets the replication config on the target. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) GetReplicationConfig(ctx context.Context) (*pdtypes.ReplicationConfig, error) { + return &pdtypes.ReplicationConfig{ + MaxReplicas: uint64(t.MaxReplicasPerRegion), + }, nil +} + +// GetStorageInfo gets the storage information on the target. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) GetStorageInfo(ctx context.Context) (*pdtypes.StoresInfo, error) { + resultStoreInfos := make([]*pdtypes.StoreInfo, len(t.StorageInfos)) + for i, storeInfo := range t.StorageInfos { + resultStoreInfos[i] = &pdtypes.StoreInfo{ + Status: &pdtypes.StoreStatus{ + Capacity: pdtypes.ByteSize(storeInfo.TotalSize), + Available: pdtypes.ByteSize(storeInfo.AvailableSize), + UsedSize: pdtypes.ByteSize(storeInfo.UsedSize), + }, + } + } + return &pdtypes.StoresInfo{ + Count: len(resultStoreInfos), + Stores: resultStoreInfos, + }, nil +} + +// GetEmptyRegionsInfo gets the region information of all the empty regions on the target. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) GetEmptyRegionsInfo(ctx context.Context) (*pdtypes.RegionsInfo, error) { + regions := make([]pdtypes.RegionInfo, t.EmptyRegionCount) + for i := 0; i < t.EmptyRegionCount; i++ { + regions[i] = pdtypes.RegionInfo{} + } + return &pdtypes.RegionsInfo{ + Count: t.EmptyRegionCount, + Regions: regions, + }, nil +} + +// IsTableEmpty checks whether the specified table on the target DB contains data or not. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) IsTableEmpty(ctx context.Context, schemaName string, tableName string) (*bool, error) { + var result bool + tblInfoMap, ok := t.dbTblInfoMap[schemaName] + if !ok { + result = true + return &result, nil + } + tblInfo, ok := tblInfoMap[tableName] + if !ok { + result = true + return &result, nil + } + result = (tblInfo.RowCount == 0) + return &result, nil +} + +// CheckVersionRequirements performs the check whether the target satisfies the version requirements. +// It implements the TargetInfoGetter interface. +func (t *MockTargetInfo) CheckVersionRequirements(ctx context.Context) error { + return nil +} diff --git a/br/pkg/lightning/restore/mock/mock_test.go b/br/pkg/lightning/restore/mock/mock_test.go new file mode 100644 index 0000000000000..9c5b2b0cad6e0 --- /dev/null +++ b/br/pkg/lightning/restore/mock/mock_test.go @@ -0,0 +1,200 @@ +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package mock + +import ( + "bytes" + "context" + "testing" + + "github.com/pingcap/tidb/br/pkg/lightning/restore" + "github.com/pingcap/tidb/parser/model" + "github.com/stretchr/testify/require" +) + +func TestMockImportSourceBasic(t *testing.T) { + mockDataMap := map[string]*MockDBSourceData{ + "db01": { + Name: "db01", + Tables: map[string]*MockTableSourceData{ + "tbl01": { + DBName: "db01", + TableName: "tbl01", + SchemaFile: &MockSourceFile{ + FileName: "/db01/tbl01/tbl01.schema.sql", + Data: []byte("CREATE TABLE db01.tbl01(id INTEGER PRIMARY KEY AUTO_INCREMENT, strval VARCHAR(64))"), + }, + }, + "tbl02": { + DBName: "db01", + TableName: "tbl02", + SchemaFile: &MockSourceFile{ + FileName: "/db01/tbl02/tbl02.schema.sql", + Data: []byte("CREATE TABLE db01.tbl02(id INTEGER PRIMARY KEY AUTO_INCREMENT, val VARCHAR(64))"), + }, + DataFiles: []*MockSourceFile{ + { + FileName: "/db01/tbl02/tbl02.data.csv", + Data: []byte("val\naaa\nbbb"), + }, + { + FileName: "/db01/tbl02/tbl02.data.sql", + Data: []byte("INSERT INTO db01.tbl02 (val) VALUES ('ccc');"), + }, + }, + }, + }, + }, + "db02": { + Name: "db02", + Tables: map[string]*MockTableSourceData{ + "tbl01": { + DBName: "db02", + TableName: "tbl01", + SchemaFile: &MockSourceFile{ + FileName: "/db02/tbl01/tbl01.schema.sql", + Data: []byte("CREATE TABLE db02.tbl01(id INTEGER PRIMARY KEY AUTO_INCREMENT, strval VARCHAR(64))"), + }, + }, + }, + }, + } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockEnv, err := NewMockImportSource(mockDataMap) + require.Nil(t, err) + dbFileMetas := mockEnv.GetAllDBFileMetas() + require.Equal(t, len(mockDataMap), len(dbFileMetas), "compare db count") + for _, dbFileMeta := range dbFileMetas { + dbMockData, ok := mockDataMap[dbFileMeta.Name] + require.Truef(t, ok, "get mock data by DB: %s", dbFileMeta.Name) + require.Equalf(t, len(dbMockData.Tables), len(dbFileMeta.Tables), "compare table count: %s", dbFileMeta.Name) + for _, tblFileMeta := range dbFileMeta.Tables { + tblMockData, ok := dbMockData.Tables[tblFileMeta.Name] + require.Truef(t, ok, "get mock data by Table: %s.%s", dbFileMeta.Name, tblFileMeta.Name) + schemaFileMeta := tblFileMeta.SchemaFile + mockSchemaFile := tblMockData.SchemaFile + fileData, err := mockEnv.srcStorage.ReadFile(ctx, schemaFileMeta.FileMeta.Path) + require.Nilf(t, err, "read schema file: %s.%s", dbFileMeta.Name, tblFileMeta.Name) + require.Truef(t, bytes.Equal(mockSchemaFile.Data, fileData), "compare schema file: %s.%s", dbFileMeta.Name, tblFileMeta.Name) + require.Equalf(t, len(tblMockData.DataFiles), len(tblFileMeta.DataFiles), "compare data file count: %s.%s", dbFileMeta.Name, tblFileMeta.Name) + for i, dataFileMeta := range tblFileMeta.DataFiles { + mockDataFile := tblMockData.DataFiles[i] + fileData, err := mockEnv.srcStorage.ReadFile(ctx, dataFileMeta.FileMeta.Path) + require.Nilf(t, err, "read data file: %s.%s: %s", dbFileMeta.Name, tblFileMeta.Name, dataFileMeta.FileMeta.Path) + require.Truef(t, bytes.Equal(mockDataFile.Data, fileData), "compare data file: %s.%s: %s", dbFileMeta.Name, tblFileMeta.Name, dataFileMeta.FileMeta.Path) + } + } + } +} + +func TestMockTargetInfoBasic(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + ti := NewMockTargetInfo() + var _ restore.TargetInfoGetter = ti + const replicaCount = 3 + const emptyRegionCount = 5 + const s01TotalSize uint64 = 10 << 30 + const s01UsedSize uint64 = 7<<30 + 500<<20 + const s02TotalSize uint64 = 50 << 30 + const s02UsedSize uint64 = 35<<30 + 700<<20 + + ti.SetSysVar("aaa", "111") + ti.SetSysVar("bbb", "222") + sysVars := ti.GetTargetSysVariablesForImport(ctx) + v, ok := sysVars["aaa"] + require.True(t, ok) + require.Equal(t, "111", v) + v, ok = sysVars["bbb"] + require.True(t, ok) + require.Equal(t, "222", v) + + ti.MaxReplicasPerRegion = replicaCount + rcfg, err := ti.GetReplicationConfig(ctx) + require.NoError(t, err) + require.Equal(t, uint64(replicaCount), rcfg.MaxReplicas) + + ti.StorageInfos = append(ti.StorageInfos, + StorageInfo{ + TotalSize: s01TotalSize, + UsedSize: s01UsedSize, + AvailableSize: s01TotalSize - s01UsedSize, + }, + StorageInfo{ + TotalSize: s02TotalSize, + UsedSize: s02UsedSize, + AvailableSize: s02TotalSize - s02UsedSize, + }, + ) + si, err := ti.GetStorageInfo(ctx) + 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)) + store = si.Stores[1] + require.Equal(t, s02TotalSize, uint64(store.Status.Capacity)) + require.Equal(t, s02UsedSize, uint64(store.Status.UsedSize)) + + ti.EmptyRegionCount = emptyRegionCount + ri, err := ti.GetEmptyRegionsInfo(ctx) + require.NoError(t, err) + require.Equal(t, emptyRegionCount, ri.Count) + require.Equal(t, emptyRegionCount, len(ri.Regions)) + + ti.SetTableInfo("testdb", "testtbl1", + &MockTableInfo{ + TableModel: &model.TableInfo{ + ID: 1, + Name: model.NewCIStr("testtbl1"), + Columns: []*model.ColumnInfo{ + { + ID: 1, + Name: model.NewCIStr("c_1"), + Offset: 0, + }, + { + ID: 2, + Name: model.NewCIStr("c_2"), + Offset: 1, + }, + }, + }, + }, + ) + ti.SetTableInfo("testdb", "testtbl2", + &MockTableInfo{ + RowCount: 100, + }, + ) + tblInfos, err := ti.FetchRemoteTableModels(ctx, "testdb") + require.NoError(t, err) + require.Equal(t, 2, len(tblInfos)) + for _, tblInfo := range tblInfos { + if tblInfo == nil { + continue + } + require.Equal(t, 2, len(tblInfo.Columns)) + } + + isEmptyPtr, err := ti.IsTableEmpty(ctx, "testdb", "testtbl1") + require.NoError(t, err) + require.NotNil(t, isEmptyPtr) + require.True(t, *isEmptyPtr) + isEmptyPtr, err = ti.IsTableEmpty(ctx, "testdb", "testtbl2") + require.NoError(t, err) + require.NotNil(t, isEmptyPtr) + require.False(t, *isEmptyPtr) +} diff --git a/br/pkg/lightning/restore/restore.go b/br/pkg/lightning/restore/restore.go index 9cff45ce84de9..0de2061e4a4f6 100644 --- a/br/pkg/lightning/restore/restore.go +++ b/br/pkg/lightning/restore/restore.go @@ -53,15 +53,16 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/br/pkg/version/build" + tidbkv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mathutil" pd "github.com/tikv/pd/client" "go.uber.org/atomic" "go.uber.org/multierr" "go.uber.org/zap" - "golang.org/x/exp/maps" ) const ( @@ -222,6 +223,8 @@ type Controller struct { diskQuotaState atomic.Int32 compactState atomic.Int32 status *LightningStatus + + preInfoGetter PreRestoreInfoGetter } type LightningStatus struct { @@ -363,6 +366,24 @@ func NewRestoreControllerWithPauser( default: metaBuilder = noopMetaMgrBuilder{} } + ioWorkers := worker.NewPool(ctx, cfg.App.IOConcurrency, "io") + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: cfg, + targetDBGlue: p.Glue, + tls: tls, + backend: backend, + } + preInfoGetter, err := NewPreRestoreInfoGetter( + cfg, + p.DBMetas, + p.DumpFileStorage, + targetInfoGetter, + ioWorkers, + backend, + ) + if err != nil { + return nil, errors.Trace(err) + } rc := &Controller{ taskCtx: ctx, @@ -371,7 +392,7 @@ func NewRestoreControllerWithPauser( tableWorkers: nil, indexWorkers: nil, regionWorkers: worker.NewPool(ctx, cfg.App.RegionConcurrency, "region"), - ioWorkers: worker.NewPool(ctx, cfg.App.IOConcurrency, "io"), + ioWorkers: ioWorkers, checksumWorks: worker.NewPool(ctx, cfg.TiDB.ChecksumTableConcurrency, "checksum"), pauser: p.Pauser, backend: backend, @@ -391,6 +412,8 @@ func NewRestoreControllerWithPauser( errorMgr: errorMgr, status: p.Status, taskMgr: nil, + + preInfoGetter: preInfoGetter, } return rc, nil @@ -431,7 +454,6 @@ outside: break outside default: logger.Error("run failed") - fmt.Fprintf(os.Stderr, "Error: %s\n", err) break outside // ps : not continue } } @@ -712,26 +734,32 @@ func (rc *Controller) restoreSchema(ctx context.Context) error { for i := 0; i < concurrency; i++ { go worker.doJob() } - getTableFunc := rc.backend.FetchRemoteTableModels - if !rc.tidbGlue.OwnsSQLExecutor() { - getTableFunc = rc.tidbGlue.GetTables - } - err := worker.makeJobs(rc.dbMetas, getTableFunc) + err := worker.makeJobs(rc.dbMetas, rc.preInfoGetter.FetchRemoteTableModels) logTask.End(zap.ErrorLevel, err) if err != nil { return err } - dbInfos, err := LoadSchemaInfo(ctx, rc.dbMetas, getTableFunc) + dbInfos, err := rc.preInfoGetter.GetAllTableStructures(ctx) if err != nil { return errors.Trace(err) } + // For local backend, we need DBInfo.ID to operate the global autoid allocator. + if isLocalBackend(rc.cfg) { + dbs, err := tikv.FetchRemoteDBModelsFromTLS(ctx, rc.tls) + if err != nil { + return errors.Trace(err) + } + dbIDs := make(map[string]int64) + for _, db := range dbs { + dbIDs[db.Name.L] = db.ID + } + for _, dbInfo := range dbInfos { + dbInfo.ID = dbIDs[strings.ToLower(dbInfo.Name)] + } + } rc.dbInfos = dbInfos - - sysVars := ObtainImportantVariables(ctx, rc.tidbGlue.GetSQLExecutor(), !rc.isTiDBBackend()) - // override by manually set vars - maps.Copy(sysVars, rc.cfg.TiDB.Vars) - rc.sysVars = sysVars + rc.sysVars = rc.preInfoGetter.GetTargetSysVariablesForImport(ctx) return nil } @@ -1251,7 +1279,9 @@ func (rc *Controller) buildRunPeriodicActionAndCancelFunc(ctx context.Context, s } } -var checksumManagerKey struct{} +type checksumManagerKeyType struct{} + +var checksumManagerKey checksumManagerKeyType const ( pauseGCTTLForDupeRes = time.Hour @@ -1379,13 +1409,17 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { switchBack := false cleanup := false postProgress := func() error { return nil } - if rc.cfg.TikvImporter.Backend == config.BackendLocal { - var restoreFn pdutil.UndoFunc + var kvStore tidbkv.Storage + + if isLocalBackend(rc.cfg) { + var ( + restoreFn pdutil.UndoFunc + err error + ) if !rc.taskMgr.CanPauseSchedulerByKeyRange() { logTask.Info("removing PD leader®ion schedulers") - var err error restoreFn, err = rc.taskMgr.CheckAndPausePdSchedulers(ctx) if err != nil { return errors.Trace(err) @@ -1415,6 +1449,20 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { rc.taskMgr.Close() } } + + // Disable GC because TiDB enables GC already. + kvStore, err = driver.TiKVDriver{}.OpenWithOptions( + fmt.Sprintf("tikv://%s?disableGC=true", rc.cfg.TiDB.PdAddr), + driver.WithSecurity(rc.tls.ToTiKVSecurityConfig()), + ) + if err != nil { + return errors.Trace(err) + } + manager, err := newChecksumManager(ctx, rc, kvStore) + if err != nil { + return errors.Trace(err) + } + ctx = context.WithValue(ctx, &checksumManagerKey, manager) } type task struct { @@ -1459,28 +1507,28 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { logTask.Warn("failed to clean table task metas, you may need to restore them manually", zap.Error(err)) } } + if kvStore != nil { + if err := kvStore.Close(); err != nil { + logTask.Warn("failed to close kv store", zap.Error(err)) + } + } }() taskCh := make(chan task, rc.cfg.App.IndexConcurrency) defer close(taskCh) - manager, err := newChecksumManager(ctx, rc) - if err != nil { - return errors.Trace(err) - } - ctx2 := context.WithValue(ctx, &checksumManagerKey, manager) for i := 0; i < rc.cfg.App.IndexConcurrency; i++ { go func() { for task := range taskCh { tableLogTask := task.tr.logger.Begin(zap.InfoLevel, "restore table") web.BroadcastTableCheckpoint(task.tr.tableName, task.cp) - needPostProcess, err := task.tr.restoreTable(ctx2, rc, task.cp) + needPostProcess, err := task.tr.restoreTable(ctx, rc, task.cp) err = common.NormalizeOrWrapErr(common.ErrRestoreTable, err, task.tr.tableName) tableLogTask.End(zap.ErrorLevel, err) web.BroadcastError(task.tr.tableName, err) - if m, ok := metric.FromContext(ctx2); ok { + if m, ok := metric.FromContext(ctx); ok { m.RecordTableCount(metric.TableStateCompleted, err) } restoreErr.Set(err) @@ -1510,7 +1558,7 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { if err != nil { return errors.Trace(err) } - tr, err := NewTableRestore(tableName, tableMeta, dbInfo, tableInfo, cp, igCols.ColumnsMap(), log.FromContext(ctx)) + tr, err := NewTableRestore(tableName, tableMeta, dbInfo, tableInfo, cp, igCols.ColumnsMap(), kvStore, log.FromContext(ctx)) if err != nil { return errors.Trace(err) } @@ -1548,7 +1596,7 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { // if context is done, should return directly select { case <-ctx.Done(): - err = restoreErr.Get() + err := restoreErr.Get() if err == nil { err = ctx.Err() } @@ -1567,7 +1615,7 @@ func (rc *Controller) restoreTables(ctx context.Context) (finalErr error) { for task := range postProcessTaskChan { metaMgr := rc.metaMgrBuilder.TableMetaMgr(task.tr) // force all the remain post-process tasks to be executed - _, err2 := task.tr.postProcess(ctx2, rc, task.cp, true, metaMgr) + _, err2 := task.tr.postProcess(ctx, rc, task.cp, true, metaMgr) restoreErr.Set(err2) } }() @@ -1619,7 +1667,7 @@ func (tr *TableRestore) restoreTable( versionInfo := version.ParseServerInfo(versionStr) // "show table next_row_id" is only available after tidb v4.0.0 - if versionInfo.ServerVersion.Major >= 4 && rc.isLocalBackend() { + if versionInfo.ServerVersion.Major >= 4 && isLocalBackend(rc.cfg) { // first, insert a new-line into meta table if err = metaMgr.InitTableMeta(ctx); err != nil { return false, err @@ -1729,7 +1777,7 @@ func (rc *Controller) switchToNormalMode(ctx context.Context) { func (rc *Controller) switchTiKVMode(ctx context.Context, mode sstpb.SwitchMode) { // // tidb backend don't need to switch tikv to import mode - if rc.isTiDBBackend() { + if isTiDBBackend(rc.cfg) { return } @@ -1848,7 +1896,7 @@ func (rc *Controller) enforceDiskQuota(ctx context.Context) { func (rc *Controller) setGlobalVariables(ctx context.Context) error { // skip for tidb backend to be compatible with MySQL - if rc.isTiDBBackend() { + if isTiDBBackend(rc.cfg) { return nil } // set new collation flag base on tidb config @@ -1897,12 +1945,12 @@ func (rc *Controller) cleanCheckpoints(ctx context.Context) error { return nil } -func (rc *Controller) isLocalBackend() bool { - return rc.cfg.TikvImporter.Backend == config.BackendLocal +func isLocalBackend(cfg *config.Config) bool { + return cfg.TikvImporter.Backend == config.BackendLocal } -func (rc *Controller) isTiDBBackend() bool { - return rc.cfg.TikvImporter.Backend == config.BackendTiDB +func isTiDBBackend(cfg *config.Config) bool { + return cfg.TikvImporter.Backend == config.BackendTiDB } // preCheckRequirements checks @@ -1912,6 +1960,8 @@ func (rc *Controller) isTiDBBackend() bool { // 4. Lightning configuration // before restore tables start. func (rc *Controller) preCheckRequirements(ctx context.Context) error { + ctx = WithPreInfoGetterSysVarsCache(ctx, rc.sysVars) + ctx = WithPreInfoGetterTableStructuresCache(ctx, rc.dbInfos) if err := rc.DataCheck(ctx); err != nil { return errors.Trace(err) } @@ -1933,11 +1983,22 @@ func (rc *Controller) preCheckRequirements(ctx context.Context) error { // We still need to sample source data even if this task has existed, because we need to judge whether the // source is in order as row key to decide how to sort local data. - source, err := rc.estimateSourceData(ctx) + estimatedSizeResult, err := rc.preInfoGetter.EstimateSourceDataSize(ctx) if err != nil { return common.ErrCheckDataSource.Wrap(err).GenWithStackByArgs() } - if rc.isLocalBackend() { + estimatedDataSizeWithIndex := estimatedSizeResult.SizeWithIndex + + // Do not import with too large concurrency because these data may be all unsorted. + if estimatedSizeResult.HasUnsortedBigTables { + if rc.cfg.App.TableConcurrency > rc.cfg.App.IndexConcurrency { + rc.cfg.App.TableConcurrency = rc.cfg.App.IndexConcurrency + } + } + if rc.status != nil { + rc.status.TotalFileSize.Store(estimatedSizeResult.SizeWithoutIndex) + } + if isLocalBackend(rc.cfg) { pdController, err := pdutil.NewPdController(ctx, rc.cfg.TiDB.PdAddr, rc.tls.TLSConfig(), rc.tls.ToPDSecurityOption()) if err != nil { @@ -1951,7 +2012,7 @@ func (rc *Controller) preCheckRequirements(ctx context.Context) error { return common.ErrMetaMgrUnknown.Wrap(err).GenWithStackByArgs() } if !taskExist { - if err = rc.taskMgr.InitTask(ctx, source); err != nil { + if err = rc.taskMgr.InitTask(ctx, estimatedDataSizeWithIndex); err != nil { return common.ErrMetaMgrUnknown.Wrap(err).GenWithStackByArgs() } } @@ -1967,11 +2028,11 @@ func (rc *Controller) preCheckRequirements(ctx context.Context) error { needCheck = taskCheckpoints == nil } if needCheck { - err = rc.localResource(ctx, source) + err = rc.localResource(ctx, estimatedDataSizeWithIndex) if err != nil { return common.ErrCheckLocalResource.Wrap(err).GenWithStackByArgs() } - if err := rc.clusterResource(ctx, source); err != nil { + if err := rc.clusterResource(ctx, estimatedDataSizeWithIndex); err != nil { if err1 := rc.taskMgr.CleanupTask(ctx); err1 != nil { log.FromContext(ctx).Warn("cleanup task failed", zap.Error(err1)) return common.ErrMetaMgrUnknown.Wrap(err).GenWithStackByArgs() @@ -2300,7 +2361,7 @@ func (cr *chunkRestore) deliverLoop( // can safely update current checkpoint. failpoint.Inject("LocalBackendSaveCheckpoint", func() { - if !rc.isLocalBackend() && (dataChecksum.SumKVS() != 0 || indexChecksum.SumKVS() != 0) { + if !isLocalBackend(rc.cfg) && (dataChecksum.SumKVS() != 0 || indexChecksum.SumKVS() != 0) { // No need to save checkpoint if nothing was delivered. saveCheckpoint(rc, t, engineID, cr.chunk) } diff --git a/br/pkg/lightning/restore/restore_schema_test.go b/br/pkg/lightning/restore/restore_schema_test.go index d7a585f0c10a3..a0f962abec6d2 100644 --- a/br/pkg/lightning/restore/restore_schema_test.go +++ b/br/pkg/lightning/restore/restore_schema_test.go @@ -42,10 +42,12 @@ import ( type restoreSchemaSuite struct { suite.Suite - ctx context.Context - rc *Controller - controller *gomock.Controller - tableInfos []*model.TableInfo + ctx context.Context + rc *Controller + controller *gomock.Controller + tableInfos []*model.TableInfo + infoGetter *PreRestoreInfoGetterImpl + targetInfoGetter *TargetInfoGetterImpl } func TestRestoreSchemaSuite(t *testing.T) { @@ -103,14 +105,29 @@ func (s *restoreSchemaSuite) SetupSuite() { config.Mydumper.CharacterSet = "utf8mb4" config.App.RegionConcurrency = 8 mydumpLoader, err := mydump.NewMyDumpLoaderWithStore(ctx, config, store) - require.NoError(s.T(), err) + s.Require().NoError(err) + + dbMetas := mydumpLoader.GetDatabases() + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: config, + } + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: config, + srcStorage: store, + targetInfoGetter: targetInfoGetter, + dbMetas: dbMetas, + } + preInfoGetter.Init() s.rc = &Controller{ checkTemplate: NewSimpleTemplate(), cfg: config, store: store, - dbMetas: mydumpLoader.GetDatabases(), + dbMetas: dbMetas, checkpointsDB: &checkpoints.NullCheckpointsDB{}, + preInfoGetter: preInfoGetter, } + s.infoGetter = preInfoGetter + s.targetInfoGetter = targetInfoGetter } //nolint:interfacer // change test case signature might cause Check failed to find this test case? @@ -122,7 +139,9 @@ func (s *restoreSchemaSuite) SetupTest() { AnyTimes(). Return(s.tableInfos, nil) mockBackend.EXPECT().Close() - s.rc.backend = backend.MakeBackend(mockBackend) + theBackend := backend.MakeBackend(mockBackend) + s.rc.backend = theBackend + s.targetInfoGetter.backend = theBackend mockDB, sqlMock, err := sqlmock.New() require.NoError(s.T(), err) @@ -140,6 +159,7 @@ func (s *restoreSchemaSuite) SetupTest() { GetParser(). AnyTimes(). Return(parser) + s.targetInfoGetter.targetDBGlue = mockTiDBGlue s.rc.tidbGlue = mockTiDBGlue } @@ -152,6 +172,7 @@ func (s *restoreSchemaSuite) TearDownTest() { AnyTimes(). Return(exec) s.rc.tidbGlue = mockTiDBGlue + s.targetInfoGetter.targetDBGlue = mockTiDBGlue s.rc.Close() s.controller.Finish() @@ -213,6 +234,7 @@ func (s *restoreSchemaSuite) TestRestoreSchemaFailed() { AnyTimes(). Return(parser) s.rc.tidbGlue = mockTiDBGlue + s.targetInfoGetter.targetDBGlue = mockTiDBGlue err = s.rc.restoreSchema(s.ctx) require.Error(s.T(), err) require.True(s.T(), errors.ErrorEqual(err, injectErr)) @@ -268,6 +290,7 @@ func (s *restoreSchemaSuite) TestRestoreSchemaContextCancel() { AnyTimes(). Return(parser) s.rc.tidbGlue = mockTiDBGlue + s.targetInfoGetter.targetDBGlue = mockTiDBGlue err = s.rc.restoreSchema(childCtx) cancel() require.Error(s.T(), err) diff --git a/br/pkg/lightning/restore/restore_test.go b/br/pkg/lightning/restore/restore_test.go index 73996b08d3987..6c210b052d1dd 100644 --- a/br/pkg/lightning/restore/restore_test.go +++ b/br/pkg/lightning/restore/restore_test.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/errormanager" "github.com/pingcap/tidb/br/pkg/lightning/glue" "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/version/build" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/parser" @@ -62,6 +63,7 @@ func TestNewTableRestore(t *testing.T) { dbInfo.Tables[tc.name] = &checkpoints.TidbTableInfo{ Name: tc.name, + DB: dbInfo.Name, Core: tableInfo, } } @@ -69,7 +71,7 @@ func TestNewTableRestore(t *testing.T) { for _, tc := range testCases { tableInfo := dbInfo.Tables[tc.name] tableName := common.UniqueTable("mockdb", tableInfo.Name) - tr, err := NewTableRestore(tableName, nil, dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil, log.L()) + tr, err := NewTableRestore(tableName, nil, dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil, nil, log.L()) require.NotNil(t, tr) require.NoError(t, err) } @@ -78,6 +80,7 @@ func TestNewTableRestore(t *testing.T) { func TestNewTableRestoreFailure(t *testing.T) { tableInfo := &checkpoints.TidbTableInfo{ Name: "failure", + DB: "mockdb", Core: &model.TableInfo{}, } dbInfo := &checkpoints.TidbDBInfo{Name: "mockdb", Tables: map[string]*checkpoints.TidbTableInfo{ @@ -85,7 +88,7 @@ func TestNewTableRestoreFailure(t *testing.T) { }} tableName := common.UniqueTable("mockdb", "failure") - _, err := NewTableRestore(tableName, nil, dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil, log.L()) + _, err := NewTableRestore(tableName, nil, dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil, nil, log.L()) require.Regexp(t, `failed to tables\.TableFromMeta.*`, err.Error()) } @@ -211,6 +214,15 @@ func TestPreCheckFailed(t *testing.T) { require.NoError(t, err) g := glue.NewExternalTiDBGlue(db, mysql.ModeNone) + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: cfg, + targetDBGlue: g, + } + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + targetInfoGetter: targetInfoGetter, + dbMetas: make([]*mydump.MDDatabaseMeta, 0), + } ctl := &Controller{ cfg: cfg, saveCpCh: make(chan saveCp), @@ -219,6 +231,7 @@ func TestPreCheckFailed(t *testing.T) { checkTemplate: NewSimpleTemplate(), tidbGlue: g, errorMgr: errormanager.New(nil, cfg, log.L()), + preInfoGetter: preInfoGetter, } mock.ExpectBegin() diff --git a/br/pkg/lightning/restore/table_restore.go b/br/pkg/lightning/restore/table_restore.go index 31a83238c77fe..b32c5e82b7345 100644 --- a/br/pkg/lightning/restore/table_restore.go +++ b/br/pkg/lightning/restore/table_restore.go @@ -34,6 +34,7 @@ import ( verify "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/lightning/worker" "github.com/pingcap/tidb/br/pkg/utils" + tidbkv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -54,6 +55,7 @@ type TableRestore struct { encTable table.Table alloc autoid.Allocators logger log.Logger + kvStore tidbkv.Storage ignoreColumns map[string]struct{} } @@ -65,6 +67,7 @@ func NewTableRestore( tableInfo *checkpoints.TidbTableInfo, cp *checkpoints.TableCheckpoint, ignoreColumns map[string]struct{}, + kvStore tidbkv.Storage, logger log.Logger, ) (*TableRestore, error) { idAlloc := kv.NewPanickingAllocators(cp.AllocBase) @@ -80,6 +83,7 @@ func NewTableRestore( tableMeta: tableMeta, encTable: tbl, alloc: idAlloc, + kvStore: kvStore, logger: logger.With(zap.String("table", tableName)), ignoreColumns: ignoreColumns, }, nil @@ -615,14 +619,14 @@ func (tr *TableRestore) restoreEngine( // in local mode, this check-point make no sense, because we don't do flush now, // so there may be data lose if exit at here. So we don't write this checkpoint // here like other mode. - if !rc.isLocalBackend() { + if !isLocalBackend(rc.cfg) { if saveCpErr := rc.saveStatusCheckpoint(ctx, tr.tableName, engineID, err, checkpoints.CheckpointStatusAllWritten); saveCpErr != nil { return nil, errors.Trace(firstErr(err, saveCpErr)) } } if err != nil { // if process is canceled, we should flush all chunk checkpoints for local backend - if rc.isLocalBackend() && common.IsContextCanceledError(err) { + if isLocalBackend(rc.cfg) && common.IsContextCanceledError(err) { // ctx is canceled, so to avoid Close engine failed, we use `context.Background()` here if _, err2 := dataEngine.Close(context.Background(), dataEngineCfg); err2 != nil { log.FromContext(ctx).Warn("flush all chunk checkpoints failed before manually exits", zap.Error(err2)) @@ -638,7 +642,7 @@ func (tr *TableRestore) restoreEngine( closedDataEngine, err := dataEngine.Close(ctx, dataEngineCfg) // For local backend, if checkpoint is enabled, we must flush index engine to avoid data loss. // this flush action impact up to 10% of the performance, so we only do it if necessary. - if err == nil && rc.cfg.Checkpoint.Enable && rc.isLocalBackend() { + if err == nil && rc.cfg.Checkpoint.Enable && isLocalBackend(rc.cfg) { if err = indexEngine.Flush(ctx); err != nil { return nil, errors.Trace(err) } diff --git a/br/pkg/lightning/restore/table_restore_test.go b/br/pkg/lightning/restore/table_restore_test.go index 5a8799ad43002..de58ea4a39d43 100644 --- a/br/pkg/lightning/restore/table_restore_test.go +++ b/br/pkg/lightning/restore/table_restore_test.go @@ -47,6 +47,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/metric" "github.com/pingcap/tidb/br/pkg/lightning/mydump" + restoremock "github.com/pingcap/tidb/br/pkg/lightning/restore/mock" "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/lightning/web" "github.com/pingcap/tidb/br/pkg/lightning/worker" @@ -163,7 +164,7 @@ func (s *tableRestoreSuiteBase) setupSuite(t *testing.T) { func (s *tableRestoreSuiteBase) setupTest(t *testing.T) { // Collect into the test TableRestore structure var err error - s.tr, err = NewTableRestore("`db`.`table`", s.tableMeta, s.dbInfo, s.tableInfo, &checkpoints.TableCheckpoint{}, nil, log.L()) + s.tr, err = NewTableRestore("`db`.`table`", s.tableMeta, s.dbInfo, s.tableInfo, &checkpoints.TableCheckpoint{}, nil, nil, log.L()) require.NoError(t, err) s.cfg = config.NewConfig() @@ -454,7 +455,7 @@ func (s *tableRestoreSuite) TestPopulateChunksCSVHeader() { cfg.Mydumper.StrictFormat = true rc := &Controller{cfg: cfg, ioWorkers: worker.NewPool(context.Background(), 1, "io"), store: store} - tr, err := NewTableRestore("`db`.`table`", tableMeta, s.dbInfo, s.tableInfo, &checkpoints.TableCheckpoint{}, nil, log.L()) + tr, err := NewTableRestore("`db`.`table`", tableMeta, s.dbInfo, s.tableInfo, &checkpoints.TableCheckpoint{}, nil, nil, log.L()) require.NoError(s.T(), err) require.NoError(s.T(), tr.populateChunks(context.Background(), rc, cp)) @@ -719,7 +720,7 @@ func (s *tableRestoreSuite) TestInitializeColumnsGenerated() { require.NoError(s.T(), err) core.State = model.StatePublic tableInfo := &checkpoints.TidbTableInfo{Name: "table", DB: "db", Core: core} - s.tr, err = NewTableRestore("`db`.`table`", s.tableMeta, s.dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil, log.L()) + s.tr, err = NewTableRestore("`db`.`table`", s.tableMeta, s.dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil, nil, log.L()) require.NoError(s.T(), err) ccp := &checkpoints.ChunkCheckpoint{} @@ -891,7 +892,6 @@ func (s *tableRestoreSuite) TestTableRestoreMetrics() { defer close(chptCh) cfg := config.NewConfig() cfg.Mydumper.BatchSize = 1 - cfg.PostRestore.Checksum = config.OpLevelOff cfg.Checkpoint.Enable = false cfg.TiDB.Host = "127.0.0.1" @@ -901,8 +901,7 @@ func (s *tableRestoreSuite) TestTableRestoreMetrics() { cfg.Mydumper.SourceDir = "." cfg.Mydumper.CSV.Header = false - cfg.TikvImporter.Backend = config.BackendLocal - cfg.TikvImporter.SortedKVDir = "/tmp/sorted" + cfg.TikvImporter.Backend = config.BackendTiDB tls, err := cfg.ToTLS() require.NoError(s.T(), err) @@ -911,19 +910,34 @@ func (s *tableRestoreSuite) TestTableRestoreMetrics() { cpDB := checkpoints.NewNullCheckpointsDB() g := mock.NewMockGlue(controller) - rc := &Controller{ - cfg: cfg, - dbMetas: []*mydump.MDDatabaseMeta{ - { - Name: s.tableInfo.DB, - Tables: []*mydump.MDTableMeta{s.tableMeta}, - }, - }, - dbInfos: map[string]*checkpoints.TidbDBInfo{ - s.tableInfo.DB: s.dbInfo, + dbMetas := []*mydump.MDDatabaseMeta{ + { + Name: s.tableInfo.DB, + Tables: []*mydump.MDTableMeta{s.tableMeta}, }, + } + ioWorkers := worker.NewPool(ctx, 5, "io") + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: cfg, + targetDBGlue: g, + } + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + dbMetas: dbMetas, + targetInfoGetter: targetInfoGetter, + srcStorage: s.store, + ioWorkers: ioWorkers, + } + preInfoGetter.Init() + dbInfos := map[string]*checkpoints.TidbDBInfo{ + s.tableInfo.DB: s.dbInfo, + } + rc := &Controller{ + cfg: cfg, + dbMetas: dbMetas, + dbInfos: dbInfos, tableWorkers: worker.NewPool(ctx, 6, "table"), - ioWorkers: worker.NewPool(ctx, 5, "io"), + ioWorkers: ioWorkers, indexWorkers: worker.NewPool(ctx, 2, "index"), regionWorkers: worker.NewPool(ctx, 10, "region"), checksumWorks: worker.NewPool(ctx, 2, "region"), @@ -939,6 +953,7 @@ func (s *tableRestoreSuite) TestTableRestoreMetrics() { metaMgrBuilder: noopMetaMgrBuilder{}, errorMgr: errormanager.New(nil, cfg, log.L()), taskMgr: noopTaskMetaMgr{}, + preInfoGetter: preInfoGetter, } go func() { for scp := range chptCh { @@ -1099,7 +1114,22 @@ func (s *tableRestoreSuite) TestCheckClusterResource() { url := strings.TrimPrefix(server.URL, "https://") cfg := &config.Config{TiDB: config.DBStore{PdAddr: url}} - rc := &Controller{cfg: cfg, tls: tls, store: mockStore, checkTemplate: template} + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: cfg, + tls: tls, + } + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + targetInfoGetter: targetInfoGetter, + srcStorage: mockStore, + } + rc := &Controller{ + cfg: cfg, + tls: tls, + store: mockStore, + checkTemplate: template, + preInfoGetter: preInfoGetter, + } var sourceSize int64 err = rc.store.WalkDir(ctx, &storage.WalkOption{}, func(path string, size int64) error { sourceSize += size @@ -1226,9 +1256,27 @@ func (s *tableRestoreSuite) TestCheckClusterRegion() { url := strings.TrimPrefix(server.URL, "https://") cfg := &config.Config{TiDB: config.DBStore{PdAddr: url}} - rc := &Controller{cfg: cfg, tls: tls, taskMgr: mockTaskMetaMgr{}, checkTemplate: template} - err := rc.checkClusterRegion(context.Background()) + targetInfoGetter := &TargetInfoGetterImpl{ + cfg: cfg, + tls: tls, + } + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + targetInfoGetter: targetInfoGetter, + dbMetas: []*mydump.MDDatabaseMeta{}, + } + rc := &Controller{ + cfg: cfg, + tls: tls, + taskMgr: mockTaskMetaMgr{}, + checkTemplate: template, + preInfoGetter: preInfoGetter, + dbInfos: make(map[string]*checkpoints.TidbDBInfo), + } + + ctx := WithPreInfoGetterTableStructuresCache(context.Background(), rc.dbInfos) + err := rc.checkClusterRegion(ctx) require.NoError(s.T(), err) require.Equal(s.T(), ca.expectErrorCnt, template.FailedCount(Critical)) require.Equal(s.T(), ca.expectResult, template.Success()) @@ -1335,32 +1383,48 @@ func (s *tableRestoreSuite) TestEstimate() { s.cfg.TikvImporter.Backend = config.BackendLocal template := NewSimpleTemplate() + dbMetas := []*mydump.MDDatabaseMeta{ + { + Name: "db1", + Tables: []*mydump.MDTableMeta{s.tableMeta}, + }, + } + dbInfos := map[string]*checkpoints.TidbDBInfo{ + "db1": s.dbInfo, + } + ioWorkers := worker.NewPool(context.Background(), 1, "io") + mockTarget := restoremock.NewMockTargetInfo() + + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: s.cfg, + srcStorage: s.store, + encBuilder: importer, + ioWorkers: ioWorkers, + dbMetas: dbMetas, + targetInfoGetter: mockTarget, + } + preInfoGetter.Init() rc := &Controller{ cfg: s.cfg, checkTemplate: template, store: s.store, backend: importer, - dbMetas: []*mydump.MDDatabaseMeta{ - { - Name: "db1", - Tables: []*mydump.MDTableMeta{s.tableMeta}, - }, - }, - dbInfos: map[string]*checkpoints.TidbDBInfo{ - "db1": s.dbInfo, - }, - ioWorkers: worker.NewPool(context.Background(), 1, "io"), + dbMetas: dbMetas, + dbInfos: dbInfos, + ioWorkers: ioWorkers, + preInfoGetter: preInfoGetter, } - source, err := rc.estimateSourceData(ctx) + ctx = WithPreInfoGetterTableStructuresCache(ctx, dbInfos) + source, _, _, err := rc.estimateSourceData(ctx) // Because this file is small than region split size so we does not sample it. require.NoError(s.T(), err) require.Equal(s.T(), s.tableMeta.TotalSize, source) s.tableMeta.TotalSize = int64(config.SplitRegionSize) - source, err = rc.estimateSourceData(ctx) + source, _, _, err = rc.estimateSourceData(ctx) require.NoError(s.T(), err) require.Greater(s.T(), source, s.tableMeta.TotalSize) rc.cfg.TikvImporter.Backend = config.BackendTiDB - source, err = rc.estimateSourceData(ctx) + source, _, _, err = rc.estimateSourceData(ctx) require.NoError(s.T(), err) require.Equal(s.T(), s.tableMeta.TotalSize, source) } @@ -1760,13 +1824,21 @@ func (s *tableRestoreSuite) TestSchemaIsValid() { IgnoreColumns: ca.ignoreColumns, }, } + ioWorkers := worker.NewPool(context.Background(), 1, "io") + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + srcStorage: mockStore, + ioWorkers: ioWorkers, + } rc := &Controller{ cfg: cfg, checkTemplate: template, store: mockStore, dbInfos: ca.dbInfos, - ioWorkers: worker.NewPool(context.Background(), 1, "io"), + ioWorkers: ioWorkers, + preInfoGetter: preInfoGetter, } + ctx = WithPreInfoGetterTableStructuresCache(ctx, ca.dbInfos) msgs, err := rc.SchemaIsValid(ctx, ca.tableMeta) require.NoError(s.T(), err) require.Len(s.T(), msgs, ca.MsgNum) @@ -1806,36 +1878,45 @@ func (s *tableRestoreSuite) TestGBKEncodedSchemaIsValid() { err = mockStore.WriteFile(ctx, csvFile, []byte(csvContent)) require.NoError(s.T(), err) - rc := &Controller{ - cfg: cfg, - checkTemplate: NewSimpleTemplate(), - store: mockStore, - dbInfos: map[string]*checkpoints.TidbDBInfo{ - "db1": { - Name: "db1", - Tables: map[string]*checkpoints.TidbTableInfo{ - "gbk_table": { - ID: 1, - DB: "db1", - Name: "gbk_table", - Core: &model.TableInfo{ - Columns: []*model.ColumnInfo{ - { - Name: model.NewCIStr("colA"), - FieldType: types.NewFieldTypeBuilder().SetType(0).SetFlag(1).Build(), - }, - { - Name: model.NewCIStr("colB"), - FieldType: types.NewFieldTypeBuilder().SetType(0).SetFlag(1).Build(), - }, + dbInfos := map[string]*checkpoints.TidbDBInfo{ + "db1": { + Name: "db1", + Tables: map[string]*checkpoints.TidbTableInfo{ + "gbk_table": { + ID: 1, + DB: "db1", + Name: "gbk_table", + Core: &model.TableInfo{ + Columns: []*model.ColumnInfo{ + { + Name: model.NewCIStr("colA"), + FieldType: types.NewFieldTypeBuilder().SetType(0).SetFlag(1).Build(), + }, + { + Name: model.NewCIStr("colB"), + FieldType: types.NewFieldTypeBuilder().SetType(0).SetFlag(1).Build(), }, }, }, }, }, }, - ioWorkers: worker.NewPool(ctx, 1, "io"), } + ioWorkers := worker.NewPool(ctx, 1, "io") + preInfoGetter := &PreRestoreInfoGetterImpl{ + cfg: cfg, + srcStorage: mockStore, + ioWorkers: ioWorkers, + } + rc := &Controller{ + cfg: cfg, + checkTemplate: NewSimpleTemplate(), + store: mockStore, + dbInfos: dbInfos, + ioWorkers: ioWorkers, + preInfoGetter: preInfoGetter, + } + ctx = WithPreInfoGetterTableStructuresCache(ctx, dbInfos) msgs, err := rc.SchemaIsValid(ctx, &mydump.MDTableMeta{ DB: "db1", Name: "gbk_table", diff --git a/br/pkg/lightning/tikv/tikv.go b/br/pkg/lightning/tikv/tikv.go index 9032541e1dada..8d2d797d322d1 100644 --- a/br/pkg/lightning/tikv/tikv.go +++ b/br/pkg/lightning/tikv/tikv.go @@ -186,7 +186,7 @@ func FetchMode(ctx context.Context, tls *common.TLS, tikvAddr string) (import_ss return FetchModeFromMetrics(resp.Prometheus) } -// FetchMode obtains the import mode status from the Prometheus metrics of a TiKV node. +// FetchModeFromMetrics obtains the import mode status from the Prometheus metrics of a TiKV node. func FetchModeFromMetrics(metrics string) (import_sstpb.SwitchMode, error) { m := fetchModeRegexp.FindStringSubmatch(metrics) switch { @@ -199,6 +199,16 @@ func FetchModeFromMetrics(metrics string) (import_sstpb.SwitchMode, error) { } } +// FetchRemoteDBModelsFromTLS obtains the remote DB models from the given TLS. +func FetchRemoteDBModelsFromTLS(ctx context.Context, tls *common.TLS) ([]*model.DBInfo, error) { + var dbs []*model.DBInfo + err := tls.GetJSON(ctx, "/schema", &dbs) + if err != nil { + return nil, errors.Annotatef(err, "cannot read db schemas from remote") + } + return dbs, nil +} + func FetchRemoteTableModelsFromTLS(ctx context.Context, tls *common.TLS, schema string) ([]*model.TableInfo, error) { var tables []*model.TableInfo err := tls.GetJSON(ctx, "/schema/"+schema, &tables) diff --git a/br/pkg/lightning/worker/worker.go b/br/pkg/lightning/worker/worker.go index 73bab3d53f521..9e4b4cbe603f0 100644 --- a/br/pkg/lightning/worker/worker.go +++ b/br/pkg/lightning/worker/worker.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/metric" ) +// Pool is the worker pool. type Pool struct { limit int workers chan *Worker @@ -28,10 +29,12 @@ type Pool struct { metrics *metric.Metrics } +// Worker is the worker struct. type Worker struct { ID int64 } +// NewPool creates a new worker pool. func NewPool(ctx context.Context, limit int, name string) *Pool { workers := make(chan *Worker, limit) for i := 0; i < limit; i++ { @@ -50,6 +53,7 @@ func NewPool(ctx context.Context, limit int, name string) *Pool { } } +// Apply gets a worker from the pool. func (pool *Pool) Apply() *Worker { start := time.Now() worker := <-pool.workers @@ -60,6 +64,7 @@ func (pool *Pool) Apply() *Worker { return worker } +// Recycle puts a worker back to the pool. func (pool *Pool) Recycle(worker *Worker) { if worker == nil { panic("invalid restore worker") @@ -70,6 +75,7 @@ func (pool *Pool) Recycle(worker *Worker) { } } +// HasWorker returns whether the pool has worker. func (pool *Pool) HasWorker() bool { return len(pool.workers) > 0 } diff --git a/br/pkg/logutil/BUILD.bazel b/br/pkg/logutil/BUILD.bazel index 5a8df97911de6..1443a6bfd4639 100644 --- a/br/pkg/logutil/BUILD.bazel +++ b/br/pkg/logutil/BUILD.bazel @@ -12,6 +12,7 @@ go_library( deps = [ "//br/pkg/lightning/metric", "//br/pkg/redact", + "//kv", "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_kvproto//pkg/brpb", diff --git a/br/pkg/logutil/logging.go b/br/pkg/logutil/logging.go index 71b882b7af9db..028cfc00e5f43 100644 --- a/br/pkg/logutil/logging.go +++ b/br/pkg/logutil/logging.go @@ -14,6 +14,7 @@ import ( "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/redact" + "github.com/pingcap/tidb/kv" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) @@ -104,6 +105,7 @@ func (t zapStreamBackupTaskInfo) MarshalLogObject(enc zapcore.ObjectEncoder) err return nil } +// StreamBackupTaskInfo makes the zap fields for a stream backup task info. func StreamBackupTaskInfo(t *backuppb.StreamBackupTaskInfo) zap.Field { return zap.Object("streamTaskInfo", zapStreamBackupTaskInfo{t}) } @@ -269,3 +271,38 @@ func Redact(field zap.Field) zap.Field { } return field } + +// StringifyKeys wraps the key range into a stringer. +type StringifyKeys []kv.KeyRange + +func (kr StringifyKeys) String() string { + sb := new(strings.Builder) + sb.WriteString("{") + for i, rng := range kr { + if i > 0 { + sb.WriteString(", ") + } + sb.WriteString(StringifyRange(rng).String()) + } + sb.WriteString("}") + return sb.String() +} + +// StringifyRange is the wrapper for displaying a key range. +type StringifyRange kv.KeyRange + +func (rng StringifyRange) String() string { + sb := new(strings.Builder) + sb.WriteString("[") + sb.WriteString(redact.Key(rng.StartKey)) + sb.WriteString(", ") + var endKey string + if len(rng.EndKey) == 0 { + endKey = "inf" + } else { + endKey = redact.Key(rng.EndKey) + } + sb.WriteString(redact.String(endKey)) + sb.WriteString(")") + return sb.String() +} diff --git a/br/pkg/membuf/buffer.go b/br/pkg/membuf/buffer.go index 49ffbae8afdf3..85493fdd07f7e 100644 --- a/br/pkg/membuf/buffer.go +++ b/br/pkg/membuf/buffer.go @@ -115,6 +115,7 @@ func (p *Pool) NewBuffer() *Buffer { return &Buffer{pool: p, bufs: make([][]byte, 0, 128), curBufIdx: -1} } +// Destroy frees all buffers. func (p *Pool) Destroy() { close(p.blockCache) for b := range p.blockCache { diff --git a/br/pkg/metautil/metafile.go b/br/pkg/metautil/metafile.go index cead8486bc7bc..be6d51305f674 100644 --- a/br/pkg/metautil/metafile.go +++ b/br/pkg/metautil/metafile.go @@ -55,10 +55,12 @@ const ( MetaV2 ) +// CreateMetaFileName is the name of meta file. func CreateMetaFileName(ts uint64) string { return fmt.Sprintf("%s_%d", MetaFile, ts) } +// Encrypt encrypts the content according to CipherInfo. func Encrypt(content []byte, cipher *backuppb.CipherInfo) (encryptedContent, iv []byte, err error) { if len(content) == 0 || cipher == nil { return content, iv, nil @@ -83,6 +85,7 @@ func Encrypt(content []byte, cipher *backuppb.CipherInfo) (encryptedContent, iv } } +// Decrypt decrypts the content according to CipherInfo and IV. func Decrypt(content []byte, cipher *backuppb.CipherInfo, iv []byte) ([]byte, error) { if len(content) == 0 || cipher == nil { return content, nil @@ -222,7 +225,7 @@ func (reader *MetaReader) readDataFiles(ctx context.Context, output func(*backup } // ArchiveSize return the size of Archive data -func (reader *MetaReader) ArchiveSize(ctx context.Context, files []*backuppb.File) uint64 { +func (*MetaReader) ArchiveSize(_ context.Context, files []*backuppb.File) uint64 { total := uint64(0) for _, file := range files { total += file.Size_ @@ -424,9 +427,7 @@ func (op AppendOp) name() string { } // appends item to MetaFile -func (op AppendOp) appendFile(a *backuppb.MetaFile, b interface{}) (int, int) { - size := 0 - itemCount := 0 +func (op AppendOp) appendFile(a *backuppb.MetaFile, b interface{}) (size int, itemCount int) { switch op { case AppendMetaFile: a.MetaFiles = append(a.MetaFiles, b.(*backuppb.File)) @@ -449,7 +450,6 @@ func (op AppendOp) appendFile(a *backuppb.MetaFile, b interface{}) (int, int) { itemCount++ size += len(b.([]byte)) } - return size, itemCount } @@ -554,7 +554,7 @@ func (writer *MetaWriter) Update(f func(m *backuppb.BackupMeta)) { } // Send sends the item to buffer. -func (writer *MetaWriter) Send(m interface{}, op AppendOp) error { +func (writer *MetaWriter) Send(m interface{}, _ AppendOp) error { select { case writer.metasCh <- m: // receive an error from StartWriteMetasAsync @@ -665,7 +665,7 @@ func (writer *MetaWriter) FlushBackupMeta(ctx context.Context) error { // fillMetasV1 keep the compatibility for old version. // for MetaV1, just put in backupMeta -func (writer *MetaWriter) fillMetasV1(ctx context.Context, op AppendOp) { +func (writer *MetaWriter) fillMetasV1(_ context.Context, op AppendOp) { switch op { case AppendDataFile: writer.backupMeta.Files = writer.metafiles.root.DataFiles @@ -717,7 +717,7 @@ func (writer *MetaWriter) flushMetasV2(ctx context.Context, op AppendOp) error { name := op.name() writer.metafileSizes[name] += writer.metafiles.size // Flush metafiles to external storage. - writer.metafileSeqNum["metafiles"] += 1 + writer.metafileSeqNum["metafiles"]++ fname := fmt.Sprintf("backupmeta.%s.%09d", name, writer.metafileSeqNum["metafiles"]) encyptedContent, iv, err := Encrypt(content, writer.cipher) diff --git a/br/pkg/mock/mockid/mockid.go b/br/pkg/mock/mockid/mockid.go index bd645e457d01a..a07de0c2c6c03 100644 --- a/br/pkg/mock/mockid/mockid.go +++ b/br/pkg/mock/mockid/mockid.go @@ -32,6 +32,6 @@ func (alloc *IDAllocator) Alloc() (uint64, error) { } // Rebase implements the IDAllocator interface. -func (alloc *IDAllocator) Rebase() error { +func (*IDAllocator) Rebase() error { return nil } diff --git a/br/pkg/mock/s3iface.go b/br/pkg/mock/s3iface.go index e8151f124b1c5..46c7d1ad57df8 100644 --- a/br/pkg/mock/s3iface.go +++ b/br/pkg/mock/s3iface.go @@ -1,7 +1,7 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/aws/aws-sdk-go/service/s3/s3iface (interfaces: S3API) -// $ mockgen -package mock github.com/aws/aws-sdk-go/service/s3/s3iface S3API > pkg/mock/s3iface.go +// $ mockgen -package mock github.com/aws/aws-sdk-go/service/s3/s3iface S3API > br/pkg/mock/s3iface.go // Package mock is a generated GoMock package. package mock @@ -15,30 +15,30 @@ import ( gomock "github.com/golang/mock/gomock" ) -// MockS3API is a mock of S3API interface +// MockS3API is a mock of S3API interface. type MockS3API struct { ctrl *gomock.Controller recorder *MockS3APIMockRecorder } -// MockS3APIMockRecorder is the mock recorder for MockS3API +// MockS3APIMockRecorder is the mock recorder for MockS3API. type MockS3APIMockRecorder struct { mock *MockS3API } -// NewMockS3API creates a new mock instance +// NewMockS3API creates a new mock instance. func NewMockS3API(ctrl *gomock.Controller) *MockS3API { mock := &MockS3API{ctrl: ctrl} mock.recorder = &MockS3APIMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockS3API) EXPECT() *MockS3APIMockRecorder { return m.recorder } -// AbortMultipartUpload mocks base method +// AbortMultipartUpload mocks base method. func (m *MockS3API) AbortMultipartUpload(arg0 *s3.AbortMultipartUploadInput) (*s3.AbortMultipartUploadOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AbortMultipartUpload", arg0) @@ -47,13 +47,13 @@ func (m *MockS3API) AbortMultipartUpload(arg0 *s3.AbortMultipartUploadInput) (*s return ret0, ret1 } -// AbortMultipartUpload indicates an expected call of AbortMultipartUpload +// AbortMultipartUpload indicates an expected call of AbortMultipartUpload. func (mr *MockS3APIMockRecorder) AbortMultipartUpload(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUpload", reflect.TypeOf((*MockS3API)(nil).AbortMultipartUpload), arg0) } -// AbortMultipartUploadRequest mocks base method +// AbortMultipartUploadRequest mocks base method. func (m *MockS3API) AbortMultipartUploadRequest(arg0 *s3.AbortMultipartUploadInput) (*request.Request, *s3.AbortMultipartUploadOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AbortMultipartUploadRequest", arg0) @@ -62,13 +62,13 @@ func (m *MockS3API) AbortMultipartUploadRequest(arg0 *s3.AbortMultipartUploadInp return ret0, ret1 } -// AbortMultipartUploadRequest indicates an expected call of AbortMultipartUploadRequest +// AbortMultipartUploadRequest indicates an expected call of AbortMultipartUploadRequest. func (mr *MockS3APIMockRecorder) AbortMultipartUploadRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUploadRequest", reflect.TypeOf((*MockS3API)(nil).AbortMultipartUploadRequest), arg0) } -// AbortMultipartUploadWithContext mocks base method +// AbortMultipartUploadWithContext mocks base method. func (m *MockS3API) AbortMultipartUploadWithContext(arg0 context.Context, arg1 *s3.AbortMultipartUploadInput, arg2 ...request.Option) (*s3.AbortMultipartUploadOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -81,14 +81,14 @@ func (m *MockS3API) AbortMultipartUploadWithContext(arg0 context.Context, arg1 * return ret0, ret1 } -// AbortMultipartUploadWithContext indicates an expected call of AbortMultipartUploadWithContext +// AbortMultipartUploadWithContext indicates an expected call of AbortMultipartUploadWithContext. func (mr *MockS3APIMockRecorder) AbortMultipartUploadWithContext(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, "AbortMultipartUploadWithContext", reflect.TypeOf((*MockS3API)(nil).AbortMultipartUploadWithContext), varargs...) } -// CompleteMultipartUpload mocks base method +// CompleteMultipartUpload mocks base method. func (m *MockS3API) CompleteMultipartUpload(arg0 *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CompleteMultipartUpload", arg0) @@ -97,13 +97,13 @@ func (m *MockS3API) CompleteMultipartUpload(arg0 *s3.CompleteMultipartUploadInpu return ret0, ret1 } -// CompleteMultipartUpload indicates an expected call of CompleteMultipartUpload +// CompleteMultipartUpload indicates an expected call of CompleteMultipartUpload. func (mr *MockS3APIMockRecorder) CompleteMultipartUpload(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteMultipartUpload", reflect.TypeOf((*MockS3API)(nil).CompleteMultipartUpload), arg0) } -// CompleteMultipartUploadRequest mocks base method +// CompleteMultipartUploadRequest mocks base method. func (m *MockS3API) CompleteMultipartUploadRequest(arg0 *s3.CompleteMultipartUploadInput) (*request.Request, *s3.CompleteMultipartUploadOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CompleteMultipartUploadRequest", arg0) @@ -112,13 +112,13 @@ func (m *MockS3API) CompleteMultipartUploadRequest(arg0 *s3.CompleteMultipartUpl return ret0, ret1 } -// CompleteMultipartUploadRequest indicates an expected call of CompleteMultipartUploadRequest +// CompleteMultipartUploadRequest indicates an expected call of CompleteMultipartUploadRequest. func (mr *MockS3APIMockRecorder) CompleteMultipartUploadRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteMultipartUploadRequest", reflect.TypeOf((*MockS3API)(nil).CompleteMultipartUploadRequest), arg0) } -// CompleteMultipartUploadWithContext mocks base method +// CompleteMultipartUploadWithContext mocks base method. func (m *MockS3API) CompleteMultipartUploadWithContext(arg0 context.Context, arg1 *s3.CompleteMultipartUploadInput, arg2 ...request.Option) (*s3.CompleteMultipartUploadOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -131,14 +131,14 @@ func (m *MockS3API) CompleteMultipartUploadWithContext(arg0 context.Context, arg return ret0, ret1 } -// CompleteMultipartUploadWithContext indicates an expected call of CompleteMultipartUploadWithContext +// CompleteMultipartUploadWithContext indicates an expected call of CompleteMultipartUploadWithContext. func (mr *MockS3APIMockRecorder) CompleteMultipartUploadWithContext(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, "CompleteMultipartUploadWithContext", reflect.TypeOf((*MockS3API)(nil).CompleteMultipartUploadWithContext), varargs...) } -// CopyObject mocks base method +// CopyObject mocks base method. func (m *MockS3API) CopyObject(arg0 *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CopyObject", arg0) @@ -147,13 +147,13 @@ func (m *MockS3API) CopyObject(arg0 *s3.CopyObjectInput) (*s3.CopyObjectOutput, return ret0, ret1 } -// CopyObject indicates an expected call of CopyObject +// CopyObject indicates an expected call of CopyObject. func (mr *MockS3APIMockRecorder) CopyObject(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CopyObject", reflect.TypeOf((*MockS3API)(nil).CopyObject), arg0) } -// CopyObjectRequest mocks base method +// CopyObjectRequest mocks base method. func (m *MockS3API) CopyObjectRequest(arg0 *s3.CopyObjectInput) (*request.Request, *s3.CopyObjectOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CopyObjectRequest", arg0) @@ -162,13 +162,13 @@ func (m *MockS3API) CopyObjectRequest(arg0 *s3.CopyObjectInput) (*request.Reques return ret0, ret1 } -// CopyObjectRequest indicates an expected call of CopyObjectRequest +// CopyObjectRequest indicates an expected call of CopyObjectRequest. func (mr *MockS3APIMockRecorder) CopyObjectRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CopyObjectRequest", reflect.TypeOf((*MockS3API)(nil).CopyObjectRequest), arg0) } -// CopyObjectWithContext mocks base method +// CopyObjectWithContext mocks base method. func (m *MockS3API) CopyObjectWithContext(arg0 context.Context, arg1 *s3.CopyObjectInput, arg2 ...request.Option) (*s3.CopyObjectOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -181,14 +181,14 @@ func (m *MockS3API) CopyObjectWithContext(arg0 context.Context, arg1 *s3.CopyObj return ret0, ret1 } -// CopyObjectWithContext indicates an expected call of CopyObjectWithContext +// CopyObjectWithContext indicates an expected call of CopyObjectWithContext. func (mr *MockS3APIMockRecorder) CopyObjectWithContext(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, "CopyObjectWithContext", reflect.TypeOf((*MockS3API)(nil).CopyObjectWithContext), varargs...) } -// CreateBucket mocks base method +// CreateBucket mocks base method. func (m *MockS3API) CreateBucket(arg0 *s3.CreateBucketInput) (*s3.CreateBucketOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateBucket", arg0) @@ -197,13 +197,13 @@ func (m *MockS3API) CreateBucket(arg0 *s3.CreateBucketInput) (*s3.CreateBucketOu return ret0, ret1 } -// CreateBucket indicates an expected call of CreateBucket +// CreateBucket indicates an expected call of CreateBucket. func (mr *MockS3APIMockRecorder) CreateBucket(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucket", reflect.TypeOf((*MockS3API)(nil).CreateBucket), arg0) } -// CreateBucketRequest mocks base method +// CreateBucketRequest mocks base method. func (m *MockS3API) CreateBucketRequest(arg0 *s3.CreateBucketInput) (*request.Request, *s3.CreateBucketOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateBucketRequest", arg0) @@ -212,13 +212,13 @@ func (m *MockS3API) CreateBucketRequest(arg0 *s3.CreateBucketInput) (*request.Re return ret0, ret1 } -// CreateBucketRequest indicates an expected call of CreateBucketRequest +// CreateBucketRequest indicates an expected call of CreateBucketRequest. func (mr *MockS3APIMockRecorder) CreateBucketRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBucketRequest", reflect.TypeOf((*MockS3API)(nil).CreateBucketRequest), arg0) } -// CreateBucketWithContext mocks base method +// CreateBucketWithContext mocks base method. func (m *MockS3API) CreateBucketWithContext(arg0 context.Context, arg1 *s3.CreateBucketInput, arg2 ...request.Option) (*s3.CreateBucketOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -231,14 +231,14 @@ func (m *MockS3API) CreateBucketWithContext(arg0 context.Context, arg1 *s3.Creat return ret0, ret1 } -// CreateBucketWithContext indicates an expected call of CreateBucketWithContext +// CreateBucketWithContext indicates an expected call of CreateBucketWithContext. func (mr *MockS3APIMockRecorder) CreateBucketWithContext(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, "CreateBucketWithContext", reflect.TypeOf((*MockS3API)(nil).CreateBucketWithContext), varargs...) } -// CreateMultipartUpload mocks base method +// CreateMultipartUpload mocks base method. func (m *MockS3API) CreateMultipartUpload(arg0 *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateMultipartUpload", arg0) @@ -247,13 +247,13 @@ func (m *MockS3API) CreateMultipartUpload(arg0 *s3.CreateMultipartUploadInput) ( return ret0, ret1 } -// CreateMultipartUpload indicates an expected call of CreateMultipartUpload +// CreateMultipartUpload indicates an expected call of CreateMultipartUpload. func (mr *MockS3APIMockRecorder) CreateMultipartUpload(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMultipartUpload", reflect.TypeOf((*MockS3API)(nil).CreateMultipartUpload), arg0) } -// CreateMultipartUploadRequest mocks base method +// CreateMultipartUploadRequest mocks base method. func (m *MockS3API) CreateMultipartUploadRequest(arg0 *s3.CreateMultipartUploadInput) (*request.Request, *s3.CreateMultipartUploadOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateMultipartUploadRequest", arg0) @@ -262,13 +262,13 @@ func (m *MockS3API) CreateMultipartUploadRequest(arg0 *s3.CreateMultipartUploadI return ret0, ret1 } -// CreateMultipartUploadRequest indicates an expected call of CreateMultipartUploadRequest +// CreateMultipartUploadRequest indicates an expected call of CreateMultipartUploadRequest. func (mr *MockS3APIMockRecorder) CreateMultipartUploadRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMultipartUploadRequest", reflect.TypeOf((*MockS3API)(nil).CreateMultipartUploadRequest), arg0) } -// CreateMultipartUploadWithContext mocks base method +// CreateMultipartUploadWithContext mocks base method. func (m *MockS3API) CreateMultipartUploadWithContext(arg0 context.Context, arg1 *s3.CreateMultipartUploadInput, arg2 ...request.Option) (*s3.CreateMultipartUploadOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -281,14 +281,14 @@ func (m *MockS3API) CreateMultipartUploadWithContext(arg0 context.Context, arg1 return ret0, ret1 } -// CreateMultipartUploadWithContext indicates an expected call of CreateMultipartUploadWithContext +// CreateMultipartUploadWithContext indicates an expected call of CreateMultipartUploadWithContext. func (mr *MockS3APIMockRecorder) CreateMultipartUploadWithContext(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, "CreateMultipartUploadWithContext", reflect.TypeOf((*MockS3API)(nil).CreateMultipartUploadWithContext), varargs...) } -// DeleteBucket mocks base method +// DeleteBucket mocks base method. func (m *MockS3API) DeleteBucket(arg0 *s3.DeleteBucketInput) (*s3.DeleteBucketOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucket", arg0) @@ -297,13 +297,13 @@ func (m *MockS3API) DeleteBucket(arg0 *s3.DeleteBucketInput) (*s3.DeleteBucketOu return ret0, ret1 } -// DeleteBucket indicates an expected call of DeleteBucket +// DeleteBucket indicates an expected call of DeleteBucket. func (mr *MockS3APIMockRecorder) DeleteBucket(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucket", reflect.TypeOf((*MockS3API)(nil).DeleteBucket), arg0) } -// DeleteBucketAnalyticsConfiguration mocks base method +// DeleteBucketAnalyticsConfiguration mocks base method. func (m *MockS3API) DeleteBucketAnalyticsConfiguration(arg0 *s3.DeleteBucketAnalyticsConfigurationInput) (*s3.DeleteBucketAnalyticsConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketAnalyticsConfiguration", arg0) @@ -312,13 +312,13 @@ func (m *MockS3API) DeleteBucketAnalyticsConfiguration(arg0 *s3.DeleteBucketAnal return ret0, ret1 } -// DeleteBucketAnalyticsConfiguration indicates an expected call of DeleteBucketAnalyticsConfiguration +// DeleteBucketAnalyticsConfiguration indicates an expected call of DeleteBucketAnalyticsConfiguration. func (mr *MockS3APIMockRecorder) DeleteBucketAnalyticsConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketAnalyticsConfiguration", reflect.TypeOf((*MockS3API)(nil).DeleteBucketAnalyticsConfiguration), arg0) } -// DeleteBucketAnalyticsConfigurationRequest mocks base method +// DeleteBucketAnalyticsConfigurationRequest mocks base method. func (m *MockS3API) DeleteBucketAnalyticsConfigurationRequest(arg0 *s3.DeleteBucketAnalyticsConfigurationInput) (*request.Request, *s3.DeleteBucketAnalyticsConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketAnalyticsConfigurationRequest", arg0) @@ -327,13 +327,13 @@ func (m *MockS3API) DeleteBucketAnalyticsConfigurationRequest(arg0 *s3.DeleteBuc return ret0, ret1 } -// DeleteBucketAnalyticsConfigurationRequest indicates an expected call of DeleteBucketAnalyticsConfigurationRequest +// DeleteBucketAnalyticsConfigurationRequest indicates an expected call of DeleteBucketAnalyticsConfigurationRequest. func (mr *MockS3APIMockRecorder) DeleteBucketAnalyticsConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketAnalyticsConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketAnalyticsConfigurationRequest), arg0) } -// DeleteBucketAnalyticsConfigurationWithContext mocks base method +// DeleteBucketAnalyticsConfigurationWithContext mocks base method. func (m *MockS3API) DeleteBucketAnalyticsConfigurationWithContext(arg0 context.Context, arg1 *s3.DeleteBucketAnalyticsConfigurationInput, arg2 ...request.Option) (*s3.DeleteBucketAnalyticsConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -346,14 +346,14 @@ func (m *MockS3API) DeleteBucketAnalyticsConfigurationWithContext(arg0 context.C return ret0, ret1 } -// DeleteBucketAnalyticsConfigurationWithContext indicates an expected call of DeleteBucketAnalyticsConfigurationWithContext +// DeleteBucketAnalyticsConfigurationWithContext indicates an expected call of DeleteBucketAnalyticsConfigurationWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketAnalyticsConfigurationWithContext(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, "DeleteBucketAnalyticsConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketAnalyticsConfigurationWithContext), varargs...) } -// DeleteBucketCors mocks base method +// DeleteBucketCors mocks base method. func (m *MockS3API) DeleteBucketCors(arg0 *s3.DeleteBucketCorsInput) (*s3.DeleteBucketCorsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketCors", arg0) @@ -362,13 +362,13 @@ func (m *MockS3API) DeleteBucketCors(arg0 *s3.DeleteBucketCorsInput) (*s3.Delete return ret0, ret1 } -// DeleteBucketCors indicates an expected call of DeleteBucketCors +// DeleteBucketCors indicates an expected call of DeleteBucketCors. func (mr *MockS3APIMockRecorder) DeleteBucketCors(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketCors", reflect.TypeOf((*MockS3API)(nil).DeleteBucketCors), arg0) } -// DeleteBucketCorsRequest mocks base method +// DeleteBucketCorsRequest mocks base method. func (m *MockS3API) DeleteBucketCorsRequest(arg0 *s3.DeleteBucketCorsInput) (*request.Request, *s3.DeleteBucketCorsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketCorsRequest", arg0) @@ -377,13 +377,13 @@ func (m *MockS3API) DeleteBucketCorsRequest(arg0 *s3.DeleteBucketCorsInput) (*re return ret0, ret1 } -// DeleteBucketCorsRequest indicates an expected call of DeleteBucketCorsRequest +// DeleteBucketCorsRequest indicates an expected call of DeleteBucketCorsRequest. func (mr *MockS3APIMockRecorder) DeleteBucketCorsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketCorsRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketCorsRequest), arg0) } -// DeleteBucketCorsWithContext mocks base method +// DeleteBucketCorsWithContext mocks base method. func (m *MockS3API) DeleteBucketCorsWithContext(arg0 context.Context, arg1 *s3.DeleteBucketCorsInput, arg2 ...request.Option) (*s3.DeleteBucketCorsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -396,14 +396,14 @@ func (m *MockS3API) DeleteBucketCorsWithContext(arg0 context.Context, arg1 *s3.D return ret0, ret1 } -// DeleteBucketCorsWithContext indicates an expected call of DeleteBucketCorsWithContext +// DeleteBucketCorsWithContext indicates an expected call of DeleteBucketCorsWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketCorsWithContext(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, "DeleteBucketCorsWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketCorsWithContext), varargs...) } -// DeleteBucketEncryption mocks base method +// DeleteBucketEncryption mocks base method. func (m *MockS3API) DeleteBucketEncryption(arg0 *s3.DeleteBucketEncryptionInput) (*s3.DeleteBucketEncryptionOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketEncryption", arg0) @@ -412,13 +412,13 @@ func (m *MockS3API) DeleteBucketEncryption(arg0 *s3.DeleteBucketEncryptionInput) return ret0, ret1 } -// DeleteBucketEncryption indicates an expected call of DeleteBucketEncryption +// DeleteBucketEncryption indicates an expected call of DeleteBucketEncryption. func (mr *MockS3APIMockRecorder) DeleteBucketEncryption(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketEncryption", reflect.TypeOf((*MockS3API)(nil).DeleteBucketEncryption), arg0) } -// DeleteBucketEncryptionRequest mocks base method +// DeleteBucketEncryptionRequest mocks base method. func (m *MockS3API) DeleteBucketEncryptionRequest(arg0 *s3.DeleteBucketEncryptionInput) (*request.Request, *s3.DeleteBucketEncryptionOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketEncryptionRequest", arg0) @@ -427,13 +427,13 @@ func (m *MockS3API) DeleteBucketEncryptionRequest(arg0 *s3.DeleteBucketEncryptio return ret0, ret1 } -// DeleteBucketEncryptionRequest indicates an expected call of DeleteBucketEncryptionRequest +// DeleteBucketEncryptionRequest indicates an expected call of DeleteBucketEncryptionRequest. func (mr *MockS3APIMockRecorder) DeleteBucketEncryptionRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketEncryptionRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketEncryptionRequest), arg0) } -// DeleteBucketEncryptionWithContext mocks base method +// DeleteBucketEncryptionWithContext mocks base method. func (m *MockS3API) DeleteBucketEncryptionWithContext(arg0 context.Context, arg1 *s3.DeleteBucketEncryptionInput, arg2 ...request.Option) (*s3.DeleteBucketEncryptionOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -446,14 +446,64 @@ func (m *MockS3API) DeleteBucketEncryptionWithContext(arg0 context.Context, arg1 return ret0, ret1 } -// DeleteBucketEncryptionWithContext indicates an expected call of DeleteBucketEncryptionWithContext +// DeleteBucketEncryptionWithContext indicates an expected call of DeleteBucketEncryptionWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketEncryptionWithContext(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, "DeleteBucketEncryptionWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketEncryptionWithContext), varargs...) } -// DeleteBucketInventoryConfiguration mocks base method +// DeleteBucketIntelligentTieringConfiguration mocks base method. +func (m *MockS3API) DeleteBucketIntelligentTieringConfiguration(arg0 *s3.DeleteBucketIntelligentTieringConfigurationInput) (*s3.DeleteBucketIntelligentTieringConfigurationOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteBucketIntelligentTieringConfiguration", arg0) + ret0, _ := ret[0].(*s3.DeleteBucketIntelligentTieringConfigurationOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteBucketIntelligentTieringConfiguration indicates an expected call of DeleteBucketIntelligentTieringConfiguration. +func (mr *MockS3APIMockRecorder) DeleteBucketIntelligentTieringConfiguration(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketIntelligentTieringConfiguration", reflect.TypeOf((*MockS3API)(nil).DeleteBucketIntelligentTieringConfiguration), arg0) +} + +// DeleteBucketIntelligentTieringConfigurationRequest mocks base method. +func (m *MockS3API) DeleteBucketIntelligentTieringConfigurationRequest(arg0 *s3.DeleteBucketIntelligentTieringConfigurationInput) (*request.Request, *s3.DeleteBucketIntelligentTieringConfigurationOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteBucketIntelligentTieringConfigurationRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*s3.DeleteBucketIntelligentTieringConfigurationOutput) + return ret0, ret1 +} + +// DeleteBucketIntelligentTieringConfigurationRequest indicates an expected call of DeleteBucketIntelligentTieringConfigurationRequest. +func (mr *MockS3APIMockRecorder) DeleteBucketIntelligentTieringConfigurationRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketIntelligentTieringConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketIntelligentTieringConfigurationRequest), arg0) +} + +// DeleteBucketIntelligentTieringConfigurationWithContext mocks base method. +func (m *MockS3API) DeleteBucketIntelligentTieringConfigurationWithContext(arg0 context.Context, arg1 *s3.DeleteBucketIntelligentTieringConfigurationInput, arg2 ...request.Option) (*s3.DeleteBucketIntelligentTieringConfigurationOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteBucketIntelligentTieringConfigurationWithContext", varargs...) + ret0, _ := ret[0].(*s3.DeleteBucketIntelligentTieringConfigurationOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteBucketIntelligentTieringConfigurationWithContext indicates an expected call of DeleteBucketIntelligentTieringConfigurationWithContext. +func (mr *MockS3APIMockRecorder) DeleteBucketIntelligentTieringConfigurationWithContext(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, "DeleteBucketIntelligentTieringConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketIntelligentTieringConfigurationWithContext), varargs...) +} + +// DeleteBucketInventoryConfiguration mocks base method. func (m *MockS3API) DeleteBucketInventoryConfiguration(arg0 *s3.DeleteBucketInventoryConfigurationInput) (*s3.DeleteBucketInventoryConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketInventoryConfiguration", arg0) @@ -462,13 +512,13 @@ func (m *MockS3API) DeleteBucketInventoryConfiguration(arg0 *s3.DeleteBucketInve return ret0, ret1 } -// DeleteBucketInventoryConfiguration indicates an expected call of DeleteBucketInventoryConfiguration +// DeleteBucketInventoryConfiguration indicates an expected call of DeleteBucketInventoryConfiguration. func (mr *MockS3APIMockRecorder) DeleteBucketInventoryConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketInventoryConfiguration", reflect.TypeOf((*MockS3API)(nil).DeleteBucketInventoryConfiguration), arg0) } -// DeleteBucketInventoryConfigurationRequest mocks base method +// DeleteBucketInventoryConfigurationRequest mocks base method. func (m *MockS3API) DeleteBucketInventoryConfigurationRequest(arg0 *s3.DeleteBucketInventoryConfigurationInput) (*request.Request, *s3.DeleteBucketInventoryConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketInventoryConfigurationRequest", arg0) @@ -477,13 +527,13 @@ func (m *MockS3API) DeleteBucketInventoryConfigurationRequest(arg0 *s3.DeleteBuc return ret0, ret1 } -// DeleteBucketInventoryConfigurationRequest indicates an expected call of DeleteBucketInventoryConfigurationRequest +// DeleteBucketInventoryConfigurationRequest indicates an expected call of DeleteBucketInventoryConfigurationRequest. func (mr *MockS3APIMockRecorder) DeleteBucketInventoryConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketInventoryConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketInventoryConfigurationRequest), arg0) } -// DeleteBucketInventoryConfigurationWithContext mocks base method +// DeleteBucketInventoryConfigurationWithContext mocks base method. func (m *MockS3API) DeleteBucketInventoryConfigurationWithContext(arg0 context.Context, arg1 *s3.DeleteBucketInventoryConfigurationInput, arg2 ...request.Option) (*s3.DeleteBucketInventoryConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -496,14 +546,14 @@ func (m *MockS3API) DeleteBucketInventoryConfigurationWithContext(arg0 context.C return ret0, ret1 } -// DeleteBucketInventoryConfigurationWithContext indicates an expected call of DeleteBucketInventoryConfigurationWithContext +// DeleteBucketInventoryConfigurationWithContext indicates an expected call of DeleteBucketInventoryConfigurationWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketInventoryConfigurationWithContext(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, "DeleteBucketInventoryConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketInventoryConfigurationWithContext), varargs...) } -// DeleteBucketLifecycle mocks base method +// DeleteBucketLifecycle mocks base method. func (m *MockS3API) DeleteBucketLifecycle(arg0 *s3.DeleteBucketLifecycleInput) (*s3.DeleteBucketLifecycleOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketLifecycle", arg0) @@ -512,13 +562,13 @@ func (m *MockS3API) DeleteBucketLifecycle(arg0 *s3.DeleteBucketLifecycleInput) ( return ret0, ret1 } -// DeleteBucketLifecycle indicates an expected call of DeleteBucketLifecycle +// DeleteBucketLifecycle indicates an expected call of DeleteBucketLifecycle. func (mr *MockS3APIMockRecorder) DeleteBucketLifecycle(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketLifecycle", reflect.TypeOf((*MockS3API)(nil).DeleteBucketLifecycle), arg0) } -// DeleteBucketLifecycleRequest mocks base method +// DeleteBucketLifecycleRequest mocks base method. func (m *MockS3API) DeleteBucketLifecycleRequest(arg0 *s3.DeleteBucketLifecycleInput) (*request.Request, *s3.DeleteBucketLifecycleOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketLifecycleRequest", arg0) @@ -527,13 +577,13 @@ func (m *MockS3API) DeleteBucketLifecycleRequest(arg0 *s3.DeleteBucketLifecycleI return ret0, ret1 } -// DeleteBucketLifecycleRequest indicates an expected call of DeleteBucketLifecycleRequest +// DeleteBucketLifecycleRequest indicates an expected call of DeleteBucketLifecycleRequest. func (mr *MockS3APIMockRecorder) DeleteBucketLifecycleRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketLifecycleRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketLifecycleRequest), arg0) } -// DeleteBucketLifecycleWithContext mocks base method +// DeleteBucketLifecycleWithContext mocks base method. func (m *MockS3API) DeleteBucketLifecycleWithContext(arg0 context.Context, arg1 *s3.DeleteBucketLifecycleInput, arg2 ...request.Option) (*s3.DeleteBucketLifecycleOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -546,14 +596,14 @@ func (m *MockS3API) DeleteBucketLifecycleWithContext(arg0 context.Context, arg1 return ret0, ret1 } -// DeleteBucketLifecycleWithContext indicates an expected call of DeleteBucketLifecycleWithContext +// DeleteBucketLifecycleWithContext indicates an expected call of DeleteBucketLifecycleWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketLifecycleWithContext(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, "DeleteBucketLifecycleWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketLifecycleWithContext), varargs...) } -// DeleteBucketMetricsConfiguration mocks base method +// DeleteBucketMetricsConfiguration mocks base method. func (m *MockS3API) DeleteBucketMetricsConfiguration(arg0 *s3.DeleteBucketMetricsConfigurationInput) (*s3.DeleteBucketMetricsConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketMetricsConfiguration", arg0) @@ -562,13 +612,13 @@ func (m *MockS3API) DeleteBucketMetricsConfiguration(arg0 *s3.DeleteBucketMetric return ret0, ret1 } -// DeleteBucketMetricsConfiguration indicates an expected call of DeleteBucketMetricsConfiguration +// DeleteBucketMetricsConfiguration indicates an expected call of DeleteBucketMetricsConfiguration. func (mr *MockS3APIMockRecorder) DeleteBucketMetricsConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketMetricsConfiguration", reflect.TypeOf((*MockS3API)(nil).DeleteBucketMetricsConfiguration), arg0) } -// DeleteBucketMetricsConfigurationRequest mocks base method +// DeleteBucketMetricsConfigurationRequest mocks base method. func (m *MockS3API) DeleteBucketMetricsConfigurationRequest(arg0 *s3.DeleteBucketMetricsConfigurationInput) (*request.Request, *s3.DeleteBucketMetricsConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketMetricsConfigurationRequest", arg0) @@ -577,13 +627,13 @@ func (m *MockS3API) DeleteBucketMetricsConfigurationRequest(arg0 *s3.DeleteBucke return ret0, ret1 } -// DeleteBucketMetricsConfigurationRequest indicates an expected call of DeleteBucketMetricsConfigurationRequest +// DeleteBucketMetricsConfigurationRequest indicates an expected call of DeleteBucketMetricsConfigurationRequest. func (mr *MockS3APIMockRecorder) DeleteBucketMetricsConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketMetricsConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketMetricsConfigurationRequest), arg0) } -// DeleteBucketMetricsConfigurationWithContext mocks base method +// DeleteBucketMetricsConfigurationWithContext mocks base method. func (m *MockS3API) DeleteBucketMetricsConfigurationWithContext(arg0 context.Context, arg1 *s3.DeleteBucketMetricsConfigurationInput, arg2 ...request.Option) (*s3.DeleteBucketMetricsConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -596,14 +646,14 @@ func (m *MockS3API) DeleteBucketMetricsConfigurationWithContext(arg0 context.Con return ret0, ret1 } -// DeleteBucketMetricsConfigurationWithContext indicates an expected call of DeleteBucketMetricsConfigurationWithContext +// DeleteBucketMetricsConfigurationWithContext indicates an expected call of DeleteBucketMetricsConfigurationWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketMetricsConfigurationWithContext(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, "DeleteBucketMetricsConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketMetricsConfigurationWithContext), varargs...) } -// DeleteBucketOwnershipControls mocks base method +// DeleteBucketOwnershipControls mocks base method. func (m *MockS3API) DeleteBucketOwnershipControls(arg0 *s3.DeleteBucketOwnershipControlsInput) (*s3.DeleteBucketOwnershipControlsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketOwnershipControls", arg0) @@ -612,13 +662,13 @@ func (m *MockS3API) DeleteBucketOwnershipControls(arg0 *s3.DeleteBucketOwnership return ret0, ret1 } -// DeleteBucketOwnershipControls indicates an expected call of DeleteBucketOwnershipControls +// DeleteBucketOwnershipControls indicates an expected call of DeleteBucketOwnershipControls. func (mr *MockS3APIMockRecorder) DeleteBucketOwnershipControls(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketOwnershipControls", reflect.TypeOf((*MockS3API)(nil).DeleteBucketOwnershipControls), arg0) } -// DeleteBucketOwnershipControlsRequest mocks base method +// DeleteBucketOwnershipControlsRequest mocks base method. func (m *MockS3API) DeleteBucketOwnershipControlsRequest(arg0 *s3.DeleteBucketOwnershipControlsInput) (*request.Request, *s3.DeleteBucketOwnershipControlsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketOwnershipControlsRequest", arg0) @@ -627,13 +677,13 @@ func (m *MockS3API) DeleteBucketOwnershipControlsRequest(arg0 *s3.DeleteBucketOw return ret0, ret1 } -// DeleteBucketOwnershipControlsRequest indicates an expected call of DeleteBucketOwnershipControlsRequest +// DeleteBucketOwnershipControlsRequest indicates an expected call of DeleteBucketOwnershipControlsRequest. func (mr *MockS3APIMockRecorder) DeleteBucketOwnershipControlsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketOwnershipControlsRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketOwnershipControlsRequest), arg0) } -// DeleteBucketOwnershipControlsWithContext mocks base method +// DeleteBucketOwnershipControlsWithContext mocks base method. func (m *MockS3API) DeleteBucketOwnershipControlsWithContext(arg0 context.Context, arg1 *s3.DeleteBucketOwnershipControlsInput, arg2 ...request.Option) (*s3.DeleteBucketOwnershipControlsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -646,14 +696,14 @@ func (m *MockS3API) DeleteBucketOwnershipControlsWithContext(arg0 context.Contex return ret0, ret1 } -// DeleteBucketOwnershipControlsWithContext indicates an expected call of DeleteBucketOwnershipControlsWithContext +// DeleteBucketOwnershipControlsWithContext indicates an expected call of DeleteBucketOwnershipControlsWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketOwnershipControlsWithContext(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, "DeleteBucketOwnershipControlsWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketOwnershipControlsWithContext), varargs...) } -// DeleteBucketPolicy mocks base method +// DeleteBucketPolicy mocks base method. func (m *MockS3API) DeleteBucketPolicy(arg0 *s3.DeleteBucketPolicyInput) (*s3.DeleteBucketPolicyOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketPolicy", arg0) @@ -662,13 +712,13 @@ func (m *MockS3API) DeleteBucketPolicy(arg0 *s3.DeleteBucketPolicyInput) (*s3.De return ret0, ret1 } -// DeleteBucketPolicy indicates an expected call of DeleteBucketPolicy +// DeleteBucketPolicy indicates an expected call of DeleteBucketPolicy. func (mr *MockS3APIMockRecorder) DeleteBucketPolicy(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketPolicy", reflect.TypeOf((*MockS3API)(nil).DeleteBucketPolicy), arg0) } -// DeleteBucketPolicyRequest mocks base method +// DeleteBucketPolicyRequest mocks base method. func (m *MockS3API) DeleteBucketPolicyRequest(arg0 *s3.DeleteBucketPolicyInput) (*request.Request, *s3.DeleteBucketPolicyOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketPolicyRequest", arg0) @@ -677,13 +727,13 @@ func (m *MockS3API) DeleteBucketPolicyRequest(arg0 *s3.DeleteBucketPolicyInput) return ret0, ret1 } -// DeleteBucketPolicyRequest indicates an expected call of DeleteBucketPolicyRequest +// DeleteBucketPolicyRequest indicates an expected call of DeleteBucketPolicyRequest. func (mr *MockS3APIMockRecorder) DeleteBucketPolicyRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketPolicyRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketPolicyRequest), arg0) } -// DeleteBucketPolicyWithContext mocks base method +// DeleteBucketPolicyWithContext mocks base method. func (m *MockS3API) DeleteBucketPolicyWithContext(arg0 context.Context, arg1 *s3.DeleteBucketPolicyInput, arg2 ...request.Option) (*s3.DeleteBucketPolicyOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -696,14 +746,14 @@ func (m *MockS3API) DeleteBucketPolicyWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// DeleteBucketPolicyWithContext indicates an expected call of DeleteBucketPolicyWithContext +// DeleteBucketPolicyWithContext indicates an expected call of DeleteBucketPolicyWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketPolicyWithContext(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, "DeleteBucketPolicyWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketPolicyWithContext), varargs...) } -// DeleteBucketReplication mocks base method +// DeleteBucketReplication mocks base method. func (m *MockS3API) DeleteBucketReplication(arg0 *s3.DeleteBucketReplicationInput) (*s3.DeleteBucketReplicationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketReplication", arg0) @@ -712,13 +762,13 @@ func (m *MockS3API) DeleteBucketReplication(arg0 *s3.DeleteBucketReplicationInpu return ret0, ret1 } -// DeleteBucketReplication indicates an expected call of DeleteBucketReplication +// DeleteBucketReplication indicates an expected call of DeleteBucketReplication. func (mr *MockS3APIMockRecorder) DeleteBucketReplication(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketReplication", reflect.TypeOf((*MockS3API)(nil).DeleteBucketReplication), arg0) } -// DeleteBucketReplicationRequest mocks base method +// DeleteBucketReplicationRequest mocks base method. func (m *MockS3API) DeleteBucketReplicationRequest(arg0 *s3.DeleteBucketReplicationInput) (*request.Request, *s3.DeleteBucketReplicationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketReplicationRequest", arg0) @@ -727,13 +777,13 @@ func (m *MockS3API) DeleteBucketReplicationRequest(arg0 *s3.DeleteBucketReplicat return ret0, ret1 } -// DeleteBucketReplicationRequest indicates an expected call of DeleteBucketReplicationRequest +// DeleteBucketReplicationRequest indicates an expected call of DeleteBucketReplicationRequest. func (mr *MockS3APIMockRecorder) DeleteBucketReplicationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketReplicationRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketReplicationRequest), arg0) } -// DeleteBucketReplicationWithContext mocks base method +// DeleteBucketReplicationWithContext mocks base method. func (m *MockS3API) DeleteBucketReplicationWithContext(arg0 context.Context, arg1 *s3.DeleteBucketReplicationInput, arg2 ...request.Option) (*s3.DeleteBucketReplicationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -746,14 +796,14 @@ func (m *MockS3API) DeleteBucketReplicationWithContext(arg0 context.Context, arg return ret0, ret1 } -// DeleteBucketReplicationWithContext indicates an expected call of DeleteBucketReplicationWithContext +// DeleteBucketReplicationWithContext indicates an expected call of DeleteBucketReplicationWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketReplicationWithContext(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, "DeleteBucketReplicationWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketReplicationWithContext), varargs...) } -// DeleteBucketRequest mocks base method +// DeleteBucketRequest mocks base method. func (m *MockS3API) DeleteBucketRequest(arg0 *s3.DeleteBucketInput) (*request.Request, *s3.DeleteBucketOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketRequest", arg0) @@ -762,13 +812,13 @@ func (m *MockS3API) DeleteBucketRequest(arg0 *s3.DeleteBucketInput) (*request.Re return ret0, ret1 } -// DeleteBucketRequest indicates an expected call of DeleteBucketRequest +// DeleteBucketRequest indicates an expected call of DeleteBucketRequest. func (mr *MockS3APIMockRecorder) DeleteBucketRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketRequest), arg0) } -// DeleteBucketTagging mocks base method +// DeleteBucketTagging mocks base method. func (m *MockS3API) DeleteBucketTagging(arg0 *s3.DeleteBucketTaggingInput) (*s3.DeleteBucketTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketTagging", arg0) @@ -777,13 +827,13 @@ func (m *MockS3API) DeleteBucketTagging(arg0 *s3.DeleteBucketTaggingInput) (*s3. return ret0, ret1 } -// DeleteBucketTagging indicates an expected call of DeleteBucketTagging +// DeleteBucketTagging indicates an expected call of DeleteBucketTagging. func (mr *MockS3APIMockRecorder) DeleteBucketTagging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketTagging", reflect.TypeOf((*MockS3API)(nil).DeleteBucketTagging), arg0) } -// DeleteBucketTaggingRequest mocks base method +// DeleteBucketTaggingRequest mocks base method. func (m *MockS3API) DeleteBucketTaggingRequest(arg0 *s3.DeleteBucketTaggingInput) (*request.Request, *s3.DeleteBucketTaggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketTaggingRequest", arg0) @@ -792,13 +842,13 @@ func (m *MockS3API) DeleteBucketTaggingRequest(arg0 *s3.DeleteBucketTaggingInput return ret0, ret1 } -// DeleteBucketTaggingRequest indicates an expected call of DeleteBucketTaggingRequest +// DeleteBucketTaggingRequest indicates an expected call of DeleteBucketTaggingRequest. func (mr *MockS3APIMockRecorder) DeleteBucketTaggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketTaggingRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketTaggingRequest), arg0) } -// DeleteBucketTaggingWithContext mocks base method +// DeleteBucketTaggingWithContext mocks base method. func (m *MockS3API) DeleteBucketTaggingWithContext(arg0 context.Context, arg1 *s3.DeleteBucketTaggingInput, arg2 ...request.Option) (*s3.DeleteBucketTaggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -811,14 +861,14 @@ func (m *MockS3API) DeleteBucketTaggingWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// DeleteBucketTaggingWithContext indicates an expected call of DeleteBucketTaggingWithContext +// DeleteBucketTaggingWithContext indicates an expected call of DeleteBucketTaggingWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketTaggingWithContext(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, "DeleteBucketTaggingWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketTaggingWithContext), varargs...) } -// DeleteBucketWebsite mocks base method +// DeleteBucketWebsite mocks base method. func (m *MockS3API) DeleteBucketWebsite(arg0 *s3.DeleteBucketWebsiteInput) (*s3.DeleteBucketWebsiteOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketWebsite", arg0) @@ -827,13 +877,13 @@ func (m *MockS3API) DeleteBucketWebsite(arg0 *s3.DeleteBucketWebsiteInput) (*s3. return ret0, ret1 } -// DeleteBucketWebsite indicates an expected call of DeleteBucketWebsite +// DeleteBucketWebsite indicates an expected call of DeleteBucketWebsite. func (mr *MockS3APIMockRecorder) DeleteBucketWebsite(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketWebsite", reflect.TypeOf((*MockS3API)(nil).DeleteBucketWebsite), arg0) } -// DeleteBucketWebsiteRequest mocks base method +// DeleteBucketWebsiteRequest mocks base method. func (m *MockS3API) DeleteBucketWebsiteRequest(arg0 *s3.DeleteBucketWebsiteInput) (*request.Request, *s3.DeleteBucketWebsiteOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteBucketWebsiteRequest", arg0) @@ -842,13 +892,13 @@ func (m *MockS3API) DeleteBucketWebsiteRequest(arg0 *s3.DeleteBucketWebsiteInput return ret0, ret1 } -// DeleteBucketWebsiteRequest indicates an expected call of DeleteBucketWebsiteRequest +// DeleteBucketWebsiteRequest indicates an expected call of DeleteBucketWebsiteRequest. func (mr *MockS3APIMockRecorder) DeleteBucketWebsiteRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBucketWebsiteRequest", reflect.TypeOf((*MockS3API)(nil).DeleteBucketWebsiteRequest), arg0) } -// DeleteBucketWebsiteWithContext mocks base method +// DeleteBucketWebsiteWithContext mocks base method. func (m *MockS3API) DeleteBucketWebsiteWithContext(arg0 context.Context, arg1 *s3.DeleteBucketWebsiteInput, arg2 ...request.Option) (*s3.DeleteBucketWebsiteOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -861,14 +911,14 @@ func (m *MockS3API) DeleteBucketWebsiteWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// DeleteBucketWebsiteWithContext indicates an expected call of DeleteBucketWebsiteWithContext +// DeleteBucketWebsiteWithContext indicates an expected call of DeleteBucketWebsiteWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketWebsiteWithContext(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, "DeleteBucketWebsiteWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketWebsiteWithContext), varargs...) } -// DeleteBucketWithContext mocks base method +// DeleteBucketWithContext mocks base method. func (m *MockS3API) DeleteBucketWithContext(arg0 context.Context, arg1 *s3.DeleteBucketInput, arg2 ...request.Option) (*s3.DeleteBucketOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -881,14 +931,14 @@ func (m *MockS3API) DeleteBucketWithContext(arg0 context.Context, arg1 *s3.Delet return ret0, ret1 } -// DeleteBucketWithContext indicates an expected call of DeleteBucketWithContext +// DeleteBucketWithContext indicates an expected call of DeleteBucketWithContext. func (mr *MockS3APIMockRecorder) DeleteBucketWithContext(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, "DeleteBucketWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteBucketWithContext), varargs...) } -// DeleteObject mocks base method +// DeleteObject mocks base method. func (m *MockS3API) DeleteObject(arg0 *s3.DeleteObjectInput) (*s3.DeleteObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObject", arg0) @@ -897,13 +947,13 @@ func (m *MockS3API) DeleteObject(arg0 *s3.DeleteObjectInput) (*s3.DeleteObjectOu return ret0, ret1 } -// DeleteObject indicates an expected call of DeleteObject +// DeleteObject indicates an expected call of DeleteObject. func (mr *MockS3APIMockRecorder) DeleteObject(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObject", reflect.TypeOf((*MockS3API)(nil).DeleteObject), arg0) } -// DeleteObjectRequest mocks base method +// DeleteObjectRequest mocks base method. func (m *MockS3API) DeleteObjectRequest(arg0 *s3.DeleteObjectInput) (*request.Request, *s3.DeleteObjectOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjectRequest", arg0) @@ -912,13 +962,13 @@ func (m *MockS3API) DeleteObjectRequest(arg0 *s3.DeleteObjectInput) (*request.Re return ret0, ret1 } -// DeleteObjectRequest indicates an expected call of DeleteObjectRequest +// DeleteObjectRequest indicates an expected call of DeleteObjectRequest. func (mr *MockS3APIMockRecorder) DeleteObjectRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectRequest", reflect.TypeOf((*MockS3API)(nil).DeleteObjectRequest), arg0) } -// DeleteObjectTagging mocks base method +// DeleteObjectTagging mocks base method. func (m *MockS3API) DeleteObjectTagging(arg0 *s3.DeleteObjectTaggingInput) (*s3.DeleteObjectTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjectTagging", arg0) @@ -927,13 +977,13 @@ func (m *MockS3API) DeleteObjectTagging(arg0 *s3.DeleteObjectTaggingInput) (*s3. return ret0, ret1 } -// DeleteObjectTagging indicates an expected call of DeleteObjectTagging +// DeleteObjectTagging indicates an expected call of DeleteObjectTagging. func (mr *MockS3APIMockRecorder) DeleteObjectTagging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectTagging", reflect.TypeOf((*MockS3API)(nil).DeleteObjectTagging), arg0) } -// DeleteObjectTaggingRequest mocks base method +// DeleteObjectTaggingRequest mocks base method. func (m *MockS3API) DeleteObjectTaggingRequest(arg0 *s3.DeleteObjectTaggingInput) (*request.Request, *s3.DeleteObjectTaggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjectTaggingRequest", arg0) @@ -942,13 +992,13 @@ func (m *MockS3API) DeleteObjectTaggingRequest(arg0 *s3.DeleteObjectTaggingInput return ret0, ret1 } -// DeleteObjectTaggingRequest indicates an expected call of DeleteObjectTaggingRequest +// DeleteObjectTaggingRequest indicates an expected call of DeleteObjectTaggingRequest. func (mr *MockS3APIMockRecorder) DeleteObjectTaggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectTaggingRequest", reflect.TypeOf((*MockS3API)(nil).DeleteObjectTaggingRequest), arg0) } -// DeleteObjectTaggingWithContext mocks base method +// DeleteObjectTaggingWithContext mocks base method. func (m *MockS3API) DeleteObjectTaggingWithContext(arg0 context.Context, arg1 *s3.DeleteObjectTaggingInput, arg2 ...request.Option) (*s3.DeleteObjectTaggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -961,14 +1011,14 @@ func (m *MockS3API) DeleteObjectTaggingWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// DeleteObjectTaggingWithContext indicates an expected call of DeleteObjectTaggingWithContext +// DeleteObjectTaggingWithContext indicates an expected call of DeleteObjectTaggingWithContext. func (mr *MockS3APIMockRecorder) DeleteObjectTaggingWithContext(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, "DeleteObjectTaggingWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteObjectTaggingWithContext), varargs...) } -// DeleteObjectWithContext mocks base method +// DeleteObjectWithContext mocks base method. func (m *MockS3API) DeleteObjectWithContext(arg0 context.Context, arg1 *s3.DeleteObjectInput, arg2 ...request.Option) (*s3.DeleteObjectOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -981,14 +1031,14 @@ func (m *MockS3API) DeleteObjectWithContext(arg0 context.Context, arg1 *s3.Delet return ret0, ret1 } -// DeleteObjectWithContext indicates an expected call of DeleteObjectWithContext +// DeleteObjectWithContext indicates an expected call of DeleteObjectWithContext. func (mr *MockS3APIMockRecorder) DeleteObjectWithContext(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, "DeleteObjectWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteObjectWithContext), varargs...) } -// DeleteObjects mocks base method +// DeleteObjects mocks base method. func (m *MockS3API) DeleteObjects(arg0 *s3.DeleteObjectsInput) (*s3.DeleteObjectsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjects", arg0) @@ -997,13 +1047,13 @@ func (m *MockS3API) DeleteObjects(arg0 *s3.DeleteObjectsInput) (*s3.DeleteObject return ret0, ret1 } -// DeleteObjects indicates an expected call of DeleteObjects +// DeleteObjects indicates an expected call of DeleteObjects. func (mr *MockS3APIMockRecorder) DeleteObjects(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjects", reflect.TypeOf((*MockS3API)(nil).DeleteObjects), arg0) } -// DeleteObjectsRequest mocks base method +// DeleteObjectsRequest mocks base method. func (m *MockS3API) DeleteObjectsRequest(arg0 *s3.DeleteObjectsInput) (*request.Request, *s3.DeleteObjectsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteObjectsRequest", arg0) @@ -1012,13 +1062,13 @@ func (m *MockS3API) DeleteObjectsRequest(arg0 *s3.DeleteObjectsInput) (*request. return ret0, ret1 } -// DeleteObjectsRequest indicates an expected call of DeleteObjectsRequest +// DeleteObjectsRequest indicates an expected call of DeleteObjectsRequest. func (mr *MockS3APIMockRecorder) DeleteObjectsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteObjectsRequest", reflect.TypeOf((*MockS3API)(nil).DeleteObjectsRequest), arg0) } -// DeleteObjectsWithContext mocks base method +// DeleteObjectsWithContext mocks base method. func (m *MockS3API) DeleteObjectsWithContext(arg0 context.Context, arg1 *s3.DeleteObjectsInput, arg2 ...request.Option) (*s3.DeleteObjectsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1031,14 +1081,14 @@ func (m *MockS3API) DeleteObjectsWithContext(arg0 context.Context, arg1 *s3.Dele return ret0, ret1 } -// DeleteObjectsWithContext indicates an expected call of DeleteObjectsWithContext +// DeleteObjectsWithContext indicates an expected call of DeleteObjectsWithContext. func (mr *MockS3APIMockRecorder) DeleteObjectsWithContext(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, "DeleteObjectsWithContext", reflect.TypeOf((*MockS3API)(nil).DeleteObjectsWithContext), varargs...) } -// DeletePublicAccessBlock mocks base method +// DeletePublicAccessBlock mocks base method. func (m *MockS3API) DeletePublicAccessBlock(arg0 *s3.DeletePublicAccessBlockInput) (*s3.DeletePublicAccessBlockOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeletePublicAccessBlock", arg0) @@ -1047,13 +1097,13 @@ func (m *MockS3API) DeletePublicAccessBlock(arg0 *s3.DeletePublicAccessBlockInpu return ret0, ret1 } -// DeletePublicAccessBlock indicates an expected call of DeletePublicAccessBlock +// DeletePublicAccessBlock indicates an expected call of DeletePublicAccessBlock. func (mr *MockS3APIMockRecorder) DeletePublicAccessBlock(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePublicAccessBlock", reflect.TypeOf((*MockS3API)(nil).DeletePublicAccessBlock), arg0) } -// DeletePublicAccessBlockRequest mocks base method +// DeletePublicAccessBlockRequest mocks base method. func (m *MockS3API) DeletePublicAccessBlockRequest(arg0 *s3.DeletePublicAccessBlockInput) (*request.Request, *s3.DeletePublicAccessBlockOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeletePublicAccessBlockRequest", arg0) @@ -1062,13 +1112,13 @@ func (m *MockS3API) DeletePublicAccessBlockRequest(arg0 *s3.DeletePublicAccessBl return ret0, ret1 } -// DeletePublicAccessBlockRequest indicates an expected call of DeletePublicAccessBlockRequest +// DeletePublicAccessBlockRequest indicates an expected call of DeletePublicAccessBlockRequest. func (mr *MockS3APIMockRecorder) DeletePublicAccessBlockRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeletePublicAccessBlockRequest", reflect.TypeOf((*MockS3API)(nil).DeletePublicAccessBlockRequest), arg0) } -// DeletePublicAccessBlockWithContext mocks base method +// DeletePublicAccessBlockWithContext mocks base method. func (m *MockS3API) DeletePublicAccessBlockWithContext(arg0 context.Context, arg1 *s3.DeletePublicAccessBlockInput, arg2 ...request.Option) (*s3.DeletePublicAccessBlockOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1081,14 +1131,14 @@ func (m *MockS3API) DeletePublicAccessBlockWithContext(arg0 context.Context, arg return ret0, ret1 } -// DeletePublicAccessBlockWithContext indicates an expected call of DeletePublicAccessBlockWithContext +// DeletePublicAccessBlockWithContext indicates an expected call of DeletePublicAccessBlockWithContext. func (mr *MockS3APIMockRecorder) DeletePublicAccessBlockWithContext(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, "DeletePublicAccessBlockWithContext", reflect.TypeOf((*MockS3API)(nil).DeletePublicAccessBlockWithContext), varargs...) } -// GetBucketAccelerateConfiguration mocks base method +// GetBucketAccelerateConfiguration mocks base method. func (m *MockS3API) GetBucketAccelerateConfiguration(arg0 *s3.GetBucketAccelerateConfigurationInput) (*s3.GetBucketAccelerateConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketAccelerateConfiguration", arg0) @@ -1097,13 +1147,13 @@ func (m *MockS3API) GetBucketAccelerateConfiguration(arg0 *s3.GetBucketAccelerat return ret0, ret1 } -// GetBucketAccelerateConfiguration indicates an expected call of GetBucketAccelerateConfiguration +// GetBucketAccelerateConfiguration indicates an expected call of GetBucketAccelerateConfiguration. func (mr *MockS3APIMockRecorder) GetBucketAccelerateConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketAccelerateConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketAccelerateConfiguration), arg0) } -// GetBucketAccelerateConfigurationRequest mocks base method +// GetBucketAccelerateConfigurationRequest mocks base method. func (m *MockS3API) GetBucketAccelerateConfigurationRequest(arg0 *s3.GetBucketAccelerateConfigurationInput) (*request.Request, *s3.GetBucketAccelerateConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketAccelerateConfigurationRequest", arg0) @@ -1112,13 +1162,13 @@ func (m *MockS3API) GetBucketAccelerateConfigurationRequest(arg0 *s3.GetBucketAc return ret0, ret1 } -// GetBucketAccelerateConfigurationRequest indicates an expected call of GetBucketAccelerateConfigurationRequest +// GetBucketAccelerateConfigurationRequest indicates an expected call of GetBucketAccelerateConfigurationRequest. func (mr *MockS3APIMockRecorder) GetBucketAccelerateConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketAccelerateConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketAccelerateConfigurationRequest), arg0) } -// GetBucketAccelerateConfigurationWithContext mocks base method +// GetBucketAccelerateConfigurationWithContext mocks base method. func (m *MockS3API) GetBucketAccelerateConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketAccelerateConfigurationInput, arg2 ...request.Option) (*s3.GetBucketAccelerateConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1131,14 +1181,14 @@ func (m *MockS3API) GetBucketAccelerateConfigurationWithContext(arg0 context.Con return ret0, ret1 } -// GetBucketAccelerateConfigurationWithContext indicates an expected call of GetBucketAccelerateConfigurationWithContext +// GetBucketAccelerateConfigurationWithContext indicates an expected call of GetBucketAccelerateConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetBucketAccelerateConfigurationWithContext(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, "GetBucketAccelerateConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketAccelerateConfigurationWithContext), varargs...) } -// GetBucketAcl mocks base method +// GetBucketAcl mocks base method. func (m *MockS3API) GetBucketAcl(arg0 *s3.GetBucketAclInput) (*s3.GetBucketAclOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketAcl", arg0) @@ -1147,13 +1197,13 @@ func (m *MockS3API) GetBucketAcl(arg0 *s3.GetBucketAclInput) (*s3.GetBucketAclOu return ret0, ret1 } -// GetBucketAcl indicates an expected call of GetBucketAcl +// GetBucketAcl indicates an expected call of GetBucketAcl. func (mr *MockS3APIMockRecorder) GetBucketAcl(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketAcl", reflect.TypeOf((*MockS3API)(nil).GetBucketAcl), arg0) } -// GetBucketAclRequest mocks base method +// GetBucketAclRequest mocks base method. func (m *MockS3API) GetBucketAclRequest(arg0 *s3.GetBucketAclInput) (*request.Request, *s3.GetBucketAclOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketAclRequest", arg0) @@ -1162,13 +1212,13 @@ func (m *MockS3API) GetBucketAclRequest(arg0 *s3.GetBucketAclInput) (*request.Re return ret0, ret1 } -// GetBucketAclRequest indicates an expected call of GetBucketAclRequest +// GetBucketAclRequest indicates an expected call of GetBucketAclRequest. func (mr *MockS3APIMockRecorder) GetBucketAclRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketAclRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketAclRequest), arg0) } -// GetBucketAclWithContext mocks base method +// GetBucketAclWithContext mocks base method. func (m *MockS3API) GetBucketAclWithContext(arg0 context.Context, arg1 *s3.GetBucketAclInput, arg2 ...request.Option) (*s3.GetBucketAclOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1181,14 +1231,14 @@ func (m *MockS3API) GetBucketAclWithContext(arg0 context.Context, arg1 *s3.GetBu return ret0, ret1 } -// GetBucketAclWithContext indicates an expected call of GetBucketAclWithContext +// GetBucketAclWithContext indicates an expected call of GetBucketAclWithContext. func (mr *MockS3APIMockRecorder) GetBucketAclWithContext(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, "GetBucketAclWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketAclWithContext), varargs...) } -// GetBucketAnalyticsConfiguration mocks base method +// GetBucketAnalyticsConfiguration mocks base method. func (m *MockS3API) GetBucketAnalyticsConfiguration(arg0 *s3.GetBucketAnalyticsConfigurationInput) (*s3.GetBucketAnalyticsConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketAnalyticsConfiguration", arg0) @@ -1197,13 +1247,13 @@ func (m *MockS3API) GetBucketAnalyticsConfiguration(arg0 *s3.GetBucketAnalyticsC return ret0, ret1 } -// GetBucketAnalyticsConfiguration indicates an expected call of GetBucketAnalyticsConfiguration +// GetBucketAnalyticsConfiguration indicates an expected call of GetBucketAnalyticsConfiguration. func (mr *MockS3APIMockRecorder) GetBucketAnalyticsConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketAnalyticsConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketAnalyticsConfiguration), arg0) } -// GetBucketAnalyticsConfigurationRequest mocks base method +// GetBucketAnalyticsConfigurationRequest mocks base method. func (m *MockS3API) GetBucketAnalyticsConfigurationRequest(arg0 *s3.GetBucketAnalyticsConfigurationInput) (*request.Request, *s3.GetBucketAnalyticsConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketAnalyticsConfigurationRequest", arg0) @@ -1212,13 +1262,13 @@ func (m *MockS3API) GetBucketAnalyticsConfigurationRequest(arg0 *s3.GetBucketAna return ret0, ret1 } -// GetBucketAnalyticsConfigurationRequest indicates an expected call of GetBucketAnalyticsConfigurationRequest +// GetBucketAnalyticsConfigurationRequest indicates an expected call of GetBucketAnalyticsConfigurationRequest. func (mr *MockS3APIMockRecorder) GetBucketAnalyticsConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketAnalyticsConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketAnalyticsConfigurationRequest), arg0) } -// GetBucketAnalyticsConfigurationWithContext mocks base method +// GetBucketAnalyticsConfigurationWithContext mocks base method. func (m *MockS3API) GetBucketAnalyticsConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketAnalyticsConfigurationInput, arg2 ...request.Option) (*s3.GetBucketAnalyticsConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1231,14 +1281,14 @@ func (m *MockS3API) GetBucketAnalyticsConfigurationWithContext(arg0 context.Cont return ret0, ret1 } -// GetBucketAnalyticsConfigurationWithContext indicates an expected call of GetBucketAnalyticsConfigurationWithContext +// GetBucketAnalyticsConfigurationWithContext indicates an expected call of GetBucketAnalyticsConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetBucketAnalyticsConfigurationWithContext(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, "GetBucketAnalyticsConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketAnalyticsConfigurationWithContext), varargs...) } -// GetBucketCors mocks base method +// GetBucketCors mocks base method. func (m *MockS3API) GetBucketCors(arg0 *s3.GetBucketCorsInput) (*s3.GetBucketCorsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketCors", arg0) @@ -1247,13 +1297,13 @@ func (m *MockS3API) GetBucketCors(arg0 *s3.GetBucketCorsInput) (*s3.GetBucketCor return ret0, ret1 } -// GetBucketCors indicates an expected call of GetBucketCors +// GetBucketCors indicates an expected call of GetBucketCors. func (mr *MockS3APIMockRecorder) GetBucketCors(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketCors", reflect.TypeOf((*MockS3API)(nil).GetBucketCors), arg0) } -// GetBucketCorsRequest mocks base method +// GetBucketCorsRequest mocks base method. func (m *MockS3API) GetBucketCorsRequest(arg0 *s3.GetBucketCorsInput) (*request.Request, *s3.GetBucketCorsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketCorsRequest", arg0) @@ -1262,13 +1312,13 @@ func (m *MockS3API) GetBucketCorsRequest(arg0 *s3.GetBucketCorsInput) (*request. return ret0, ret1 } -// GetBucketCorsRequest indicates an expected call of GetBucketCorsRequest +// GetBucketCorsRequest indicates an expected call of GetBucketCorsRequest. func (mr *MockS3APIMockRecorder) GetBucketCorsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketCorsRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketCorsRequest), arg0) } -// GetBucketCorsWithContext mocks base method +// GetBucketCorsWithContext mocks base method. func (m *MockS3API) GetBucketCorsWithContext(arg0 context.Context, arg1 *s3.GetBucketCorsInput, arg2 ...request.Option) (*s3.GetBucketCorsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1281,14 +1331,14 @@ func (m *MockS3API) GetBucketCorsWithContext(arg0 context.Context, arg1 *s3.GetB return ret0, ret1 } -// GetBucketCorsWithContext indicates an expected call of GetBucketCorsWithContext +// GetBucketCorsWithContext indicates an expected call of GetBucketCorsWithContext. func (mr *MockS3APIMockRecorder) GetBucketCorsWithContext(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, "GetBucketCorsWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketCorsWithContext), varargs...) } -// GetBucketEncryption mocks base method +// GetBucketEncryption mocks base method. func (m *MockS3API) GetBucketEncryption(arg0 *s3.GetBucketEncryptionInput) (*s3.GetBucketEncryptionOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketEncryption", arg0) @@ -1297,13 +1347,13 @@ func (m *MockS3API) GetBucketEncryption(arg0 *s3.GetBucketEncryptionInput) (*s3. return ret0, ret1 } -// GetBucketEncryption indicates an expected call of GetBucketEncryption +// GetBucketEncryption indicates an expected call of GetBucketEncryption. func (mr *MockS3APIMockRecorder) GetBucketEncryption(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketEncryption", reflect.TypeOf((*MockS3API)(nil).GetBucketEncryption), arg0) } -// GetBucketEncryptionRequest mocks base method +// GetBucketEncryptionRequest mocks base method. func (m *MockS3API) GetBucketEncryptionRequest(arg0 *s3.GetBucketEncryptionInput) (*request.Request, *s3.GetBucketEncryptionOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketEncryptionRequest", arg0) @@ -1312,13 +1362,13 @@ func (m *MockS3API) GetBucketEncryptionRequest(arg0 *s3.GetBucketEncryptionInput return ret0, ret1 } -// GetBucketEncryptionRequest indicates an expected call of GetBucketEncryptionRequest +// GetBucketEncryptionRequest indicates an expected call of GetBucketEncryptionRequest. func (mr *MockS3APIMockRecorder) GetBucketEncryptionRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketEncryptionRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketEncryptionRequest), arg0) } -// GetBucketEncryptionWithContext mocks base method +// GetBucketEncryptionWithContext mocks base method. func (m *MockS3API) GetBucketEncryptionWithContext(arg0 context.Context, arg1 *s3.GetBucketEncryptionInput, arg2 ...request.Option) (*s3.GetBucketEncryptionOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1331,14 +1381,64 @@ func (m *MockS3API) GetBucketEncryptionWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// GetBucketEncryptionWithContext indicates an expected call of GetBucketEncryptionWithContext +// GetBucketEncryptionWithContext indicates an expected call of GetBucketEncryptionWithContext. func (mr *MockS3APIMockRecorder) GetBucketEncryptionWithContext(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, "GetBucketEncryptionWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketEncryptionWithContext), varargs...) } -// GetBucketInventoryConfiguration mocks base method +// GetBucketIntelligentTieringConfiguration mocks base method. +func (m *MockS3API) GetBucketIntelligentTieringConfiguration(arg0 *s3.GetBucketIntelligentTieringConfigurationInput) (*s3.GetBucketIntelligentTieringConfigurationOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBucketIntelligentTieringConfiguration", arg0) + ret0, _ := ret[0].(*s3.GetBucketIntelligentTieringConfigurationOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBucketIntelligentTieringConfiguration indicates an expected call of GetBucketIntelligentTieringConfiguration. +func (mr *MockS3APIMockRecorder) GetBucketIntelligentTieringConfiguration(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketIntelligentTieringConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketIntelligentTieringConfiguration), arg0) +} + +// GetBucketIntelligentTieringConfigurationRequest mocks base method. +func (m *MockS3API) GetBucketIntelligentTieringConfigurationRequest(arg0 *s3.GetBucketIntelligentTieringConfigurationInput) (*request.Request, *s3.GetBucketIntelligentTieringConfigurationOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBucketIntelligentTieringConfigurationRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*s3.GetBucketIntelligentTieringConfigurationOutput) + return ret0, ret1 +} + +// GetBucketIntelligentTieringConfigurationRequest indicates an expected call of GetBucketIntelligentTieringConfigurationRequest. +func (mr *MockS3APIMockRecorder) GetBucketIntelligentTieringConfigurationRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketIntelligentTieringConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketIntelligentTieringConfigurationRequest), arg0) +} + +// GetBucketIntelligentTieringConfigurationWithContext mocks base method. +func (m *MockS3API) GetBucketIntelligentTieringConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketIntelligentTieringConfigurationInput, arg2 ...request.Option) (*s3.GetBucketIntelligentTieringConfigurationOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetBucketIntelligentTieringConfigurationWithContext", varargs...) + ret0, _ := ret[0].(*s3.GetBucketIntelligentTieringConfigurationOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBucketIntelligentTieringConfigurationWithContext indicates an expected call of GetBucketIntelligentTieringConfigurationWithContext. +func (mr *MockS3APIMockRecorder) GetBucketIntelligentTieringConfigurationWithContext(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, "GetBucketIntelligentTieringConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketIntelligentTieringConfigurationWithContext), varargs...) +} + +// GetBucketInventoryConfiguration mocks base method. func (m *MockS3API) GetBucketInventoryConfiguration(arg0 *s3.GetBucketInventoryConfigurationInput) (*s3.GetBucketInventoryConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketInventoryConfiguration", arg0) @@ -1347,13 +1447,13 @@ func (m *MockS3API) GetBucketInventoryConfiguration(arg0 *s3.GetBucketInventoryC return ret0, ret1 } -// GetBucketInventoryConfiguration indicates an expected call of GetBucketInventoryConfiguration +// GetBucketInventoryConfiguration indicates an expected call of GetBucketInventoryConfiguration. func (mr *MockS3APIMockRecorder) GetBucketInventoryConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketInventoryConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketInventoryConfiguration), arg0) } -// GetBucketInventoryConfigurationRequest mocks base method +// GetBucketInventoryConfigurationRequest mocks base method. func (m *MockS3API) GetBucketInventoryConfigurationRequest(arg0 *s3.GetBucketInventoryConfigurationInput) (*request.Request, *s3.GetBucketInventoryConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketInventoryConfigurationRequest", arg0) @@ -1362,13 +1462,13 @@ func (m *MockS3API) GetBucketInventoryConfigurationRequest(arg0 *s3.GetBucketInv return ret0, ret1 } -// GetBucketInventoryConfigurationRequest indicates an expected call of GetBucketInventoryConfigurationRequest +// GetBucketInventoryConfigurationRequest indicates an expected call of GetBucketInventoryConfigurationRequest. func (mr *MockS3APIMockRecorder) GetBucketInventoryConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketInventoryConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketInventoryConfigurationRequest), arg0) } -// GetBucketInventoryConfigurationWithContext mocks base method +// GetBucketInventoryConfigurationWithContext mocks base method. func (m *MockS3API) GetBucketInventoryConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketInventoryConfigurationInput, arg2 ...request.Option) (*s3.GetBucketInventoryConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1381,14 +1481,14 @@ func (m *MockS3API) GetBucketInventoryConfigurationWithContext(arg0 context.Cont return ret0, ret1 } -// GetBucketInventoryConfigurationWithContext indicates an expected call of GetBucketInventoryConfigurationWithContext +// GetBucketInventoryConfigurationWithContext indicates an expected call of GetBucketInventoryConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetBucketInventoryConfigurationWithContext(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, "GetBucketInventoryConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketInventoryConfigurationWithContext), varargs...) } -// GetBucketLifecycle mocks base method +// GetBucketLifecycle mocks base method. func (m *MockS3API) GetBucketLifecycle(arg0 *s3.GetBucketLifecycleInput) (*s3.GetBucketLifecycleOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLifecycle", arg0) @@ -1397,13 +1497,13 @@ func (m *MockS3API) GetBucketLifecycle(arg0 *s3.GetBucketLifecycleInput) (*s3.Ge return ret0, ret1 } -// GetBucketLifecycle indicates an expected call of GetBucketLifecycle +// GetBucketLifecycle indicates an expected call of GetBucketLifecycle. func (mr *MockS3APIMockRecorder) GetBucketLifecycle(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLifecycle", reflect.TypeOf((*MockS3API)(nil).GetBucketLifecycle), arg0) } -// GetBucketLifecycleConfiguration mocks base method +// GetBucketLifecycleConfiguration mocks base method. func (m *MockS3API) GetBucketLifecycleConfiguration(arg0 *s3.GetBucketLifecycleConfigurationInput) (*s3.GetBucketLifecycleConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLifecycleConfiguration", arg0) @@ -1412,13 +1512,13 @@ func (m *MockS3API) GetBucketLifecycleConfiguration(arg0 *s3.GetBucketLifecycleC return ret0, ret1 } -// GetBucketLifecycleConfiguration indicates an expected call of GetBucketLifecycleConfiguration +// GetBucketLifecycleConfiguration indicates an expected call of GetBucketLifecycleConfiguration. func (mr *MockS3APIMockRecorder) GetBucketLifecycleConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLifecycleConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketLifecycleConfiguration), arg0) } -// GetBucketLifecycleConfigurationRequest mocks base method +// GetBucketLifecycleConfigurationRequest mocks base method. func (m *MockS3API) GetBucketLifecycleConfigurationRequest(arg0 *s3.GetBucketLifecycleConfigurationInput) (*request.Request, *s3.GetBucketLifecycleConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLifecycleConfigurationRequest", arg0) @@ -1427,13 +1527,13 @@ func (m *MockS3API) GetBucketLifecycleConfigurationRequest(arg0 *s3.GetBucketLif return ret0, ret1 } -// GetBucketLifecycleConfigurationRequest indicates an expected call of GetBucketLifecycleConfigurationRequest +// GetBucketLifecycleConfigurationRequest indicates an expected call of GetBucketLifecycleConfigurationRequest. func (mr *MockS3APIMockRecorder) GetBucketLifecycleConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLifecycleConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketLifecycleConfigurationRequest), arg0) } -// GetBucketLifecycleConfigurationWithContext mocks base method +// GetBucketLifecycleConfigurationWithContext mocks base method. func (m *MockS3API) GetBucketLifecycleConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketLifecycleConfigurationInput, arg2 ...request.Option) (*s3.GetBucketLifecycleConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1446,14 +1546,14 @@ func (m *MockS3API) GetBucketLifecycleConfigurationWithContext(arg0 context.Cont return ret0, ret1 } -// GetBucketLifecycleConfigurationWithContext indicates an expected call of GetBucketLifecycleConfigurationWithContext +// GetBucketLifecycleConfigurationWithContext indicates an expected call of GetBucketLifecycleConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetBucketLifecycleConfigurationWithContext(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, "GetBucketLifecycleConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketLifecycleConfigurationWithContext), varargs...) } -// GetBucketLifecycleRequest mocks base method +// GetBucketLifecycleRequest mocks base method. func (m *MockS3API) GetBucketLifecycleRequest(arg0 *s3.GetBucketLifecycleInput) (*request.Request, *s3.GetBucketLifecycleOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLifecycleRequest", arg0) @@ -1462,13 +1562,13 @@ func (m *MockS3API) GetBucketLifecycleRequest(arg0 *s3.GetBucketLifecycleInput) return ret0, ret1 } -// GetBucketLifecycleRequest indicates an expected call of GetBucketLifecycleRequest +// GetBucketLifecycleRequest indicates an expected call of GetBucketLifecycleRequest. func (mr *MockS3APIMockRecorder) GetBucketLifecycleRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLifecycleRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketLifecycleRequest), arg0) } -// GetBucketLifecycleWithContext mocks base method +// GetBucketLifecycleWithContext mocks base method. func (m *MockS3API) GetBucketLifecycleWithContext(arg0 context.Context, arg1 *s3.GetBucketLifecycleInput, arg2 ...request.Option) (*s3.GetBucketLifecycleOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1481,14 +1581,14 @@ func (m *MockS3API) GetBucketLifecycleWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// GetBucketLifecycleWithContext indicates an expected call of GetBucketLifecycleWithContext +// GetBucketLifecycleWithContext indicates an expected call of GetBucketLifecycleWithContext. func (mr *MockS3APIMockRecorder) GetBucketLifecycleWithContext(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, "GetBucketLifecycleWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketLifecycleWithContext), varargs...) } -// GetBucketLocation mocks base method +// GetBucketLocation mocks base method. func (m *MockS3API) GetBucketLocation(arg0 *s3.GetBucketLocationInput) (*s3.GetBucketLocationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLocation", arg0) @@ -1497,13 +1597,13 @@ func (m *MockS3API) GetBucketLocation(arg0 *s3.GetBucketLocationInput) (*s3.GetB return ret0, ret1 } -// GetBucketLocation indicates an expected call of GetBucketLocation +// GetBucketLocation indicates an expected call of GetBucketLocation. func (mr *MockS3APIMockRecorder) GetBucketLocation(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLocation", reflect.TypeOf((*MockS3API)(nil).GetBucketLocation), arg0) } -// GetBucketLocationRequest mocks base method +// GetBucketLocationRequest mocks base method. func (m *MockS3API) GetBucketLocationRequest(arg0 *s3.GetBucketLocationInput) (*request.Request, *s3.GetBucketLocationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLocationRequest", arg0) @@ -1512,13 +1612,13 @@ func (m *MockS3API) GetBucketLocationRequest(arg0 *s3.GetBucketLocationInput) (* return ret0, ret1 } -// GetBucketLocationRequest indicates an expected call of GetBucketLocationRequest +// GetBucketLocationRequest indicates an expected call of GetBucketLocationRequest. func (mr *MockS3APIMockRecorder) GetBucketLocationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLocationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketLocationRequest), arg0) } -// GetBucketLocationWithContext mocks base method +// GetBucketLocationWithContext mocks base method. func (m *MockS3API) GetBucketLocationWithContext(arg0 context.Context, arg1 *s3.GetBucketLocationInput, arg2 ...request.Option) (*s3.GetBucketLocationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1531,14 +1631,14 @@ func (m *MockS3API) GetBucketLocationWithContext(arg0 context.Context, arg1 *s3. return ret0, ret1 } -// GetBucketLocationWithContext indicates an expected call of GetBucketLocationWithContext +// GetBucketLocationWithContext indicates an expected call of GetBucketLocationWithContext. func (mr *MockS3APIMockRecorder) GetBucketLocationWithContext(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, "GetBucketLocationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketLocationWithContext), varargs...) } -// GetBucketLogging mocks base method +// GetBucketLogging mocks base method. func (m *MockS3API) GetBucketLogging(arg0 *s3.GetBucketLoggingInput) (*s3.GetBucketLoggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLogging", arg0) @@ -1547,13 +1647,13 @@ func (m *MockS3API) GetBucketLogging(arg0 *s3.GetBucketLoggingInput) (*s3.GetBuc return ret0, ret1 } -// GetBucketLogging indicates an expected call of GetBucketLogging +// GetBucketLogging indicates an expected call of GetBucketLogging. func (mr *MockS3APIMockRecorder) GetBucketLogging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLogging", reflect.TypeOf((*MockS3API)(nil).GetBucketLogging), arg0) } -// GetBucketLoggingRequest mocks base method +// GetBucketLoggingRequest mocks base method. func (m *MockS3API) GetBucketLoggingRequest(arg0 *s3.GetBucketLoggingInput) (*request.Request, *s3.GetBucketLoggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketLoggingRequest", arg0) @@ -1562,13 +1662,13 @@ func (m *MockS3API) GetBucketLoggingRequest(arg0 *s3.GetBucketLoggingInput) (*re return ret0, ret1 } -// GetBucketLoggingRequest indicates an expected call of GetBucketLoggingRequest +// GetBucketLoggingRequest indicates an expected call of GetBucketLoggingRequest. func (mr *MockS3APIMockRecorder) GetBucketLoggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketLoggingRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketLoggingRequest), arg0) } -// GetBucketLoggingWithContext mocks base method +// GetBucketLoggingWithContext mocks base method. func (m *MockS3API) GetBucketLoggingWithContext(arg0 context.Context, arg1 *s3.GetBucketLoggingInput, arg2 ...request.Option) (*s3.GetBucketLoggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1581,14 +1681,14 @@ func (m *MockS3API) GetBucketLoggingWithContext(arg0 context.Context, arg1 *s3.G return ret0, ret1 } -// GetBucketLoggingWithContext indicates an expected call of GetBucketLoggingWithContext +// GetBucketLoggingWithContext indicates an expected call of GetBucketLoggingWithContext. func (mr *MockS3APIMockRecorder) GetBucketLoggingWithContext(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, "GetBucketLoggingWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketLoggingWithContext), varargs...) } -// GetBucketMetricsConfiguration mocks base method +// GetBucketMetricsConfiguration mocks base method. func (m *MockS3API) GetBucketMetricsConfiguration(arg0 *s3.GetBucketMetricsConfigurationInput) (*s3.GetBucketMetricsConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketMetricsConfiguration", arg0) @@ -1597,13 +1697,13 @@ func (m *MockS3API) GetBucketMetricsConfiguration(arg0 *s3.GetBucketMetricsConfi return ret0, ret1 } -// GetBucketMetricsConfiguration indicates an expected call of GetBucketMetricsConfiguration +// GetBucketMetricsConfiguration indicates an expected call of GetBucketMetricsConfiguration. func (mr *MockS3APIMockRecorder) GetBucketMetricsConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketMetricsConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketMetricsConfiguration), arg0) } -// GetBucketMetricsConfigurationRequest mocks base method +// GetBucketMetricsConfigurationRequest mocks base method. func (m *MockS3API) GetBucketMetricsConfigurationRequest(arg0 *s3.GetBucketMetricsConfigurationInput) (*request.Request, *s3.GetBucketMetricsConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketMetricsConfigurationRequest", arg0) @@ -1612,13 +1712,13 @@ func (m *MockS3API) GetBucketMetricsConfigurationRequest(arg0 *s3.GetBucketMetri return ret0, ret1 } -// GetBucketMetricsConfigurationRequest indicates an expected call of GetBucketMetricsConfigurationRequest +// GetBucketMetricsConfigurationRequest indicates an expected call of GetBucketMetricsConfigurationRequest. func (mr *MockS3APIMockRecorder) GetBucketMetricsConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketMetricsConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketMetricsConfigurationRequest), arg0) } -// GetBucketMetricsConfigurationWithContext mocks base method +// GetBucketMetricsConfigurationWithContext mocks base method. func (m *MockS3API) GetBucketMetricsConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketMetricsConfigurationInput, arg2 ...request.Option) (*s3.GetBucketMetricsConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1631,14 +1731,14 @@ func (m *MockS3API) GetBucketMetricsConfigurationWithContext(arg0 context.Contex return ret0, ret1 } -// GetBucketMetricsConfigurationWithContext indicates an expected call of GetBucketMetricsConfigurationWithContext +// GetBucketMetricsConfigurationWithContext indicates an expected call of GetBucketMetricsConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetBucketMetricsConfigurationWithContext(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, "GetBucketMetricsConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketMetricsConfigurationWithContext), varargs...) } -// GetBucketNotification mocks base method +// GetBucketNotification mocks base method. func (m *MockS3API) GetBucketNotification(arg0 *s3.GetBucketNotificationConfigurationRequest) (*s3.NotificationConfigurationDeprecated, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketNotification", arg0) @@ -1647,13 +1747,13 @@ func (m *MockS3API) GetBucketNotification(arg0 *s3.GetBucketNotificationConfigur return ret0, ret1 } -// GetBucketNotification indicates an expected call of GetBucketNotification +// GetBucketNotification indicates an expected call of GetBucketNotification. func (mr *MockS3APIMockRecorder) GetBucketNotification(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketNotification", reflect.TypeOf((*MockS3API)(nil).GetBucketNotification), arg0) } -// GetBucketNotificationConfiguration mocks base method +// GetBucketNotificationConfiguration mocks base method. func (m *MockS3API) GetBucketNotificationConfiguration(arg0 *s3.GetBucketNotificationConfigurationRequest) (*s3.NotificationConfiguration, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketNotificationConfiguration", arg0) @@ -1662,13 +1762,13 @@ func (m *MockS3API) GetBucketNotificationConfiguration(arg0 *s3.GetBucketNotific return ret0, ret1 } -// GetBucketNotificationConfiguration indicates an expected call of GetBucketNotificationConfiguration +// GetBucketNotificationConfiguration indicates an expected call of GetBucketNotificationConfiguration. func (mr *MockS3APIMockRecorder) GetBucketNotificationConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketNotificationConfiguration", reflect.TypeOf((*MockS3API)(nil).GetBucketNotificationConfiguration), arg0) } -// GetBucketNotificationConfigurationRequest mocks base method +// GetBucketNotificationConfigurationRequest mocks base method. func (m *MockS3API) GetBucketNotificationConfigurationRequest(arg0 *s3.GetBucketNotificationConfigurationRequest) (*request.Request, *s3.NotificationConfiguration) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketNotificationConfigurationRequest", arg0) @@ -1677,13 +1777,13 @@ func (m *MockS3API) GetBucketNotificationConfigurationRequest(arg0 *s3.GetBucket return ret0, ret1 } -// GetBucketNotificationConfigurationRequest indicates an expected call of GetBucketNotificationConfigurationRequest +// GetBucketNotificationConfigurationRequest indicates an expected call of GetBucketNotificationConfigurationRequest. func (mr *MockS3APIMockRecorder) GetBucketNotificationConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketNotificationConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketNotificationConfigurationRequest), arg0) } -// GetBucketNotificationConfigurationWithContext mocks base method +// GetBucketNotificationConfigurationWithContext mocks base method. func (m *MockS3API) GetBucketNotificationConfigurationWithContext(arg0 context.Context, arg1 *s3.GetBucketNotificationConfigurationRequest, arg2 ...request.Option) (*s3.NotificationConfiguration, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1696,14 +1796,14 @@ func (m *MockS3API) GetBucketNotificationConfigurationWithContext(arg0 context.C return ret0, ret1 } -// GetBucketNotificationConfigurationWithContext indicates an expected call of GetBucketNotificationConfigurationWithContext +// GetBucketNotificationConfigurationWithContext indicates an expected call of GetBucketNotificationConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetBucketNotificationConfigurationWithContext(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, "GetBucketNotificationConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketNotificationConfigurationWithContext), varargs...) } -// GetBucketNotificationRequest mocks base method +// GetBucketNotificationRequest mocks base method. func (m *MockS3API) GetBucketNotificationRequest(arg0 *s3.GetBucketNotificationConfigurationRequest) (*request.Request, *s3.NotificationConfigurationDeprecated) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketNotificationRequest", arg0) @@ -1712,13 +1812,13 @@ func (m *MockS3API) GetBucketNotificationRequest(arg0 *s3.GetBucketNotificationC return ret0, ret1 } -// GetBucketNotificationRequest indicates an expected call of GetBucketNotificationRequest +// GetBucketNotificationRequest indicates an expected call of GetBucketNotificationRequest. func (mr *MockS3APIMockRecorder) GetBucketNotificationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketNotificationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketNotificationRequest), arg0) } -// GetBucketNotificationWithContext mocks base method +// GetBucketNotificationWithContext mocks base method. func (m *MockS3API) GetBucketNotificationWithContext(arg0 context.Context, arg1 *s3.GetBucketNotificationConfigurationRequest, arg2 ...request.Option) (*s3.NotificationConfigurationDeprecated, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1731,14 +1831,14 @@ func (m *MockS3API) GetBucketNotificationWithContext(arg0 context.Context, arg1 return ret0, ret1 } -// GetBucketNotificationWithContext indicates an expected call of GetBucketNotificationWithContext +// GetBucketNotificationWithContext indicates an expected call of GetBucketNotificationWithContext. func (mr *MockS3APIMockRecorder) GetBucketNotificationWithContext(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, "GetBucketNotificationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketNotificationWithContext), varargs...) } -// GetBucketOwnershipControls mocks base method +// GetBucketOwnershipControls mocks base method. func (m *MockS3API) GetBucketOwnershipControls(arg0 *s3.GetBucketOwnershipControlsInput) (*s3.GetBucketOwnershipControlsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketOwnershipControls", arg0) @@ -1747,13 +1847,13 @@ func (m *MockS3API) GetBucketOwnershipControls(arg0 *s3.GetBucketOwnershipContro return ret0, ret1 } -// GetBucketOwnershipControls indicates an expected call of GetBucketOwnershipControls +// GetBucketOwnershipControls indicates an expected call of GetBucketOwnershipControls. func (mr *MockS3APIMockRecorder) GetBucketOwnershipControls(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketOwnershipControls", reflect.TypeOf((*MockS3API)(nil).GetBucketOwnershipControls), arg0) } -// GetBucketOwnershipControlsRequest mocks base method +// GetBucketOwnershipControlsRequest mocks base method. func (m *MockS3API) GetBucketOwnershipControlsRequest(arg0 *s3.GetBucketOwnershipControlsInput) (*request.Request, *s3.GetBucketOwnershipControlsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketOwnershipControlsRequest", arg0) @@ -1762,13 +1862,13 @@ func (m *MockS3API) GetBucketOwnershipControlsRequest(arg0 *s3.GetBucketOwnershi return ret0, ret1 } -// GetBucketOwnershipControlsRequest indicates an expected call of GetBucketOwnershipControlsRequest +// GetBucketOwnershipControlsRequest indicates an expected call of GetBucketOwnershipControlsRequest. func (mr *MockS3APIMockRecorder) GetBucketOwnershipControlsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketOwnershipControlsRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketOwnershipControlsRequest), arg0) } -// GetBucketOwnershipControlsWithContext mocks base method +// GetBucketOwnershipControlsWithContext mocks base method. func (m *MockS3API) GetBucketOwnershipControlsWithContext(arg0 context.Context, arg1 *s3.GetBucketOwnershipControlsInput, arg2 ...request.Option) (*s3.GetBucketOwnershipControlsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1781,14 +1881,14 @@ func (m *MockS3API) GetBucketOwnershipControlsWithContext(arg0 context.Context, return ret0, ret1 } -// GetBucketOwnershipControlsWithContext indicates an expected call of GetBucketOwnershipControlsWithContext +// GetBucketOwnershipControlsWithContext indicates an expected call of GetBucketOwnershipControlsWithContext. func (mr *MockS3APIMockRecorder) GetBucketOwnershipControlsWithContext(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, "GetBucketOwnershipControlsWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketOwnershipControlsWithContext), varargs...) } -// GetBucketPolicy mocks base method +// GetBucketPolicy mocks base method. func (m *MockS3API) GetBucketPolicy(arg0 *s3.GetBucketPolicyInput) (*s3.GetBucketPolicyOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketPolicy", arg0) @@ -1797,13 +1897,13 @@ func (m *MockS3API) GetBucketPolicy(arg0 *s3.GetBucketPolicyInput) (*s3.GetBucke return ret0, ret1 } -// GetBucketPolicy indicates an expected call of GetBucketPolicy +// GetBucketPolicy indicates an expected call of GetBucketPolicy. func (mr *MockS3APIMockRecorder) GetBucketPolicy(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketPolicy", reflect.TypeOf((*MockS3API)(nil).GetBucketPolicy), arg0) } -// GetBucketPolicyRequest mocks base method +// GetBucketPolicyRequest mocks base method. func (m *MockS3API) GetBucketPolicyRequest(arg0 *s3.GetBucketPolicyInput) (*request.Request, *s3.GetBucketPolicyOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketPolicyRequest", arg0) @@ -1812,13 +1912,13 @@ func (m *MockS3API) GetBucketPolicyRequest(arg0 *s3.GetBucketPolicyInput) (*requ return ret0, ret1 } -// GetBucketPolicyRequest indicates an expected call of GetBucketPolicyRequest +// GetBucketPolicyRequest indicates an expected call of GetBucketPolicyRequest. func (mr *MockS3APIMockRecorder) GetBucketPolicyRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketPolicyRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketPolicyRequest), arg0) } -// GetBucketPolicyStatus mocks base method +// GetBucketPolicyStatus mocks base method. func (m *MockS3API) GetBucketPolicyStatus(arg0 *s3.GetBucketPolicyStatusInput) (*s3.GetBucketPolicyStatusOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketPolicyStatus", arg0) @@ -1827,13 +1927,13 @@ func (m *MockS3API) GetBucketPolicyStatus(arg0 *s3.GetBucketPolicyStatusInput) ( return ret0, ret1 } -// GetBucketPolicyStatus indicates an expected call of GetBucketPolicyStatus +// GetBucketPolicyStatus indicates an expected call of GetBucketPolicyStatus. func (mr *MockS3APIMockRecorder) GetBucketPolicyStatus(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketPolicyStatus", reflect.TypeOf((*MockS3API)(nil).GetBucketPolicyStatus), arg0) } -// GetBucketPolicyStatusRequest mocks base method +// GetBucketPolicyStatusRequest mocks base method. func (m *MockS3API) GetBucketPolicyStatusRequest(arg0 *s3.GetBucketPolicyStatusInput) (*request.Request, *s3.GetBucketPolicyStatusOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketPolicyStatusRequest", arg0) @@ -1842,13 +1942,13 @@ func (m *MockS3API) GetBucketPolicyStatusRequest(arg0 *s3.GetBucketPolicyStatusI return ret0, ret1 } -// GetBucketPolicyStatusRequest indicates an expected call of GetBucketPolicyStatusRequest +// GetBucketPolicyStatusRequest indicates an expected call of GetBucketPolicyStatusRequest. func (mr *MockS3APIMockRecorder) GetBucketPolicyStatusRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketPolicyStatusRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketPolicyStatusRequest), arg0) } -// GetBucketPolicyStatusWithContext mocks base method +// GetBucketPolicyStatusWithContext mocks base method. func (m *MockS3API) GetBucketPolicyStatusWithContext(arg0 context.Context, arg1 *s3.GetBucketPolicyStatusInput, arg2 ...request.Option) (*s3.GetBucketPolicyStatusOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1861,14 +1961,14 @@ func (m *MockS3API) GetBucketPolicyStatusWithContext(arg0 context.Context, arg1 return ret0, ret1 } -// GetBucketPolicyStatusWithContext indicates an expected call of GetBucketPolicyStatusWithContext +// GetBucketPolicyStatusWithContext indicates an expected call of GetBucketPolicyStatusWithContext. func (mr *MockS3APIMockRecorder) GetBucketPolicyStatusWithContext(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, "GetBucketPolicyStatusWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketPolicyStatusWithContext), varargs...) } -// GetBucketPolicyWithContext mocks base method +// GetBucketPolicyWithContext mocks base method. func (m *MockS3API) GetBucketPolicyWithContext(arg0 context.Context, arg1 *s3.GetBucketPolicyInput, arg2 ...request.Option) (*s3.GetBucketPolicyOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1881,14 +1981,14 @@ func (m *MockS3API) GetBucketPolicyWithContext(arg0 context.Context, arg1 *s3.Ge return ret0, ret1 } -// GetBucketPolicyWithContext indicates an expected call of GetBucketPolicyWithContext +// GetBucketPolicyWithContext indicates an expected call of GetBucketPolicyWithContext. func (mr *MockS3APIMockRecorder) GetBucketPolicyWithContext(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, "GetBucketPolicyWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketPolicyWithContext), varargs...) } -// GetBucketReplication mocks base method +// GetBucketReplication mocks base method. func (m *MockS3API) GetBucketReplication(arg0 *s3.GetBucketReplicationInput) (*s3.GetBucketReplicationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketReplication", arg0) @@ -1897,13 +1997,13 @@ func (m *MockS3API) GetBucketReplication(arg0 *s3.GetBucketReplicationInput) (*s return ret0, ret1 } -// GetBucketReplication indicates an expected call of GetBucketReplication +// GetBucketReplication indicates an expected call of GetBucketReplication. func (mr *MockS3APIMockRecorder) GetBucketReplication(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketReplication", reflect.TypeOf((*MockS3API)(nil).GetBucketReplication), arg0) } -// GetBucketReplicationRequest mocks base method +// GetBucketReplicationRequest mocks base method. func (m *MockS3API) GetBucketReplicationRequest(arg0 *s3.GetBucketReplicationInput) (*request.Request, *s3.GetBucketReplicationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketReplicationRequest", arg0) @@ -1912,13 +2012,13 @@ func (m *MockS3API) GetBucketReplicationRequest(arg0 *s3.GetBucketReplicationInp return ret0, ret1 } -// GetBucketReplicationRequest indicates an expected call of GetBucketReplicationRequest +// GetBucketReplicationRequest indicates an expected call of GetBucketReplicationRequest. func (mr *MockS3APIMockRecorder) GetBucketReplicationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketReplicationRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketReplicationRequest), arg0) } -// GetBucketReplicationWithContext mocks base method +// GetBucketReplicationWithContext mocks base method. func (m *MockS3API) GetBucketReplicationWithContext(arg0 context.Context, arg1 *s3.GetBucketReplicationInput, arg2 ...request.Option) (*s3.GetBucketReplicationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1931,14 +2031,14 @@ func (m *MockS3API) GetBucketReplicationWithContext(arg0 context.Context, arg1 * return ret0, ret1 } -// GetBucketReplicationWithContext indicates an expected call of GetBucketReplicationWithContext +// GetBucketReplicationWithContext indicates an expected call of GetBucketReplicationWithContext. func (mr *MockS3APIMockRecorder) GetBucketReplicationWithContext(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, "GetBucketReplicationWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketReplicationWithContext), varargs...) } -// GetBucketRequestPayment mocks base method +// GetBucketRequestPayment mocks base method. func (m *MockS3API) GetBucketRequestPayment(arg0 *s3.GetBucketRequestPaymentInput) (*s3.GetBucketRequestPaymentOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketRequestPayment", arg0) @@ -1947,13 +2047,13 @@ func (m *MockS3API) GetBucketRequestPayment(arg0 *s3.GetBucketRequestPaymentInpu return ret0, ret1 } -// GetBucketRequestPayment indicates an expected call of GetBucketRequestPayment +// GetBucketRequestPayment indicates an expected call of GetBucketRequestPayment. func (mr *MockS3APIMockRecorder) GetBucketRequestPayment(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketRequestPayment", reflect.TypeOf((*MockS3API)(nil).GetBucketRequestPayment), arg0) } -// GetBucketRequestPaymentRequest mocks base method +// GetBucketRequestPaymentRequest mocks base method. func (m *MockS3API) GetBucketRequestPaymentRequest(arg0 *s3.GetBucketRequestPaymentInput) (*request.Request, *s3.GetBucketRequestPaymentOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketRequestPaymentRequest", arg0) @@ -1962,13 +2062,13 @@ func (m *MockS3API) GetBucketRequestPaymentRequest(arg0 *s3.GetBucketRequestPaym return ret0, ret1 } -// GetBucketRequestPaymentRequest indicates an expected call of GetBucketRequestPaymentRequest +// GetBucketRequestPaymentRequest indicates an expected call of GetBucketRequestPaymentRequest. func (mr *MockS3APIMockRecorder) GetBucketRequestPaymentRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketRequestPaymentRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketRequestPaymentRequest), arg0) } -// GetBucketRequestPaymentWithContext mocks base method +// GetBucketRequestPaymentWithContext mocks base method. func (m *MockS3API) GetBucketRequestPaymentWithContext(arg0 context.Context, arg1 *s3.GetBucketRequestPaymentInput, arg2 ...request.Option) (*s3.GetBucketRequestPaymentOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -1981,14 +2081,14 @@ func (m *MockS3API) GetBucketRequestPaymentWithContext(arg0 context.Context, arg return ret0, ret1 } -// GetBucketRequestPaymentWithContext indicates an expected call of GetBucketRequestPaymentWithContext +// GetBucketRequestPaymentWithContext indicates an expected call of GetBucketRequestPaymentWithContext. func (mr *MockS3APIMockRecorder) GetBucketRequestPaymentWithContext(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, "GetBucketRequestPaymentWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketRequestPaymentWithContext), varargs...) } -// GetBucketTagging mocks base method +// GetBucketTagging mocks base method. func (m *MockS3API) GetBucketTagging(arg0 *s3.GetBucketTaggingInput) (*s3.GetBucketTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketTagging", arg0) @@ -1997,13 +2097,13 @@ func (m *MockS3API) GetBucketTagging(arg0 *s3.GetBucketTaggingInput) (*s3.GetBuc return ret0, ret1 } -// GetBucketTagging indicates an expected call of GetBucketTagging +// GetBucketTagging indicates an expected call of GetBucketTagging. func (mr *MockS3APIMockRecorder) GetBucketTagging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketTagging", reflect.TypeOf((*MockS3API)(nil).GetBucketTagging), arg0) } -// GetBucketTaggingRequest mocks base method +// GetBucketTaggingRequest mocks base method. func (m *MockS3API) GetBucketTaggingRequest(arg0 *s3.GetBucketTaggingInput) (*request.Request, *s3.GetBucketTaggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketTaggingRequest", arg0) @@ -2012,13 +2112,13 @@ func (m *MockS3API) GetBucketTaggingRequest(arg0 *s3.GetBucketTaggingInput) (*re return ret0, ret1 } -// GetBucketTaggingRequest indicates an expected call of GetBucketTaggingRequest +// GetBucketTaggingRequest indicates an expected call of GetBucketTaggingRequest. func (mr *MockS3APIMockRecorder) GetBucketTaggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketTaggingRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketTaggingRequest), arg0) } -// GetBucketTaggingWithContext mocks base method +// GetBucketTaggingWithContext mocks base method. func (m *MockS3API) GetBucketTaggingWithContext(arg0 context.Context, arg1 *s3.GetBucketTaggingInput, arg2 ...request.Option) (*s3.GetBucketTaggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2031,14 +2131,14 @@ func (m *MockS3API) GetBucketTaggingWithContext(arg0 context.Context, arg1 *s3.G return ret0, ret1 } -// GetBucketTaggingWithContext indicates an expected call of GetBucketTaggingWithContext +// GetBucketTaggingWithContext indicates an expected call of GetBucketTaggingWithContext. func (mr *MockS3APIMockRecorder) GetBucketTaggingWithContext(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, "GetBucketTaggingWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketTaggingWithContext), varargs...) } -// GetBucketVersioning mocks base method +// GetBucketVersioning mocks base method. func (m *MockS3API) GetBucketVersioning(arg0 *s3.GetBucketVersioningInput) (*s3.GetBucketVersioningOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketVersioning", arg0) @@ -2047,13 +2147,13 @@ func (m *MockS3API) GetBucketVersioning(arg0 *s3.GetBucketVersioningInput) (*s3. return ret0, ret1 } -// GetBucketVersioning indicates an expected call of GetBucketVersioning +// GetBucketVersioning indicates an expected call of GetBucketVersioning. func (mr *MockS3APIMockRecorder) GetBucketVersioning(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketVersioning", reflect.TypeOf((*MockS3API)(nil).GetBucketVersioning), arg0) } -// GetBucketVersioningRequest mocks base method +// GetBucketVersioningRequest mocks base method. func (m *MockS3API) GetBucketVersioningRequest(arg0 *s3.GetBucketVersioningInput) (*request.Request, *s3.GetBucketVersioningOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketVersioningRequest", arg0) @@ -2062,13 +2162,13 @@ func (m *MockS3API) GetBucketVersioningRequest(arg0 *s3.GetBucketVersioningInput return ret0, ret1 } -// GetBucketVersioningRequest indicates an expected call of GetBucketVersioningRequest +// GetBucketVersioningRequest indicates an expected call of GetBucketVersioningRequest. func (mr *MockS3APIMockRecorder) GetBucketVersioningRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketVersioningRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketVersioningRequest), arg0) } -// GetBucketVersioningWithContext mocks base method +// GetBucketVersioningWithContext mocks base method. func (m *MockS3API) GetBucketVersioningWithContext(arg0 context.Context, arg1 *s3.GetBucketVersioningInput, arg2 ...request.Option) (*s3.GetBucketVersioningOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2081,14 +2181,14 @@ func (m *MockS3API) GetBucketVersioningWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// GetBucketVersioningWithContext indicates an expected call of GetBucketVersioningWithContext +// GetBucketVersioningWithContext indicates an expected call of GetBucketVersioningWithContext. func (mr *MockS3APIMockRecorder) GetBucketVersioningWithContext(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, "GetBucketVersioningWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketVersioningWithContext), varargs...) } -// GetBucketWebsite mocks base method +// GetBucketWebsite mocks base method. func (m *MockS3API) GetBucketWebsite(arg0 *s3.GetBucketWebsiteInput) (*s3.GetBucketWebsiteOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketWebsite", arg0) @@ -2097,13 +2197,13 @@ func (m *MockS3API) GetBucketWebsite(arg0 *s3.GetBucketWebsiteInput) (*s3.GetBuc return ret0, ret1 } -// GetBucketWebsite indicates an expected call of GetBucketWebsite +// GetBucketWebsite indicates an expected call of GetBucketWebsite. func (mr *MockS3APIMockRecorder) GetBucketWebsite(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketWebsite", reflect.TypeOf((*MockS3API)(nil).GetBucketWebsite), arg0) } -// GetBucketWebsiteRequest mocks base method +// GetBucketWebsiteRequest mocks base method. func (m *MockS3API) GetBucketWebsiteRequest(arg0 *s3.GetBucketWebsiteInput) (*request.Request, *s3.GetBucketWebsiteOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBucketWebsiteRequest", arg0) @@ -2112,13 +2212,13 @@ func (m *MockS3API) GetBucketWebsiteRequest(arg0 *s3.GetBucketWebsiteInput) (*re return ret0, ret1 } -// GetBucketWebsiteRequest indicates an expected call of GetBucketWebsiteRequest +// GetBucketWebsiteRequest indicates an expected call of GetBucketWebsiteRequest. func (mr *MockS3APIMockRecorder) GetBucketWebsiteRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBucketWebsiteRequest", reflect.TypeOf((*MockS3API)(nil).GetBucketWebsiteRequest), arg0) } -// GetBucketWebsiteWithContext mocks base method +// GetBucketWebsiteWithContext mocks base method. func (m *MockS3API) GetBucketWebsiteWithContext(arg0 context.Context, arg1 *s3.GetBucketWebsiteInput, arg2 ...request.Option) (*s3.GetBucketWebsiteOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2131,14 +2231,14 @@ func (m *MockS3API) GetBucketWebsiteWithContext(arg0 context.Context, arg1 *s3.G return ret0, ret1 } -// GetBucketWebsiteWithContext indicates an expected call of GetBucketWebsiteWithContext +// GetBucketWebsiteWithContext indicates an expected call of GetBucketWebsiteWithContext. func (mr *MockS3APIMockRecorder) GetBucketWebsiteWithContext(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, "GetBucketWebsiteWithContext", reflect.TypeOf((*MockS3API)(nil).GetBucketWebsiteWithContext), varargs...) } -// GetObject mocks base method +// GetObject mocks base method. func (m *MockS3API) GetObject(arg0 *s3.GetObjectInput) (*s3.GetObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObject", arg0) @@ -2147,13 +2247,13 @@ func (m *MockS3API) GetObject(arg0 *s3.GetObjectInput) (*s3.GetObjectOutput, err return ret0, ret1 } -// GetObject indicates an expected call of GetObject +// GetObject indicates an expected call of GetObject. func (mr *MockS3APIMockRecorder) GetObject(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObject", reflect.TypeOf((*MockS3API)(nil).GetObject), arg0) } -// GetObjectAcl mocks base method +// GetObjectAcl mocks base method. func (m *MockS3API) GetObjectAcl(arg0 *s3.GetObjectAclInput) (*s3.GetObjectAclOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectAcl", arg0) @@ -2162,13 +2262,13 @@ func (m *MockS3API) GetObjectAcl(arg0 *s3.GetObjectAclInput) (*s3.GetObjectAclOu return ret0, ret1 } -// GetObjectAcl indicates an expected call of GetObjectAcl +// GetObjectAcl indicates an expected call of GetObjectAcl. func (mr *MockS3APIMockRecorder) GetObjectAcl(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectAcl", reflect.TypeOf((*MockS3API)(nil).GetObjectAcl), arg0) } -// GetObjectAclRequest mocks base method +// GetObjectAclRequest mocks base method. func (m *MockS3API) GetObjectAclRequest(arg0 *s3.GetObjectAclInput) (*request.Request, *s3.GetObjectAclOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectAclRequest", arg0) @@ -2177,13 +2277,13 @@ func (m *MockS3API) GetObjectAclRequest(arg0 *s3.GetObjectAclInput) (*request.Re return ret0, ret1 } -// GetObjectAclRequest indicates an expected call of GetObjectAclRequest +// GetObjectAclRequest indicates an expected call of GetObjectAclRequest. func (mr *MockS3APIMockRecorder) GetObjectAclRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectAclRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectAclRequest), arg0) } -// GetObjectAclWithContext mocks base method +// GetObjectAclWithContext mocks base method. func (m *MockS3API) GetObjectAclWithContext(arg0 context.Context, arg1 *s3.GetObjectAclInput, arg2 ...request.Option) (*s3.GetObjectAclOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2196,14 +2296,14 @@ func (m *MockS3API) GetObjectAclWithContext(arg0 context.Context, arg1 *s3.GetOb return ret0, ret1 } -// GetObjectAclWithContext indicates an expected call of GetObjectAclWithContext +// GetObjectAclWithContext indicates an expected call of GetObjectAclWithContext. func (mr *MockS3APIMockRecorder) GetObjectAclWithContext(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, "GetObjectAclWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectAclWithContext), varargs...) } -// GetObjectLegalHold mocks base method +// GetObjectLegalHold mocks base method. func (m *MockS3API) GetObjectLegalHold(arg0 *s3.GetObjectLegalHoldInput) (*s3.GetObjectLegalHoldOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectLegalHold", arg0) @@ -2212,13 +2312,13 @@ func (m *MockS3API) GetObjectLegalHold(arg0 *s3.GetObjectLegalHoldInput) (*s3.Ge return ret0, ret1 } -// GetObjectLegalHold indicates an expected call of GetObjectLegalHold +// GetObjectLegalHold indicates an expected call of GetObjectLegalHold. func (mr *MockS3APIMockRecorder) GetObjectLegalHold(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectLegalHold", reflect.TypeOf((*MockS3API)(nil).GetObjectLegalHold), arg0) } -// GetObjectLegalHoldRequest mocks base method +// GetObjectLegalHoldRequest mocks base method. func (m *MockS3API) GetObjectLegalHoldRequest(arg0 *s3.GetObjectLegalHoldInput) (*request.Request, *s3.GetObjectLegalHoldOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectLegalHoldRequest", arg0) @@ -2227,13 +2327,13 @@ func (m *MockS3API) GetObjectLegalHoldRequest(arg0 *s3.GetObjectLegalHoldInput) return ret0, ret1 } -// GetObjectLegalHoldRequest indicates an expected call of GetObjectLegalHoldRequest +// GetObjectLegalHoldRequest indicates an expected call of GetObjectLegalHoldRequest. func (mr *MockS3APIMockRecorder) GetObjectLegalHoldRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectLegalHoldRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectLegalHoldRequest), arg0) } -// GetObjectLegalHoldWithContext mocks base method +// GetObjectLegalHoldWithContext mocks base method. func (m *MockS3API) GetObjectLegalHoldWithContext(arg0 context.Context, arg1 *s3.GetObjectLegalHoldInput, arg2 ...request.Option) (*s3.GetObjectLegalHoldOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2246,14 +2346,14 @@ func (m *MockS3API) GetObjectLegalHoldWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// GetObjectLegalHoldWithContext indicates an expected call of GetObjectLegalHoldWithContext +// GetObjectLegalHoldWithContext indicates an expected call of GetObjectLegalHoldWithContext. func (mr *MockS3APIMockRecorder) GetObjectLegalHoldWithContext(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, "GetObjectLegalHoldWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectLegalHoldWithContext), varargs...) } -// GetObjectLockConfiguration mocks base method +// GetObjectLockConfiguration mocks base method. func (m *MockS3API) GetObjectLockConfiguration(arg0 *s3.GetObjectLockConfigurationInput) (*s3.GetObjectLockConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectLockConfiguration", arg0) @@ -2262,13 +2362,13 @@ func (m *MockS3API) GetObjectLockConfiguration(arg0 *s3.GetObjectLockConfigurati return ret0, ret1 } -// GetObjectLockConfiguration indicates an expected call of GetObjectLockConfiguration +// GetObjectLockConfiguration indicates an expected call of GetObjectLockConfiguration. func (mr *MockS3APIMockRecorder) GetObjectLockConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectLockConfiguration", reflect.TypeOf((*MockS3API)(nil).GetObjectLockConfiguration), arg0) } -// GetObjectLockConfigurationRequest mocks base method +// GetObjectLockConfigurationRequest mocks base method. func (m *MockS3API) GetObjectLockConfigurationRequest(arg0 *s3.GetObjectLockConfigurationInput) (*request.Request, *s3.GetObjectLockConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectLockConfigurationRequest", arg0) @@ -2277,13 +2377,13 @@ func (m *MockS3API) GetObjectLockConfigurationRequest(arg0 *s3.GetObjectLockConf return ret0, ret1 } -// GetObjectLockConfigurationRequest indicates an expected call of GetObjectLockConfigurationRequest +// GetObjectLockConfigurationRequest indicates an expected call of GetObjectLockConfigurationRequest. func (mr *MockS3APIMockRecorder) GetObjectLockConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectLockConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectLockConfigurationRequest), arg0) } -// GetObjectLockConfigurationWithContext mocks base method +// GetObjectLockConfigurationWithContext mocks base method. func (m *MockS3API) GetObjectLockConfigurationWithContext(arg0 context.Context, arg1 *s3.GetObjectLockConfigurationInput, arg2 ...request.Option) (*s3.GetObjectLockConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2296,14 +2396,14 @@ func (m *MockS3API) GetObjectLockConfigurationWithContext(arg0 context.Context, return ret0, ret1 } -// GetObjectLockConfigurationWithContext indicates an expected call of GetObjectLockConfigurationWithContext +// GetObjectLockConfigurationWithContext indicates an expected call of GetObjectLockConfigurationWithContext. func (mr *MockS3APIMockRecorder) GetObjectLockConfigurationWithContext(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, "GetObjectLockConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectLockConfigurationWithContext), varargs...) } -// GetObjectRequest mocks base method +// GetObjectRequest mocks base method. func (m *MockS3API) GetObjectRequest(arg0 *s3.GetObjectInput) (*request.Request, *s3.GetObjectOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectRequest", arg0) @@ -2312,13 +2412,13 @@ func (m *MockS3API) GetObjectRequest(arg0 *s3.GetObjectInput) (*request.Request, return ret0, ret1 } -// GetObjectRequest indicates an expected call of GetObjectRequest +// GetObjectRequest indicates an expected call of GetObjectRequest. func (mr *MockS3APIMockRecorder) GetObjectRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectRequest), arg0) } -// GetObjectRetention mocks base method +// GetObjectRetention mocks base method. func (m *MockS3API) GetObjectRetention(arg0 *s3.GetObjectRetentionInput) (*s3.GetObjectRetentionOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectRetention", arg0) @@ -2327,13 +2427,13 @@ func (m *MockS3API) GetObjectRetention(arg0 *s3.GetObjectRetentionInput) (*s3.Ge return ret0, ret1 } -// GetObjectRetention indicates an expected call of GetObjectRetention +// GetObjectRetention indicates an expected call of GetObjectRetention. func (mr *MockS3APIMockRecorder) GetObjectRetention(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectRetention", reflect.TypeOf((*MockS3API)(nil).GetObjectRetention), arg0) } -// GetObjectRetentionRequest mocks base method +// GetObjectRetentionRequest mocks base method. func (m *MockS3API) GetObjectRetentionRequest(arg0 *s3.GetObjectRetentionInput) (*request.Request, *s3.GetObjectRetentionOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectRetentionRequest", arg0) @@ -2342,13 +2442,13 @@ func (m *MockS3API) GetObjectRetentionRequest(arg0 *s3.GetObjectRetentionInput) return ret0, ret1 } -// GetObjectRetentionRequest indicates an expected call of GetObjectRetentionRequest +// GetObjectRetentionRequest indicates an expected call of GetObjectRetentionRequest. func (mr *MockS3APIMockRecorder) GetObjectRetentionRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectRetentionRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectRetentionRequest), arg0) } -// GetObjectRetentionWithContext mocks base method +// GetObjectRetentionWithContext mocks base method. func (m *MockS3API) GetObjectRetentionWithContext(arg0 context.Context, arg1 *s3.GetObjectRetentionInput, arg2 ...request.Option) (*s3.GetObjectRetentionOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2361,14 +2461,14 @@ func (m *MockS3API) GetObjectRetentionWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// GetObjectRetentionWithContext indicates an expected call of GetObjectRetentionWithContext +// GetObjectRetentionWithContext indicates an expected call of GetObjectRetentionWithContext. func (mr *MockS3APIMockRecorder) GetObjectRetentionWithContext(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, "GetObjectRetentionWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectRetentionWithContext), varargs...) } -// GetObjectTagging mocks base method +// GetObjectTagging mocks base method. func (m *MockS3API) GetObjectTagging(arg0 *s3.GetObjectTaggingInput) (*s3.GetObjectTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectTagging", arg0) @@ -2377,13 +2477,13 @@ func (m *MockS3API) GetObjectTagging(arg0 *s3.GetObjectTaggingInput) (*s3.GetObj return ret0, ret1 } -// GetObjectTagging indicates an expected call of GetObjectTagging +// GetObjectTagging indicates an expected call of GetObjectTagging. func (mr *MockS3APIMockRecorder) GetObjectTagging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTagging", reflect.TypeOf((*MockS3API)(nil).GetObjectTagging), arg0) } -// GetObjectTaggingRequest mocks base method +// GetObjectTaggingRequest mocks base method. func (m *MockS3API) GetObjectTaggingRequest(arg0 *s3.GetObjectTaggingInput) (*request.Request, *s3.GetObjectTaggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectTaggingRequest", arg0) @@ -2392,13 +2492,13 @@ func (m *MockS3API) GetObjectTaggingRequest(arg0 *s3.GetObjectTaggingInput) (*re return ret0, ret1 } -// GetObjectTaggingRequest indicates an expected call of GetObjectTaggingRequest +// GetObjectTaggingRequest indicates an expected call of GetObjectTaggingRequest. func (mr *MockS3APIMockRecorder) GetObjectTaggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTaggingRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectTaggingRequest), arg0) } -// GetObjectTaggingWithContext mocks base method +// GetObjectTaggingWithContext mocks base method. func (m *MockS3API) GetObjectTaggingWithContext(arg0 context.Context, arg1 *s3.GetObjectTaggingInput, arg2 ...request.Option) (*s3.GetObjectTaggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2411,14 +2511,14 @@ func (m *MockS3API) GetObjectTaggingWithContext(arg0 context.Context, arg1 *s3.G return ret0, ret1 } -// GetObjectTaggingWithContext indicates an expected call of GetObjectTaggingWithContext +// GetObjectTaggingWithContext indicates an expected call of GetObjectTaggingWithContext. func (mr *MockS3APIMockRecorder) GetObjectTaggingWithContext(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, "GetObjectTaggingWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectTaggingWithContext), varargs...) } -// GetObjectTorrent mocks base method +// GetObjectTorrent mocks base method. func (m *MockS3API) GetObjectTorrent(arg0 *s3.GetObjectTorrentInput) (*s3.GetObjectTorrentOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectTorrent", arg0) @@ -2427,13 +2527,13 @@ func (m *MockS3API) GetObjectTorrent(arg0 *s3.GetObjectTorrentInput) (*s3.GetObj return ret0, ret1 } -// GetObjectTorrent indicates an expected call of GetObjectTorrent +// GetObjectTorrent indicates an expected call of GetObjectTorrent. func (mr *MockS3APIMockRecorder) GetObjectTorrent(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTorrent", reflect.TypeOf((*MockS3API)(nil).GetObjectTorrent), arg0) } -// GetObjectTorrentRequest mocks base method +// GetObjectTorrentRequest mocks base method. func (m *MockS3API) GetObjectTorrentRequest(arg0 *s3.GetObjectTorrentInput) (*request.Request, *s3.GetObjectTorrentOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetObjectTorrentRequest", arg0) @@ -2442,13 +2542,13 @@ func (m *MockS3API) GetObjectTorrentRequest(arg0 *s3.GetObjectTorrentInput) (*re return ret0, ret1 } -// GetObjectTorrentRequest indicates an expected call of GetObjectTorrentRequest +// GetObjectTorrentRequest indicates an expected call of GetObjectTorrentRequest. func (mr *MockS3APIMockRecorder) GetObjectTorrentRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectTorrentRequest", reflect.TypeOf((*MockS3API)(nil).GetObjectTorrentRequest), arg0) } -// GetObjectTorrentWithContext mocks base method +// GetObjectTorrentWithContext mocks base method. func (m *MockS3API) GetObjectTorrentWithContext(arg0 context.Context, arg1 *s3.GetObjectTorrentInput, arg2 ...request.Option) (*s3.GetObjectTorrentOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2461,14 +2561,14 @@ func (m *MockS3API) GetObjectTorrentWithContext(arg0 context.Context, arg1 *s3.G return ret0, ret1 } -// GetObjectTorrentWithContext indicates an expected call of GetObjectTorrentWithContext +// GetObjectTorrentWithContext indicates an expected call of GetObjectTorrentWithContext. func (mr *MockS3APIMockRecorder) GetObjectTorrentWithContext(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, "GetObjectTorrentWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectTorrentWithContext), varargs...) } -// GetObjectWithContext mocks base method +// GetObjectWithContext mocks base method. func (m *MockS3API) GetObjectWithContext(arg0 context.Context, arg1 *s3.GetObjectInput, arg2 ...request.Option) (*s3.GetObjectOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2481,14 +2581,14 @@ func (m *MockS3API) GetObjectWithContext(arg0 context.Context, arg1 *s3.GetObjec return ret0, ret1 } -// GetObjectWithContext indicates an expected call of GetObjectWithContext +// GetObjectWithContext indicates an expected call of GetObjectWithContext. func (mr *MockS3APIMockRecorder) GetObjectWithContext(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, "GetObjectWithContext", reflect.TypeOf((*MockS3API)(nil).GetObjectWithContext), varargs...) } -// GetPublicAccessBlock mocks base method +// GetPublicAccessBlock mocks base method. func (m *MockS3API) GetPublicAccessBlock(arg0 *s3.GetPublicAccessBlockInput) (*s3.GetPublicAccessBlockOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetPublicAccessBlock", arg0) @@ -2497,13 +2597,13 @@ func (m *MockS3API) GetPublicAccessBlock(arg0 *s3.GetPublicAccessBlockInput) (*s return ret0, ret1 } -// GetPublicAccessBlock indicates an expected call of GetPublicAccessBlock +// GetPublicAccessBlock indicates an expected call of GetPublicAccessBlock. func (mr *MockS3APIMockRecorder) GetPublicAccessBlock(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPublicAccessBlock", reflect.TypeOf((*MockS3API)(nil).GetPublicAccessBlock), arg0) } -// GetPublicAccessBlockRequest mocks base method +// GetPublicAccessBlockRequest mocks base method. func (m *MockS3API) GetPublicAccessBlockRequest(arg0 *s3.GetPublicAccessBlockInput) (*request.Request, *s3.GetPublicAccessBlockOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetPublicAccessBlockRequest", arg0) @@ -2512,13 +2612,13 @@ func (m *MockS3API) GetPublicAccessBlockRequest(arg0 *s3.GetPublicAccessBlockInp return ret0, ret1 } -// GetPublicAccessBlockRequest indicates an expected call of GetPublicAccessBlockRequest +// GetPublicAccessBlockRequest indicates an expected call of GetPublicAccessBlockRequest. func (mr *MockS3APIMockRecorder) GetPublicAccessBlockRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPublicAccessBlockRequest", reflect.TypeOf((*MockS3API)(nil).GetPublicAccessBlockRequest), arg0) } -// GetPublicAccessBlockWithContext mocks base method +// GetPublicAccessBlockWithContext mocks base method. func (m *MockS3API) GetPublicAccessBlockWithContext(arg0 context.Context, arg1 *s3.GetPublicAccessBlockInput, arg2 ...request.Option) (*s3.GetPublicAccessBlockOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2531,14 +2631,14 @@ func (m *MockS3API) GetPublicAccessBlockWithContext(arg0 context.Context, arg1 * return ret0, ret1 } -// GetPublicAccessBlockWithContext indicates an expected call of GetPublicAccessBlockWithContext +// GetPublicAccessBlockWithContext indicates an expected call of GetPublicAccessBlockWithContext. func (mr *MockS3APIMockRecorder) GetPublicAccessBlockWithContext(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, "GetPublicAccessBlockWithContext", reflect.TypeOf((*MockS3API)(nil).GetPublicAccessBlockWithContext), varargs...) } -// HeadBucket mocks base method +// HeadBucket mocks base method. func (m *MockS3API) HeadBucket(arg0 *s3.HeadBucketInput) (*s3.HeadBucketOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HeadBucket", arg0) @@ -2547,13 +2647,13 @@ func (m *MockS3API) HeadBucket(arg0 *s3.HeadBucketInput) (*s3.HeadBucketOutput, return ret0, ret1 } -// HeadBucket indicates an expected call of HeadBucket +// HeadBucket indicates an expected call of HeadBucket. func (mr *MockS3APIMockRecorder) HeadBucket(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadBucket", reflect.TypeOf((*MockS3API)(nil).HeadBucket), arg0) } -// HeadBucketRequest mocks base method +// HeadBucketRequest mocks base method. func (m *MockS3API) HeadBucketRequest(arg0 *s3.HeadBucketInput) (*request.Request, *s3.HeadBucketOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HeadBucketRequest", arg0) @@ -2562,13 +2662,13 @@ func (m *MockS3API) HeadBucketRequest(arg0 *s3.HeadBucketInput) (*request.Reques return ret0, ret1 } -// HeadBucketRequest indicates an expected call of HeadBucketRequest +// HeadBucketRequest indicates an expected call of HeadBucketRequest. func (mr *MockS3APIMockRecorder) HeadBucketRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadBucketRequest", reflect.TypeOf((*MockS3API)(nil).HeadBucketRequest), arg0) } -// HeadBucketWithContext mocks base method +// HeadBucketWithContext mocks base method. func (m *MockS3API) HeadBucketWithContext(arg0 context.Context, arg1 *s3.HeadBucketInput, arg2 ...request.Option) (*s3.HeadBucketOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2581,14 +2681,14 @@ func (m *MockS3API) HeadBucketWithContext(arg0 context.Context, arg1 *s3.HeadBuc return ret0, ret1 } -// HeadBucketWithContext indicates an expected call of HeadBucketWithContext +// HeadBucketWithContext indicates an expected call of HeadBucketWithContext. func (mr *MockS3APIMockRecorder) HeadBucketWithContext(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, "HeadBucketWithContext", reflect.TypeOf((*MockS3API)(nil).HeadBucketWithContext), varargs...) } -// HeadObject mocks base method +// HeadObject mocks base method. func (m *MockS3API) HeadObject(arg0 *s3.HeadObjectInput) (*s3.HeadObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HeadObject", arg0) @@ -2597,13 +2697,13 @@ func (m *MockS3API) HeadObject(arg0 *s3.HeadObjectInput) (*s3.HeadObjectOutput, return ret0, ret1 } -// HeadObject indicates an expected call of HeadObject +// HeadObject indicates an expected call of HeadObject. func (mr *MockS3APIMockRecorder) HeadObject(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObject", reflect.TypeOf((*MockS3API)(nil).HeadObject), arg0) } -// HeadObjectRequest mocks base method +// HeadObjectRequest mocks base method. func (m *MockS3API) HeadObjectRequest(arg0 *s3.HeadObjectInput) (*request.Request, *s3.HeadObjectOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HeadObjectRequest", arg0) @@ -2612,13 +2712,13 @@ func (m *MockS3API) HeadObjectRequest(arg0 *s3.HeadObjectInput) (*request.Reques return ret0, ret1 } -// HeadObjectRequest indicates an expected call of HeadObjectRequest +// HeadObjectRequest indicates an expected call of HeadObjectRequest. func (mr *MockS3APIMockRecorder) HeadObjectRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadObjectRequest", reflect.TypeOf((*MockS3API)(nil).HeadObjectRequest), arg0) } -// HeadObjectWithContext mocks base method +// HeadObjectWithContext mocks base method. func (m *MockS3API) HeadObjectWithContext(arg0 context.Context, arg1 *s3.HeadObjectInput, arg2 ...request.Option) (*s3.HeadObjectOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2631,14 +2731,14 @@ func (m *MockS3API) HeadObjectWithContext(arg0 context.Context, arg1 *s3.HeadObj return ret0, ret1 } -// HeadObjectWithContext indicates an expected call of HeadObjectWithContext +// HeadObjectWithContext indicates an expected call of HeadObjectWithContext. func (mr *MockS3APIMockRecorder) HeadObjectWithContext(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, "HeadObjectWithContext", reflect.TypeOf((*MockS3API)(nil).HeadObjectWithContext), varargs...) } -// ListBucketAnalyticsConfigurations mocks base method +// ListBucketAnalyticsConfigurations mocks base method. func (m *MockS3API) ListBucketAnalyticsConfigurations(arg0 *s3.ListBucketAnalyticsConfigurationsInput) (*s3.ListBucketAnalyticsConfigurationsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketAnalyticsConfigurations", arg0) @@ -2647,13 +2747,13 @@ func (m *MockS3API) ListBucketAnalyticsConfigurations(arg0 *s3.ListBucketAnalyti return ret0, ret1 } -// ListBucketAnalyticsConfigurations indicates an expected call of ListBucketAnalyticsConfigurations +// ListBucketAnalyticsConfigurations indicates an expected call of ListBucketAnalyticsConfigurations. func (mr *MockS3APIMockRecorder) ListBucketAnalyticsConfigurations(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketAnalyticsConfigurations", reflect.TypeOf((*MockS3API)(nil).ListBucketAnalyticsConfigurations), arg0) } -// ListBucketAnalyticsConfigurationsRequest mocks base method +// ListBucketAnalyticsConfigurationsRequest mocks base method. func (m *MockS3API) ListBucketAnalyticsConfigurationsRequest(arg0 *s3.ListBucketAnalyticsConfigurationsInput) (*request.Request, *s3.ListBucketAnalyticsConfigurationsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketAnalyticsConfigurationsRequest", arg0) @@ -2662,13 +2762,13 @@ func (m *MockS3API) ListBucketAnalyticsConfigurationsRequest(arg0 *s3.ListBucket return ret0, ret1 } -// ListBucketAnalyticsConfigurationsRequest indicates an expected call of ListBucketAnalyticsConfigurationsRequest +// ListBucketAnalyticsConfigurationsRequest indicates an expected call of ListBucketAnalyticsConfigurationsRequest. func (mr *MockS3APIMockRecorder) ListBucketAnalyticsConfigurationsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketAnalyticsConfigurationsRequest", reflect.TypeOf((*MockS3API)(nil).ListBucketAnalyticsConfigurationsRequest), arg0) } -// ListBucketAnalyticsConfigurationsWithContext mocks base method +// ListBucketAnalyticsConfigurationsWithContext mocks base method. func (m *MockS3API) ListBucketAnalyticsConfigurationsWithContext(arg0 context.Context, arg1 *s3.ListBucketAnalyticsConfigurationsInput, arg2 ...request.Option) (*s3.ListBucketAnalyticsConfigurationsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2681,14 +2781,64 @@ func (m *MockS3API) ListBucketAnalyticsConfigurationsWithContext(arg0 context.Co return ret0, ret1 } -// ListBucketAnalyticsConfigurationsWithContext indicates an expected call of ListBucketAnalyticsConfigurationsWithContext +// ListBucketAnalyticsConfigurationsWithContext indicates an expected call of ListBucketAnalyticsConfigurationsWithContext. func (mr *MockS3APIMockRecorder) ListBucketAnalyticsConfigurationsWithContext(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, "ListBucketAnalyticsConfigurationsWithContext", reflect.TypeOf((*MockS3API)(nil).ListBucketAnalyticsConfigurationsWithContext), varargs...) } -// ListBucketInventoryConfigurations mocks base method +// ListBucketIntelligentTieringConfigurations mocks base method. +func (m *MockS3API) ListBucketIntelligentTieringConfigurations(arg0 *s3.ListBucketIntelligentTieringConfigurationsInput) (*s3.ListBucketIntelligentTieringConfigurationsOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListBucketIntelligentTieringConfigurations", arg0) + ret0, _ := ret[0].(*s3.ListBucketIntelligentTieringConfigurationsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListBucketIntelligentTieringConfigurations indicates an expected call of ListBucketIntelligentTieringConfigurations. +func (mr *MockS3APIMockRecorder) ListBucketIntelligentTieringConfigurations(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketIntelligentTieringConfigurations", reflect.TypeOf((*MockS3API)(nil).ListBucketIntelligentTieringConfigurations), arg0) +} + +// ListBucketIntelligentTieringConfigurationsRequest mocks base method. +func (m *MockS3API) ListBucketIntelligentTieringConfigurationsRequest(arg0 *s3.ListBucketIntelligentTieringConfigurationsInput) (*request.Request, *s3.ListBucketIntelligentTieringConfigurationsOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListBucketIntelligentTieringConfigurationsRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*s3.ListBucketIntelligentTieringConfigurationsOutput) + return ret0, ret1 +} + +// ListBucketIntelligentTieringConfigurationsRequest indicates an expected call of ListBucketIntelligentTieringConfigurationsRequest. +func (mr *MockS3APIMockRecorder) ListBucketIntelligentTieringConfigurationsRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketIntelligentTieringConfigurationsRequest", reflect.TypeOf((*MockS3API)(nil).ListBucketIntelligentTieringConfigurationsRequest), arg0) +} + +// ListBucketIntelligentTieringConfigurationsWithContext mocks base method. +func (m *MockS3API) ListBucketIntelligentTieringConfigurationsWithContext(arg0 context.Context, arg1 *s3.ListBucketIntelligentTieringConfigurationsInput, arg2 ...request.Option) (*s3.ListBucketIntelligentTieringConfigurationsOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListBucketIntelligentTieringConfigurationsWithContext", varargs...) + ret0, _ := ret[0].(*s3.ListBucketIntelligentTieringConfigurationsOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListBucketIntelligentTieringConfigurationsWithContext indicates an expected call of ListBucketIntelligentTieringConfigurationsWithContext. +func (mr *MockS3APIMockRecorder) ListBucketIntelligentTieringConfigurationsWithContext(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, "ListBucketIntelligentTieringConfigurationsWithContext", reflect.TypeOf((*MockS3API)(nil).ListBucketIntelligentTieringConfigurationsWithContext), varargs...) +} + +// ListBucketInventoryConfigurations mocks base method. func (m *MockS3API) ListBucketInventoryConfigurations(arg0 *s3.ListBucketInventoryConfigurationsInput) (*s3.ListBucketInventoryConfigurationsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketInventoryConfigurations", arg0) @@ -2697,13 +2847,13 @@ func (m *MockS3API) ListBucketInventoryConfigurations(arg0 *s3.ListBucketInvento return ret0, ret1 } -// ListBucketInventoryConfigurations indicates an expected call of ListBucketInventoryConfigurations +// ListBucketInventoryConfigurations indicates an expected call of ListBucketInventoryConfigurations. func (mr *MockS3APIMockRecorder) ListBucketInventoryConfigurations(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketInventoryConfigurations", reflect.TypeOf((*MockS3API)(nil).ListBucketInventoryConfigurations), arg0) } -// ListBucketInventoryConfigurationsRequest mocks base method +// ListBucketInventoryConfigurationsRequest mocks base method. func (m *MockS3API) ListBucketInventoryConfigurationsRequest(arg0 *s3.ListBucketInventoryConfigurationsInput) (*request.Request, *s3.ListBucketInventoryConfigurationsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketInventoryConfigurationsRequest", arg0) @@ -2712,13 +2862,13 @@ func (m *MockS3API) ListBucketInventoryConfigurationsRequest(arg0 *s3.ListBucket return ret0, ret1 } -// ListBucketInventoryConfigurationsRequest indicates an expected call of ListBucketInventoryConfigurationsRequest +// ListBucketInventoryConfigurationsRequest indicates an expected call of ListBucketInventoryConfigurationsRequest. func (mr *MockS3APIMockRecorder) ListBucketInventoryConfigurationsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketInventoryConfigurationsRequest", reflect.TypeOf((*MockS3API)(nil).ListBucketInventoryConfigurationsRequest), arg0) } -// ListBucketInventoryConfigurationsWithContext mocks base method +// ListBucketInventoryConfigurationsWithContext mocks base method. func (m *MockS3API) ListBucketInventoryConfigurationsWithContext(arg0 context.Context, arg1 *s3.ListBucketInventoryConfigurationsInput, arg2 ...request.Option) (*s3.ListBucketInventoryConfigurationsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2731,14 +2881,14 @@ func (m *MockS3API) ListBucketInventoryConfigurationsWithContext(arg0 context.Co return ret0, ret1 } -// ListBucketInventoryConfigurationsWithContext indicates an expected call of ListBucketInventoryConfigurationsWithContext +// ListBucketInventoryConfigurationsWithContext indicates an expected call of ListBucketInventoryConfigurationsWithContext. func (mr *MockS3APIMockRecorder) ListBucketInventoryConfigurationsWithContext(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, "ListBucketInventoryConfigurationsWithContext", reflect.TypeOf((*MockS3API)(nil).ListBucketInventoryConfigurationsWithContext), varargs...) } -// ListBucketMetricsConfigurations mocks base method +// ListBucketMetricsConfigurations mocks base method. func (m *MockS3API) ListBucketMetricsConfigurations(arg0 *s3.ListBucketMetricsConfigurationsInput) (*s3.ListBucketMetricsConfigurationsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketMetricsConfigurations", arg0) @@ -2747,13 +2897,13 @@ func (m *MockS3API) ListBucketMetricsConfigurations(arg0 *s3.ListBucketMetricsCo return ret0, ret1 } -// ListBucketMetricsConfigurations indicates an expected call of ListBucketMetricsConfigurations +// ListBucketMetricsConfigurations indicates an expected call of ListBucketMetricsConfigurations. func (mr *MockS3APIMockRecorder) ListBucketMetricsConfigurations(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketMetricsConfigurations", reflect.TypeOf((*MockS3API)(nil).ListBucketMetricsConfigurations), arg0) } -// ListBucketMetricsConfigurationsRequest mocks base method +// ListBucketMetricsConfigurationsRequest mocks base method. func (m *MockS3API) ListBucketMetricsConfigurationsRequest(arg0 *s3.ListBucketMetricsConfigurationsInput) (*request.Request, *s3.ListBucketMetricsConfigurationsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketMetricsConfigurationsRequest", arg0) @@ -2762,13 +2912,13 @@ func (m *MockS3API) ListBucketMetricsConfigurationsRequest(arg0 *s3.ListBucketMe return ret0, ret1 } -// ListBucketMetricsConfigurationsRequest indicates an expected call of ListBucketMetricsConfigurationsRequest +// ListBucketMetricsConfigurationsRequest indicates an expected call of ListBucketMetricsConfigurationsRequest. func (mr *MockS3APIMockRecorder) ListBucketMetricsConfigurationsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketMetricsConfigurationsRequest", reflect.TypeOf((*MockS3API)(nil).ListBucketMetricsConfigurationsRequest), arg0) } -// ListBucketMetricsConfigurationsWithContext mocks base method +// ListBucketMetricsConfigurationsWithContext mocks base method. func (m *MockS3API) ListBucketMetricsConfigurationsWithContext(arg0 context.Context, arg1 *s3.ListBucketMetricsConfigurationsInput, arg2 ...request.Option) (*s3.ListBucketMetricsConfigurationsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2781,14 +2931,14 @@ func (m *MockS3API) ListBucketMetricsConfigurationsWithContext(arg0 context.Cont return ret0, ret1 } -// ListBucketMetricsConfigurationsWithContext indicates an expected call of ListBucketMetricsConfigurationsWithContext +// ListBucketMetricsConfigurationsWithContext indicates an expected call of ListBucketMetricsConfigurationsWithContext. func (mr *MockS3APIMockRecorder) ListBucketMetricsConfigurationsWithContext(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, "ListBucketMetricsConfigurationsWithContext", reflect.TypeOf((*MockS3API)(nil).ListBucketMetricsConfigurationsWithContext), varargs...) } -// ListBuckets mocks base method +// ListBuckets mocks base method. func (m *MockS3API) ListBuckets(arg0 *s3.ListBucketsInput) (*s3.ListBucketsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBuckets", arg0) @@ -2797,13 +2947,13 @@ func (m *MockS3API) ListBuckets(arg0 *s3.ListBucketsInput) (*s3.ListBucketsOutpu return ret0, ret1 } -// ListBuckets indicates an expected call of ListBuckets +// ListBuckets indicates an expected call of ListBuckets. func (mr *MockS3APIMockRecorder) ListBuckets(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBuckets", reflect.TypeOf((*MockS3API)(nil).ListBuckets), arg0) } -// ListBucketsRequest mocks base method +// ListBucketsRequest mocks base method. func (m *MockS3API) ListBucketsRequest(arg0 *s3.ListBucketsInput) (*request.Request, *s3.ListBucketsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListBucketsRequest", arg0) @@ -2812,13 +2962,13 @@ func (m *MockS3API) ListBucketsRequest(arg0 *s3.ListBucketsInput) (*request.Requ return ret0, ret1 } -// ListBucketsRequest indicates an expected call of ListBucketsRequest +// ListBucketsRequest indicates an expected call of ListBucketsRequest. func (mr *MockS3APIMockRecorder) ListBucketsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBucketsRequest", reflect.TypeOf((*MockS3API)(nil).ListBucketsRequest), arg0) } -// ListBucketsWithContext mocks base method +// ListBucketsWithContext mocks base method. func (m *MockS3API) ListBucketsWithContext(arg0 context.Context, arg1 *s3.ListBucketsInput, arg2 ...request.Option) (*s3.ListBucketsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2831,14 +2981,14 @@ func (m *MockS3API) ListBucketsWithContext(arg0 context.Context, arg1 *s3.ListBu return ret0, ret1 } -// ListBucketsWithContext indicates an expected call of ListBucketsWithContext +// ListBucketsWithContext indicates an expected call of ListBucketsWithContext. func (mr *MockS3APIMockRecorder) ListBucketsWithContext(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, "ListBucketsWithContext", reflect.TypeOf((*MockS3API)(nil).ListBucketsWithContext), varargs...) } -// ListMultipartUploads mocks base method +// ListMultipartUploads mocks base method. func (m *MockS3API) ListMultipartUploads(arg0 *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListMultipartUploads", arg0) @@ -2847,13 +2997,13 @@ func (m *MockS3API) ListMultipartUploads(arg0 *s3.ListMultipartUploadsInput) (*s return ret0, ret1 } -// ListMultipartUploads indicates an expected call of ListMultipartUploads +// ListMultipartUploads indicates an expected call of ListMultipartUploads. func (mr *MockS3APIMockRecorder) ListMultipartUploads(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploads", reflect.TypeOf((*MockS3API)(nil).ListMultipartUploads), arg0) } -// ListMultipartUploadsPages mocks base method +// ListMultipartUploadsPages mocks base method. func (m *MockS3API) ListMultipartUploadsPages(arg0 *s3.ListMultipartUploadsInput, arg1 func(*s3.ListMultipartUploadsOutput, bool) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListMultipartUploadsPages", arg0, arg1) @@ -2861,13 +3011,13 @@ func (m *MockS3API) ListMultipartUploadsPages(arg0 *s3.ListMultipartUploadsInput return ret0 } -// ListMultipartUploadsPages indicates an expected call of ListMultipartUploadsPages +// ListMultipartUploadsPages indicates an expected call of ListMultipartUploadsPages. func (mr *MockS3APIMockRecorder) ListMultipartUploadsPages(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploadsPages", reflect.TypeOf((*MockS3API)(nil).ListMultipartUploadsPages), arg0, arg1) } -// ListMultipartUploadsPagesWithContext mocks base method +// ListMultipartUploadsPagesWithContext mocks base method. func (m *MockS3API) ListMultipartUploadsPagesWithContext(arg0 context.Context, arg1 *s3.ListMultipartUploadsInput, arg2 func(*s3.ListMultipartUploadsOutput, bool) bool, arg3 ...request.Option) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1, arg2} @@ -2879,14 +3029,14 @@ func (m *MockS3API) ListMultipartUploadsPagesWithContext(arg0 context.Context, a return ret0 } -// ListMultipartUploadsPagesWithContext indicates an expected call of ListMultipartUploadsPagesWithContext +// ListMultipartUploadsPagesWithContext indicates an expected call of ListMultipartUploadsPagesWithContext. func (mr *MockS3APIMockRecorder) ListMultipartUploadsPagesWithContext(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploadsPagesWithContext", reflect.TypeOf((*MockS3API)(nil).ListMultipartUploadsPagesWithContext), varargs...) } -// ListMultipartUploadsRequest mocks base method +// ListMultipartUploadsRequest mocks base method. func (m *MockS3API) ListMultipartUploadsRequest(arg0 *s3.ListMultipartUploadsInput) (*request.Request, *s3.ListMultipartUploadsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListMultipartUploadsRequest", arg0) @@ -2895,13 +3045,13 @@ func (m *MockS3API) ListMultipartUploadsRequest(arg0 *s3.ListMultipartUploadsInp return ret0, ret1 } -// ListMultipartUploadsRequest indicates an expected call of ListMultipartUploadsRequest +// ListMultipartUploadsRequest indicates an expected call of ListMultipartUploadsRequest. func (mr *MockS3APIMockRecorder) ListMultipartUploadsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListMultipartUploadsRequest", reflect.TypeOf((*MockS3API)(nil).ListMultipartUploadsRequest), arg0) } -// ListMultipartUploadsWithContext mocks base method +// ListMultipartUploadsWithContext mocks base method. func (m *MockS3API) ListMultipartUploadsWithContext(arg0 context.Context, arg1 *s3.ListMultipartUploadsInput, arg2 ...request.Option) (*s3.ListMultipartUploadsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2914,14 +3064,14 @@ func (m *MockS3API) ListMultipartUploadsWithContext(arg0 context.Context, arg1 * return ret0, ret1 } -// ListMultipartUploadsWithContext indicates an expected call of ListMultipartUploadsWithContext +// ListMultipartUploadsWithContext indicates an expected call of ListMultipartUploadsWithContext. func (mr *MockS3APIMockRecorder) ListMultipartUploadsWithContext(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, "ListMultipartUploadsWithContext", reflect.TypeOf((*MockS3API)(nil).ListMultipartUploadsWithContext), varargs...) } -// ListObjectVersions mocks base method +// ListObjectVersions mocks base method. func (m *MockS3API) ListObjectVersions(arg0 *s3.ListObjectVersionsInput) (*s3.ListObjectVersionsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectVersions", arg0) @@ -2930,13 +3080,13 @@ func (m *MockS3API) ListObjectVersions(arg0 *s3.ListObjectVersionsInput) (*s3.Li return ret0, ret1 } -// ListObjectVersions indicates an expected call of ListObjectVersions +// ListObjectVersions indicates an expected call of ListObjectVersions. func (mr *MockS3APIMockRecorder) ListObjectVersions(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersions", reflect.TypeOf((*MockS3API)(nil).ListObjectVersions), arg0) } -// ListObjectVersionsPages mocks base method +// ListObjectVersionsPages mocks base method. func (m *MockS3API) ListObjectVersionsPages(arg0 *s3.ListObjectVersionsInput, arg1 func(*s3.ListObjectVersionsOutput, bool) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectVersionsPages", arg0, arg1) @@ -2944,13 +3094,13 @@ func (m *MockS3API) ListObjectVersionsPages(arg0 *s3.ListObjectVersionsInput, ar return ret0 } -// ListObjectVersionsPages indicates an expected call of ListObjectVersionsPages +// ListObjectVersionsPages indicates an expected call of ListObjectVersionsPages. func (mr *MockS3APIMockRecorder) ListObjectVersionsPages(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersionsPages", reflect.TypeOf((*MockS3API)(nil).ListObjectVersionsPages), arg0, arg1) } -// ListObjectVersionsPagesWithContext mocks base method +// ListObjectVersionsPagesWithContext mocks base method. func (m *MockS3API) ListObjectVersionsPagesWithContext(arg0 context.Context, arg1 *s3.ListObjectVersionsInput, arg2 func(*s3.ListObjectVersionsOutput, bool) bool, arg3 ...request.Option) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1, arg2} @@ -2962,14 +3112,14 @@ func (m *MockS3API) ListObjectVersionsPagesWithContext(arg0 context.Context, arg return ret0 } -// ListObjectVersionsPagesWithContext indicates an expected call of ListObjectVersionsPagesWithContext +// ListObjectVersionsPagesWithContext indicates an expected call of ListObjectVersionsPagesWithContext. func (mr *MockS3APIMockRecorder) ListObjectVersionsPagesWithContext(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersionsPagesWithContext", reflect.TypeOf((*MockS3API)(nil).ListObjectVersionsPagesWithContext), varargs...) } -// ListObjectVersionsRequest mocks base method +// ListObjectVersionsRequest mocks base method. func (m *MockS3API) ListObjectVersionsRequest(arg0 *s3.ListObjectVersionsInput) (*request.Request, *s3.ListObjectVersionsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectVersionsRequest", arg0) @@ -2978,13 +3128,13 @@ func (m *MockS3API) ListObjectVersionsRequest(arg0 *s3.ListObjectVersionsInput) return ret0, ret1 } -// ListObjectVersionsRequest indicates an expected call of ListObjectVersionsRequest +// ListObjectVersionsRequest indicates an expected call of ListObjectVersionsRequest. func (mr *MockS3APIMockRecorder) ListObjectVersionsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectVersionsRequest", reflect.TypeOf((*MockS3API)(nil).ListObjectVersionsRequest), arg0) } -// ListObjectVersionsWithContext mocks base method +// ListObjectVersionsWithContext mocks base method. func (m *MockS3API) ListObjectVersionsWithContext(arg0 context.Context, arg1 *s3.ListObjectVersionsInput, arg2 ...request.Option) (*s3.ListObjectVersionsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -2997,14 +3147,14 @@ func (m *MockS3API) ListObjectVersionsWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// ListObjectVersionsWithContext indicates an expected call of ListObjectVersionsWithContext +// ListObjectVersionsWithContext indicates an expected call of ListObjectVersionsWithContext. func (mr *MockS3APIMockRecorder) ListObjectVersionsWithContext(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, "ListObjectVersionsWithContext", reflect.TypeOf((*MockS3API)(nil).ListObjectVersionsWithContext), varargs...) } -// ListObjects mocks base method +// ListObjects mocks base method. func (m *MockS3API) ListObjects(arg0 *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjects", arg0) @@ -3013,13 +3163,13 @@ func (m *MockS3API) ListObjects(arg0 *s3.ListObjectsInput) (*s3.ListObjectsOutpu return ret0, ret1 } -// ListObjects indicates an expected call of ListObjects +// ListObjects indicates an expected call of ListObjects. func (mr *MockS3APIMockRecorder) ListObjects(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjects", reflect.TypeOf((*MockS3API)(nil).ListObjects), arg0) } -// ListObjectsPages mocks base method +// ListObjectsPages mocks base method. func (m *MockS3API) ListObjectsPages(arg0 *s3.ListObjectsInput, arg1 func(*s3.ListObjectsOutput, bool) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectsPages", arg0, arg1) @@ -3027,13 +3177,13 @@ func (m *MockS3API) ListObjectsPages(arg0 *s3.ListObjectsInput, arg1 func(*s3.Li return ret0 } -// ListObjectsPages indicates an expected call of ListObjectsPages +// ListObjectsPages indicates an expected call of ListObjectsPages. func (mr *MockS3APIMockRecorder) ListObjectsPages(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsPages", reflect.TypeOf((*MockS3API)(nil).ListObjectsPages), arg0, arg1) } -// ListObjectsPagesWithContext mocks base method +// ListObjectsPagesWithContext mocks base method. func (m *MockS3API) ListObjectsPagesWithContext(arg0 context.Context, arg1 *s3.ListObjectsInput, arg2 func(*s3.ListObjectsOutput, bool) bool, arg3 ...request.Option) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1, arg2} @@ -3045,14 +3195,14 @@ func (m *MockS3API) ListObjectsPagesWithContext(arg0 context.Context, arg1 *s3.L return ret0 } -// ListObjectsPagesWithContext indicates an expected call of ListObjectsPagesWithContext +// ListObjectsPagesWithContext indicates an expected call of ListObjectsPagesWithContext. func (mr *MockS3APIMockRecorder) ListObjectsPagesWithContext(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsPagesWithContext", reflect.TypeOf((*MockS3API)(nil).ListObjectsPagesWithContext), varargs...) } -// ListObjectsRequest mocks base method +// ListObjectsRequest mocks base method. func (m *MockS3API) ListObjectsRequest(arg0 *s3.ListObjectsInput) (*request.Request, *s3.ListObjectsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectsRequest", arg0) @@ -3061,13 +3211,13 @@ func (m *MockS3API) ListObjectsRequest(arg0 *s3.ListObjectsInput) (*request.Requ return ret0, ret1 } -// ListObjectsRequest indicates an expected call of ListObjectsRequest +// ListObjectsRequest indicates an expected call of ListObjectsRequest. func (mr *MockS3APIMockRecorder) ListObjectsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsRequest", reflect.TypeOf((*MockS3API)(nil).ListObjectsRequest), arg0) } -// ListObjectsV2 mocks base method +// ListObjectsV2 mocks base method. func (m *MockS3API) ListObjectsV2(arg0 *s3.ListObjectsV2Input) (*s3.ListObjectsV2Output, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectsV2", arg0) @@ -3076,13 +3226,13 @@ func (m *MockS3API) ListObjectsV2(arg0 *s3.ListObjectsV2Input) (*s3.ListObjectsV return ret0, ret1 } -// ListObjectsV2 indicates an expected call of ListObjectsV2 +// ListObjectsV2 indicates an expected call of ListObjectsV2. func (mr *MockS3APIMockRecorder) ListObjectsV2(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsV2", reflect.TypeOf((*MockS3API)(nil).ListObjectsV2), arg0) } -// ListObjectsV2Pages mocks base method +// ListObjectsV2Pages mocks base method. func (m *MockS3API) ListObjectsV2Pages(arg0 *s3.ListObjectsV2Input, arg1 func(*s3.ListObjectsV2Output, bool) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectsV2Pages", arg0, arg1) @@ -3090,13 +3240,13 @@ func (m *MockS3API) ListObjectsV2Pages(arg0 *s3.ListObjectsV2Input, arg1 func(*s return ret0 } -// ListObjectsV2Pages indicates an expected call of ListObjectsV2Pages +// ListObjectsV2Pages indicates an expected call of ListObjectsV2Pages. func (mr *MockS3APIMockRecorder) ListObjectsV2Pages(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsV2Pages", reflect.TypeOf((*MockS3API)(nil).ListObjectsV2Pages), arg0, arg1) } -// ListObjectsV2PagesWithContext mocks base method +// ListObjectsV2PagesWithContext mocks base method. func (m *MockS3API) ListObjectsV2PagesWithContext(arg0 context.Context, arg1 *s3.ListObjectsV2Input, arg2 func(*s3.ListObjectsV2Output, bool) bool, arg3 ...request.Option) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1, arg2} @@ -3108,14 +3258,14 @@ func (m *MockS3API) ListObjectsV2PagesWithContext(arg0 context.Context, arg1 *s3 return ret0 } -// ListObjectsV2PagesWithContext indicates an expected call of ListObjectsV2PagesWithContext +// ListObjectsV2PagesWithContext indicates an expected call of ListObjectsV2PagesWithContext. func (mr *MockS3APIMockRecorder) ListObjectsV2PagesWithContext(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsV2PagesWithContext", reflect.TypeOf((*MockS3API)(nil).ListObjectsV2PagesWithContext), varargs...) } -// ListObjectsV2Request mocks base method +// ListObjectsV2Request mocks base method. func (m *MockS3API) ListObjectsV2Request(arg0 *s3.ListObjectsV2Input) (*request.Request, *s3.ListObjectsV2Output) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListObjectsV2Request", arg0) @@ -3124,13 +3274,13 @@ func (m *MockS3API) ListObjectsV2Request(arg0 *s3.ListObjectsV2Input) (*request. return ret0, ret1 } -// ListObjectsV2Request indicates an expected call of ListObjectsV2Request +// ListObjectsV2Request indicates an expected call of ListObjectsV2Request. func (mr *MockS3APIMockRecorder) ListObjectsV2Request(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListObjectsV2Request", reflect.TypeOf((*MockS3API)(nil).ListObjectsV2Request), arg0) } -// ListObjectsV2WithContext mocks base method +// ListObjectsV2WithContext mocks base method. func (m *MockS3API) ListObjectsV2WithContext(arg0 context.Context, arg1 *s3.ListObjectsV2Input, arg2 ...request.Option) (*s3.ListObjectsV2Output, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3143,14 +3293,14 @@ func (m *MockS3API) ListObjectsV2WithContext(arg0 context.Context, arg1 *s3.List return ret0, ret1 } -// ListObjectsV2WithContext indicates an expected call of ListObjectsV2WithContext +// ListObjectsV2WithContext indicates an expected call of ListObjectsV2WithContext. func (mr *MockS3APIMockRecorder) ListObjectsV2WithContext(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, "ListObjectsV2WithContext", reflect.TypeOf((*MockS3API)(nil).ListObjectsV2WithContext), varargs...) } -// ListObjectsWithContext mocks base method +// ListObjectsWithContext mocks base method. func (m *MockS3API) ListObjectsWithContext(arg0 context.Context, arg1 *s3.ListObjectsInput, arg2 ...request.Option) (*s3.ListObjectsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3163,14 +3313,14 @@ func (m *MockS3API) ListObjectsWithContext(arg0 context.Context, arg1 *s3.ListOb return ret0, ret1 } -// ListObjectsWithContext indicates an expected call of ListObjectsWithContext +// ListObjectsWithContext indicates an expected call of ListObjectsWithContext. func (mr *MockS3APIMockRecorder) ListObjectsWithContext(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, "ListObjectsWithContext", reflect.TypeOf((*MockS3API)(nil).ListObjectsWithContext), varargs...) } -// ListParts mocks base method +// ListParts mocks base method. func (m *MockS3API) ListParts(arg0 *s3.ListPartsInput) (*s3.ListPartsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListParts", arg0) @@ -3179,13 +3329,13 @@ func (m *MockS3API) ListParts(arg0 *s3.ListPartsInput) (*s3.ListPartsOutput, err return ret0, ret1 } -// ListParts indicates an expected call of ListParts +// ListParts indicates an expected call of ListParts. func (mr *MockS3APIMockRecorder) ListParts(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListParts", reflect.TypeOf((*MockS3API)(nil).ListParts), arg0) } -// ListPartsPages mocks base method +// ListPartsPages mocks base method. func (m *MockS3API) ListPartsPages(arg0 *s3.ListPartsInput, arg1 func(*s3.ListPartsOutput, bool) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListPartsPages", arg0, arg1) @@ -3193,13 +3343,13 @@ func (m *MockS3API) ListPartsPages(arg0 *s3.ListPartsInput, arg1 func(*s3.ListPa return ret0 } -// ListPartsPages indicates an expected call of ListPartsPages +// ListPartsPages indicates an expected call of ListPartsPages. func (mr *MockS3APIMockRecorder) ListPartsPages(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPartsPages", reflect.TypeOf((*MockS3API)(nil).ListPartsPages), arg0, arg1) } -// ListPartsPagesWithContext mocks base method +// ListPartsPagesWithContext mocks base method. func (m *MockS3API) ListPartsPagesWithContext(arg0 context.Context, arg1 *s3.ListPartsInput, arg2 func(*s3.ListPartsOutput, bool) bool, arg3 ...request.Option) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1, arg2} @@ -3211,14 +3361,14 @@ func (m *MockS3API) ListPartsPagesWithContext(arg0 context.Context, arg1 *s3.Lis return ret0 } -// ListPartsPagesWithContext indicates an expected call of ListPartsPagesWithContext +// ListPartsPagesWithContext indicates an expected call of ListPartsPagesWithContext. func (mr *MockS3APIMockRecorder) ListPartsPagesWithContext(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPartsPagesWithContext", reflect.TypeOf((*MockS3API)(nil).ListPartsPagesWithContext), varargs...) } -// ListPartsRequest mocks base method +// ListPartsRequest mocks base method. func (m *MockS3API) ListPartsRequest(arg0 *s3.ListPartsInput) (*request.Request, *s3.ListPartsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ListPartsRequest", arg0) @@ -3227,13 +3377,13 @@ func (m *MockS3API) ListPartsRequest(arg0 *s3.ListPartsInput) (*request.Request, return ret0, ret1 } -// ListPartsRequest indicates an expected call of ListPartsRequest +// ListPartsRequest indicates an expected call of ListPartsRequest. func (mr *MockS3APIMockRecorder) ListPartsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListPartsRequest", reflect.TypeOf((*MockS3API)(nil).ListPartsRequest), arg0) } -// ListPartsWithContext mocks base method +// ListPartsWithContext mocks base method. func (m *MockS3API) ListPartsWithContext(arg0 context.Context, arg1 *s3.ListPartsInput, arg2 ...request.Option) (*s3.ListPartsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3246,14 +3396,14 @@ func (m *MockS3API) ListPartsWithContext(arg0 context.Context, arg1 *s3.ListPart return ret0, ret1 } -// ListPartsWithContext indicates an expected call of ListPartsWithContext +// ListPartsWithContext indicates an expected call of ListPartsWithContext. func (mr *MockS3APIMockRecorder) ListPartsWithContext(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, "ListPartsWithContext", reflect.TypeOf((*MockS3API)(nil).ListPartsWithContext), varargs...) } -// PutBucketAccelerateConfiguration mocks base method +// PutBucketAccelerateConfiguration mocks base method. func (m *MockS3API) PutBucketAccelerateConfiguration(arg0 *s3.PutBucketAccelerateConfigurationInput) (*s3.PutBucketAccelerateConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketAccelerateConfiguration", arg0) @@ -3262,13 +3412,13 @@ func (m *MockS3API) PutBucketAccelerateConfiguration(arg0 *s3.PutBucketAccelerat return ret0, ret1 } -// PutBucketAccelerateConfiguration indicates an expected call of PutBucketAccelerateConfiguration +// PutBucketAccelerateConfiguration indicates an expected call of PutBucketAccelerateConfiguration. func (mr *MockS3APIMockRecorder) PutBucketAccelerateConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketAccelerateConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketAccelerateConfiguration), arg0) } -// PutBucketAccelerateConfigurationRequest mocks base method +// PutBucketAccelerateConfigurationRequest mocks base method. func (m *MockS3API) PutBucketAccelerateConfigurationRequest(arg0 *s3.PutBucketAccelerateConfigurationInput) (*request.Request, *s3.PutBucketAccelerateConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketAccelerateConfigurationRequest", arg0) @@ -3277,13 +3427,13 @@ func (m *MockS3API) PutBucketAccelerateConfigurationRequest(arg0 *s3.PutBucketAc return ret0, ret1 } -// PutBucketAccelerateConfigurationRequest indicates an expected call of PutBucketAccelerateConfigurationRequest +// PutBucketAccelerateConfigurationRequest indicates an expected call of PutBucketAccelerateConfigurationRequest. func (mr *MockS3APIMockRecorder) PutBucketAccelerateConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketAccelerateConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketAccelerateConfigurationRequest), arg0) } -// PutBucketAccelerateConfigurationWithContext mocks base method +// PutBucketAccelerateConfigurationWithContext mocks base method. func (m *MockS3API) PutBucketAccelerateConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketAccelerateConfigurationInput, arg2 ...request.Option) (*s3.PutBucketAccelerateConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3296,14 +3446,14 @@ func (m *MockS3API) PutBucketAccelerateConfigurationWithContext(arg0 context.Con return ret0, ret1 } -// PutBucketAccelerateConfigurationWithContext indicates an expected call of PutBucketAccelerateConfigurationWithContext +// PutBucketAccelerateConfigurationWithContext indicates an expected call of PutBucketAccelerateConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutBucketAccelerateConfigurationWithContext(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, "PutBucketAccelerateConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketAccelerateConfigurationWithContext), varargs...) } -// PutBucketAcl mocks base method +// PutBucketAcl mocks base method. func (m *MockS3API) PutBucketAcl(arg0 *s3.PutBucketAclInput) (*s3.PutBucketAclOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketAcl", arg0) @@ -3312,13 +3462,13 @@ func (m *MockS3API) PutBucketAcl(arg0 *s3.PutBucketAclInput) (*s3.PutBucketAclOu return ret0, ret1 } -// PutBucketAcl indicates an expected call of PutBucketAcl +// PutBucketAcl indicates an expected call of PutBucketAcl. func (mr *MockS3APIMockRecorder) PutBucketAcl(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketAcl", reflect.TypeOf((*MockS3API)(nil).PutBucketAcl), arg0) } -// PutBucketAclRequest mocks base method +// PutBucketAclRequest mocks base method. func (m *MockS3API) PutBucketAclRequest(arg0 *s3.PutBucketAclInput) (*request.Request, *s3.PutBucketAclOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketAclRequest", arg0) @@ -3327,13 +3477,13 @@ func (m *MockS3API) PutBucketAclRequest(arg0 *s3.PutBucketAclInput) (*request.Re return ret0, ret1 } -// PutBucketAclRequest indicates an expected call of PutBucketAclRequest +// PutBucketAclRequest indicates an expected call of PutBucketAclRequest. func (mr *MockS3APIMockRecorder) PutBucketAclRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketAclRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketAclRequest), arg0) } -// PutBucketAclWithContext mocks base method +// PutBucketAclWithContext mocks base method. func (m *MockS3API) PutBucketAclWithContext(arg0 context.Context, arg1 *s3.PutBucketAclInput, arg2 ...request.Option) (*s3.PutBucketAclOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3346,14 +3496,14 @@ func (m *MockS3API) PutBucketAclWithContext(arg0 context.Context, arg1 *s3.PutBu return ret0, ret1 } -// PutBucketAclWithContext indicates an expected call of PutBucketAclWithContext +// PutBucketAclWithContext indicates an expected call of PutBucketAclWithContext. func (mr *MockS3APIMockRecorder) PutBucketAclWithContext(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, "PutBucketAclWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketAclWithContext), varargs...) } -// PutBucketAnalyticsConfiguration mocks base method +// PutBucketAnalyticsConfiguration mocks base method. func (m *MockS3API) PutBucketAnalyticsConfiguration(arg0 *s3.PutBucketAnalyticsConfigurationInput) (*s3.PutBucketAnalyticsConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketAnalyticsConfiguration", arg0) @@ -3362,13 +3512,13 @@ func (m *MockS3API) PutBucketAnalyticsConfiguration(arg0 *s3.PutBucketAnalyticsC return ret0, ret1 } -// PutBucketAnalyticsConfiguration indicates an expected call of PutBucketAnalyticsConfiguration +// PutBucketAnalyticsConfiguration indicates an expected call of PutBucketAnalyticsConfiguration. func (mr *MockS3APIMockRecorder) PutBucketAnalyticsConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketAnalyticsConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketAnalyticsConfiguration), arg0) } -// PutBucketAnalyticsConfigurationRequest mocks base method +// PutBucketAnalyticsConfigurationRequest mocks base method. func (m *MockS3API) PutBucketAnalyticsConfigurationRequest(arg0 *s3.PutBucketAnalyticsConfigurationInput) (*request.Request, *s3.PutBucketAnalyticsConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketAnalyticsConfigurationRequest", arg0) @@ -3377,13 +3527,13 @@ func (m *MockS3API) PutBucketAnalyticsConfigurationRequest(arg0 *s3.PutBucketAna return ret0, ret1 } -// PutBucketAnalyticsConfigurationRequest indicates an expected call of PutBucketAnalyticsConfigurationRequest +// PutBucketAnalyticsConfigurationRequest indicates an expected call of PutBucketAnalyticsConfigurationRequest. func (mr *MockS3APIMockRecorder) PutBucketAnalyticsConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketAnalyticsConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketAnalyticsConfigurationRequest), arg0) } -// PutBucketAnalyticsConfigurationWithContext mocks base method +// PutBucketAnalyticsConfigurationWithContext mocks base method. func (m *MockS3API) PutBucketAnalyticsConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketAnalyticsConfigurationInput, arg2 ...request.Option) (*s3.PutBucketAnalyticsConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3396,14 +3546,14 @@ func (m *MockS3API) PutBucketAnalyticsConfigurationWithContext(arg0 context.Cont return ret0, ret1 } -// PutBucketAnalyticsConfigurationWithContext indicates an expected call of PutBucketAnalyticsConfigurationWithContext +// PutBucketAnalyticsConfigurationWithContext indicates an expected call of PutBucketAnalyticsConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutBucketAnalyticsConfigurationWithContext(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, "PutBucketAnalyticsConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketAnalyticsConfigurationWithContext), varargs...) } -// PutBucketCors mocks base method +// PutBucketCors mocks base method. func (m *MockS3API) PutBucketCors(arg0 *s3.PutBucketCorsInput) (*s3.PutBucketCorsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketCors", arg0) @@ -3412,13 +3562,13 @@ func (m *MockS3API) PutBucketCors(arg0 *s3.PutBucketCorsInput) (*s3.PutBucketCor return ret0, ret1 } -// PutBucketCors indicates an expected call of PutBucketCors +// PutBucketCors indicates an expected call of PutBucketCors. func (mr *MockS3APIMockRecorder) PutBucketCors(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketCors", reflect.TypeOf((*MockS3API)(nil).PutBucketCors), arg0) } -// PutBucketCorsRequest mocks base method +// PutBucketCorsRequest mocks base method. func (m *MockS3API) PutBucketCorsRequest(arg0 *s3.PutBucketCorsInput) (*request.Request, *s3.PutBucketCorsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketCorsRequest", arg0) @@ -3427,13 +3577,13 @@ func (m *MockS3API) PutBucketCorsRequest(arg0 *s3.PutBucketCorsInput) (*request. return ret0, ret1 } -// PutBucketCorsRequest indicates an expected call of PutBucketCorsRequest +// PutBucketCorsRequest indicates an expected call of PutBucketCorsRequest. func (mr *MockS3APIMockRecorder) PutBucketCorsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketCorsRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketCorsRequest), arg0) } -// PutBucketCorsWithContext mocks base method +// PutBucketCorsWithContext mocks base method. func (m *MockS3API) PutBucketCorsWithContext(arg0 context.Context, arg1 *s3.PutBucketCorsInput, arg2 ...request.Option) (*s3.PutBucketCorsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3446,14 +3596,14 @@ func (m *MockS3API) PutBucketCorsWithContext(arg0 context.Context, arg1 *s3.PutB return ret0, ret1 } -// PutBucketCorsWithContext indicates an expected call of PutBucketCorsWithContext +// PutBucketCorsWithContext indicates an expected call of PutBucketCorsWithContext. func (mr *MockS3APIMockRecorder) PutBucketCorsWithContext(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, "PutBucketCorsWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketCorsWithContext), varargs...) } -// PutBucketEncryption mocks base method +// PutBucketEncryption mocks base method. func (m *MockS3API) PutBucketEncryption(arg0 *s3.PutBucketEncryptionInput) (*s3.PutBucketEncryptionOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketEncryption", arg0) @@ -3462,13 +3612,13 @@ func (m *MockS3API) PutBucketEncryption(arg0 *s3.PutBucketEncryptionInput) (*s3. return ret0, ret1 } -// PutBucketEncryption indicates an expected call of PutBucketEncryption +// PutBucketEncryption indicates an expected call of PutBucketEncryption. func (mr *MockS3APIMockRecorder) PutBucketEncryption(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketEncryption", reflect.TypeOf((*MockS3API)(nil).PutBucketEncryption), arg0) } -// PutBucketEncryptionRequest mocks base method +// PutBucketEncryptionRequest mocks base method. func (m *MockS3API) PutBucketEncryptionRequest(arg0 *s3.PutBucketEncryptionInput) (*request.Request, *s3.PutBucketEncryptionOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketEncryptionRequest", arg0) @@ -3477,13 +3627,13 @@ func (m *MockS3API) PutBucketEncryptionRequest(arg0 *s3.PutBucketEncryptionInput return ret0, ret1 } -// PutBucketEncryptionRequest indicates an expected call of PutBucketEncryptionRequest +// PutBucketEncryptionRequest indicates an expected call of PutBucketEncryptionRequest. func (mr *MockS3APIMockRecorder) PutBucketEncryptionRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketEncryptionRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketEncryptionRequest), arg0) } -// PutBucketEncryptionWithContext mocks base method +// PutBucketEncryptionWithContext mocks base method. func (m *MockS3API) PutBucketEncryptionWithContext(arg0 context.Context, arg1 *s3.PutBucketEncryptionInput, arg2 ...request.Option) (*s3.PutBucketEncryptionOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3496,14 +3646,64 @@ func (m *MockS3API) PutBucketEncryptionWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// PutBucketEncryptionWithContext indicates an expected call of PutBucketEncryptionWithContext +// PutBucketEncryptionWithContext indicates an expected call of PutBucketEncryptionWithContext. func (mr *MockS3APIMockRecorder) PutBucketEncryptionWithContext(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, "PutBucketEncryptionWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketEncryptionWithContext), varargs...) } -// PutBucketInventoryConfiguration mocks base method +// PutBucketIntelligentTieringConfiguration mocks base method. +func (m *MockS3API) PutBucketIntelligentTieringConfiguration(arg0 *s3.PutBucketIntelligentTieringConfigurationInput) (*s3.PutBucketIntelligentTieringConfigurationOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutBucketIntelligentTieringConfiguration", arg0) + ret0, _ := ret[0].(*s3.PutBucketIntelligentTieringConfigurationOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutBucketIntelligentTieringConfiguration indicates an expected call of PutBucketIntelligentTieringConfiguration. +func (mr *MockS3APIMockRecorder) PutBucketIntelligentTieringConfiguration(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketIntelligentTieringConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketIntelligentTieringConfiguration), arg0) +} + +// PutBucketIntelligentTieringConfigurationRequest mocks base method. +func (m *MockS3API) PutBucketIntelligentTieringConfigurationRequest(arg0 *s3.PutBucketIntelligentTieringConfigurationInput) (*request.Request, *s3.PutBucketIntelligentTieringConfigurationOutput) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PutBucketIntelligentTieringConfigurationRequest", arg0) + ret0, _ := ret[0].(*request.Request) + ret1, _ := ret[1].(*s3.PutBucketIntelligentTieringConfigurationOutput) + return ret0, ret1 +} + +// PutBucketIntelligentTieringConfigurationRequest indicates an expected call of PutBucketIntelligentTieringConfigurationRequest. +func (mr *MockS3APIMockRecorder) PutBucketIntelligentTieringConfigurationRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketIntelligentTieringConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketIntelligentTieringConfigurationRequest), arg0) +} + +// PutBucketIntelligentTieringConfigurationWithContext mocks base method. +func (m *MockS3API) PutBucketIntelligentTieringConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketIntelligentTieringConfigurationInput, arg2 ...request.Option) (*s3.PutBucketIntelligentTieringConfigurationOutput, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PutBucketIntelligentTieringConfigurationWithContext", varargs...) + ret0, _ := ret[0].(*s3.PutBucketIntelligentTieringConfigurationOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PutBucketIntelligentTieringConfigurationWithContext indicates an expected call of PutBucketIntelligentTieringConfigurationWithContext. +func (mr *MockS3APIMockRecorder) PutBucketIntelligentTieringConfigurationWithContext(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, "PutBucketIntelligentTieringConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketIntelligentTieringConfigurationWithContext), varargs...) +} + +// PutBucketInventoryConfiguration mocks base method. func (m *MockS3API) PutBucketInventoryConfiguration(arg0 *s3.PutBucketInventoryConfigurationInput) (*s3.PutBucketInventoryConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketInventoryConfiguration", arg0) @@ -3512,13 +3712,13 @@ func (m *MockS3API) PutBucketInventoryConfiguration(arg0 *s3.PutBucketInventoryC return ret0, ret1 } -// PutBucketInventoryConfiguration indicates an expected call of PutBucketInventoryConfiguration +// PutBucketInventoryConfiguration indicates an expected call of PutBucketInventoryConfiguration. func (mr *MockS3APIMockRecorder) PutBucketInventoryConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketInventoryConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketInventoryConfiguration), arg0) } -// PutBucketInventoryConfigurationRequest mocks base method +// PutBucketInventoryConfigurationRequest mocks base method. func (m *MockS3API) PutBucketInventoryConfigurationRequest(arg0 *s3.PutBucketInventoryConfigurationInput) (*request.Request, *s3.PutBucketInventoryConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketInventoryConfigurationRequest", arg0) @@ -3527,13 +3727,13 @@ func (m *MockS3API) PutBucketInventoryConfigurationRequest(arg0 *s3.PutBucketInv return ret0, ret1 } -// PutBucketInventoryConfigurationRequest indicates an expected call of PutBucketInventoryConfigurationRequest +// PutBucketInventoryConfigurationRequest indicates an expected call of PutBucketInventoryConfigurationRequest. func (mr *MockS3APIMockRecorder) PutBucketInventoryConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketInventoryConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketInventoryConfigurationRequest), arg0) } -// PutBucketInventoryConfigurationWithContext mocks base method +// PutBucketInventoryConfigurationWithContext mocks base method. func (m *MockS3API) PutBucketInventoryConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketInventoryConfigurationInput, arg2 ...request.Option) (*s3.PutBucketInventoryConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3546,14 +3746,14 @@ func (m *MockS3API) PutBucketInventoryConfigurationWithContext(arg0 context.Cont return ret0, ret1 } -// PutBucketInventoryConfigurationWithContext indicates an expected call of PutBucketInventoryConfigurationWithContext +// PutBucketInventoryConfigurationWithContext indicates an expected call of PutBucketInventoryConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutBucketInventoryConfigurationWithContext(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, "PutBucketInventoryConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketInventoryConfigurationWithContext), varargs...) } -// PutBucketLifecycle mocks base method +// PutBucketLifecycle mocks base method. func (m *MockS3API) PutBucketLifecycle(arg0 *s3.PutBucketLifecycleInput) (*s3.PutBucketLifecycleOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketLifecycle", arg0) @@ -3562,13 +3762,13 @@ func (m *MockS3API) PutBucketLifecycle(arg0 *s3.PutBucketLifecycleInput) (*s3.Pu return ret0, ret1 } -// PutBucketLifecycle indicates an expected call of PutBucketLifecycle +// PutBucketLifecycle indicates an expected call of PutBucketLifecycle. func (mr *MockS3APIMockRecorder) PutBucketLifecycle(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketLifecycle", reflect.TypeOf((*MockS3API)(nil).PutBucketLifecycle), arg0) } -// PutBucketLifecycleConfiguration mocks base method +// PutBucketLifecycleConfiguration mocks base method. func (m *MockS3API) PutBucketLifecycleConfiguration(arg0 *s3.PutBucketLifecycleConfigurationInput) (*s3.PutBucketLifecycleConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketLifecycleConfiguration", arg0) @@ -3577,13 +3777,13 @@ func (m *MockS3API) PutBucketLifecycleConfiguration(arg0 *s3.PutBucketLifecycleC return ret0, ret1 } -// PutBucketLifecycleConfiguration indicates an expected call of PutBucketLifecycleConfiguration +// PutBucketLifecycleConfiguration indicates an expected call of PutBucketLifecycleConfiguration. func (mr *MockS3APIMockRecorder) PutBucketLifecycleConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketLifecycleConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketLifecycleConfiguration), arg0) } -// PutBucketLifecycleConfigurationRequest mocks base method +// PutBucketLifecycleConfigurationRequest mocks base method. func (m *MockS3API) PutBucketLifecycleConfigurationRequest(arg0 *s3.PutBucketLifecycleConfigurationInput) (*request.Request, *s3.PutBucketLifecycleConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketLifecycleConfigurationRequest", arg0) @@ -3592,13 +3792,13 @@ func (m *MockS3API) PutBucketLifecycleConfigurationRequest(arg0 *s3.PutBucketLif return ret0, ret1 } -// PutBucketLifecycleConfigurationRequest indicates an expected call of PutBucketLifecycleConfigurationRequest +// PutBucketLifecycleConfigurationRequest indicates an expected call of PutBucketLifecycleConfigurationRequest. func (mr *MockS3APIMockRecorder) PutBucketLifecycleConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketLifecycleConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketLifecycleConfigurationRequest), arg0) } -// PutBucketLifecycleConfigurationWithContext mocks base method +// PutBucketLifecycleConfigurationWithContext mocks base method. func (m *MockS3API) PutBucketLifecycleConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketLifecycleConfigurationInput, arg2 ...request.Option) (*s3.PutBucketLifecycleConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3611,14 +3811,14 @@ func (m *MockS3API) PutBucketLifecycleConfigurationWithContext(arg0 context.Cont return ret0, ret1 } -// PutBucketLifecycleConfigurationWithContext indicates an expected call of PutBucketLifecycleConfigurationWithContext +// PutBucketLifecycleConfigurationWithContext indicates an expected call of PutBucketLifecycleConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutBucketLifecycleConfigurationWithContext(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, "PutBucketLifecycleConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketLifecycleConfigurationWithContext), varargs...) } -// PutBucketLifecycleRequest mocks base method +// PutBucketLifecycleRequest mocks base method. func (m *MockS3API) PutBucketLifecycleRequest(arg0 *s3.PutBucketLifecycleInput) (*request.Request, *s3.PutBucketLifecycleOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketLifecycleRequest", arg0) @@ -3627,13 +3827,13 @@ func (m *MockS3API) PutBucketLifecycleRequest(arg0 *s3.PutBucketLifecycleInput) return ret0, ret1 } -// PutBucketLifecycleRequest indicates an expected call of PutBucketLifecycleRequest +// PutBucketLifecycleRequest indicates an expected call of PutBucketLifecycleRequest. func (mr *MockS3APIMockRecorder) PutBucketLifecycleRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketLifecycleRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketLifecycleRequest), arg0) } -// PutBucketLifecycleWithContext mocks base method +// PutBucketLifecycleWithContext mocks base method. func (m *MockS3API) PutBucketLifecycleWithContext(arg0 context.Context, arg1 *s3.PutBucketLifecycleInput, arg2 ...request.Option) (*s3.PutBucketLifecycleOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3646,14 +3846,14 @@ func (m *MockS3API) PutBucketLifecycleWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// PutBucketLifecycleWithContext indicates an expected call of PutBucketLifecycleWithContext +// PutBucketLifecycleWithContext indicates an expected call of PutBucketLifecycleWithContext. func (mr *MockS3APIMockRecorder) PutBucketLifecycleWithContext(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, "PutBucketLifecycleWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketLifecycleWithContext), varargs...) } -// PutBucketLogging mocks base method +// PutBucketLogging mocks base method. func (m *MockS3API) PutBucketLogging(arg0 *s3.PutBucketLoggingInput) (*s3.PutBucketLoggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketLogging", arg0) @@ -3662,13 +3862,13 @@ func (m *MockS3API) PutBucketLogging(arg0 *s3.PutBucketLoggingInput) (*s3.PutBuc return ret0, ret1 } -// PutBucketLogging indicates an expected call of PutBucketLogging +// PutBucketLogging indicates an expected call of PutBucketLogging. func (mr *MockS3APIMockRecorder) PutBucketLogging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketLogging", reflect.TypeOf((*MockS3API)(nil).PutBucketLogging), arg0) } -// PutBucketLoggingRequest mocks base method +// PutBucketLoggingRequest mocks base method. func (m *MockS3API) PutBucketLoggingRequest(arg0 *s3.PutBucketLoggingInput) (*request.Request, *s3.PutBucketLoggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketLoggingRequest", arg0) @@ -3677,13 +3877,13 @@ func (m *MockS3API) PutBucketLoggingRequest(arg0 *s3.PutBucketLoggingInput) (*re return ret0, ret1 } -// PutBucketLoggingRequest indicates an expected call of PutBucketLoggingRequest +// PutBucketLoggingRequest indicates an expected call of PutBucketLoggingRequest. func (mr *MockS3APIMockRecorder) PutBucketLoggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketLoggingRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketLoggingRequest), arg0) } -// PutBucketLoggingWithContext mocks base method +// PutBucketLoggingWithContext mocks base method. func (m *MockS3API) PutBucketLoggingWithContext(arg0 context.Context, arg1 *s3.PutBucketLoggingInput, arg2 ...request.Option) (*s3.PutBucketLoggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3696,14 +3896,14 @@ func (m *MockS3API) PutBucketLoggingWithContext(arg0 context.Context, arg1 *s3.P return ret0, ret1 } -// PutBucketLoggingWithContext indicates an expected call of PutBucketLoggingWithContext +// PutBucketLoggingWithContext indicates an expected call of PutBucketLoggingWithContext. func (mr *MockS3APIMockRecorder) PutBucketLoggingWithContext(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, "PutBucketLoggingWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketLoggingWithContext), varargs...) } -// PutBucketMetricsConfiguration mocks base method +// PutBucketMetricsConfiguration mocks base method. func (m *MockS3API) PutBucketMetricsConfiguration(arg0 *s3.PutBucketMetricsConfigurationInput) (*s3.PutBucketMetricsConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketMetricsConfiguration", arg0) @@ -3712,13 +3912,13 @@ func (m *MockS3API) PutBucketMetricsConfiguration(arg0 *s3.PutBucketMetricsConfi return ret0, ret1 } -// PutBucketMetricsConfiguration indicates an expected call of PutBucketMetricsConfiguration +// PutBucketMetricsConfiguration indicates an expected call of PutBucketMetricsConfiguration. func (mr *MockS3APIMockRecorder) PutBucketMetricsConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketMetricsConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketMetricsConfiguration), arg0) } -// PutBucketMetricsConfigurationRequest mocks base method +// PutBucketMetricsConfigurationRequest mocks base method. func (m *MockS3API) PutBucketMetricsConfigurationRequest(arg0 *s3.PutBucketMetricsConfigurationInput) (*request.Request, *s3.PutBucketMetricsConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketMetricsConfigurationRequest", arg0) @@ -3727,13 +3927,13 @@ func (m *MockS3API) PutBucketMetricsConfigurationRequest(arg0 *s3.PutBucketMetri return ret0, ret1 } -// PutBucketMetricsConfigurationRequest indicates an expected call of PutBucketMetricsConfigurationRequest +// PutBucketMetricsConfigurationRequest indicates an expected call of PutBucketMetricsConfigurationRequest. func (mr *MockS3APIMockRecorder) PutBucketMetricsConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketMetricsConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketMetricsConfigurationRequest), arg0) } -// PutBucketMetricsConfigurationWithContext mocks base method +// PutBucketMetricsConfigurationWithContext mocks base method. func (m *MockS3API) PutBucketMetricsConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketMetricsConfigurationInput, arg2 ...request.Option) (*s3.PutBucketMetricsConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3746,14 +3946,14 @@ func (m *MockS3API) PutBucketMetricsConfigurationWithContext(arg0 context.Contex return ret0, ret1 } -// PutBucketMetricsConfigurationWithContext indicates an expected call of PutBucketMetricsConfigurationWithContext +// PutBucketMetricsConfigurationWithContext indicates an expected call of PutBucketMetricsConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutBucketMetricsConfigurationWithContext(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, "PutBucketMetricsConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketMetricsConfigurationWithContext), varargs...) } -// PutBucketNotification mocks base method +// PutBucketNotification mocks base method. func (m *MockS3API) PutBucketNotification(arg0 *s3.PutBucketNotificationInput) (*s3.PutBucketNotificationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketNotification", arg0) @@ -3762,13 +3962,13 @@ func (m *MockS3API) PutBucketNotification(arg0 *s3.PutBucketNotificationInput) ( return ret0, ret1 } -// PutBucketNotification indicates an expected call of PutBucketNotification +// PutBucketNotification indicates an expected call of PutBucketNotification. func (mr *MockS3APIMockRecorder) PutBucketNotification(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketNotification", reflect.TypeOf((*MockS3API)(nil).PutBucketNotification), arg0) } -// PutBucketNotificationConfiguration mocks base method +// PutBucketNotificationConfiguration mocks base method. func (m *MockS3API) PutBucketNotificationConfiguration(arg0 *s3.PutBucketNotificationConfigurationInput) (*s3.PutBucketNotificationConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketNotificationConfiguration", arg0) @@ -3777,13 +3977,13 @@ func (m *MockS3API) PutBucketNotificationConfiguration(arg0 *s3.PutBucketNotific return ret0, ret1 } -// PutBucketNotificationConfiguration indicates an expected call of PutBucketNotificationConfiguration +// PutBucketNotificationConfiguration indicates an expected call of PutBucketNotificationConfiguration. func (mr *MockS3APIMockRecorder) PutBucketNotificationConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketNotificationConfiguration", reflect.TypeOf((*MockS3API)(nil).PutBucketNotificationConfiguration), arg0) } -// PutBucketNotificationConfigurationRequest mocks base method +// PutBucketNotificationConfigurationRequest mocks base method. func (m *MockS3API) PutBucketNotificationConfigurationRequest(arg0 *s3.PutBucketNotificationConfigurationInput) (*request.Request, *s3.PutBucketNotificationConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketNotificationConfigurationRequest", arg0) @@ -3792,13 +3992,13 @@ func (m *MockS3API) PutBucketNotificationConfigurationRequest(arg0 *s3.PutBucket return ret0, ret1 } -// PutBucketNotificationConfigurationRequest indicates an expected call of PutBucketNotificationConfigurationRequest +// PutBucketNotificationConfigurationRequest indicates an expected call of PutBucketNotificationConfigurationRequest. func (mr *MockS3APIMockRecorder) PutBucketNotificationConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketNotificationConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketNotificationConfigurationRequest), arg0) } -// PutBucketNotificationConfigurationWithContext mocks base method +// PutBucketNotificationConfigurationWithContext mocks base method. func (m *MockS3API) PutBucketNotificationConfigurationWithContext(arg0 context.Context, arg1 *s3.PutBucketNotificationConfigurationInput, arg2 ...request.Option) (*s3.PutBucketNotificationConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3811,14 +4011,14 @@ func (m *MockS3API) PutBucketNotificationConfigurationWithContext(arg0 context.C return ret0, ret1 } -// PutBucketNotificationConfigurationWithContext indicates an expected call of PutBucketNotificationConfigurationWithContext +// PutBucketNotificationConfigurationWithContext indicates an expected call of PutBucketNotificationConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutBucketNotificationConfigurationWithContext(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, "PutBucketNotificationConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketNotificationConfigurationWithContext), varargs...) } -// PutBucketNotificationRequest mocks base method +// PutBucketNotificationRequest mocks base method. func (m *MockS3API) PutBucketNotificationRequest(arg0 *s3.PutBucketNotificationInput) (*request.Request, *s3.PutBucketNotificationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketNotificationRequest", arg0) @@ -3827,13 +4027,13 @@ func (m *MockS3API) PutBucketNotificationRequest(arg0 *s3.PutBucketNotificationI return ret0, ret1 } -// PutBucketNotificationRequest indicates an expected call of PutBucketNotificationRequest +// PutBucketNotificationRequest indicates an expected call of PutBucketNotificationRequest. func (mr *MockS3APIMockRecorder) PutBucketNotificationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketNotificationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketNotificationRequest), arg0) } -// PutBucketNotificationWithContext mocks base method +// PutBucketNotificationWithContext mocks base method. func (m *MockS3API) PutBucketNotificationWithContext(arg0 context.Context, arg1 *s3.PutBucketNotificationInput, arg2 ...request.Option) (*s3.PutBucketNotificationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3846,14 +4046,14 @@ func (m *MockS3API) PutBucketNotificationWithContext(arg0 context.Context, arg1 return ret0, ret1 } -// PutBucketNotificationWithContext indicates an expected call of PutBucketNotificationWithContext +// PutBucketNotificationWithContext indicates an expected call of PutBucketNotificationWithContext. func (mr *MockS3APIMockRecorder) PutBucketNotificationWithContext(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, "PutBucketNotificationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketNotificationWithContext), varargs...) } -// PutBucketOwnershipControls mocks base method +// PutBucketOwnershipControls mocks base method. func (m *MockS3API) PutBucketOwnershipControls(arg0 *s3.PutBucketOwnershipControlsInput) (*s3.PutBucketOwnershipControlsOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketOwnershipControls", arg0) @@ -3862,13 +4062,13 @@ func (m *MockS3API) PutBucketOwnershipControls(arg0 *s3.PutBucketOwnershipContro return ret0, ret1 } -// PutBucketOwnershipControls indicates an expected call of PutBucketOwnershipControls +// PutBucketOwnershipControls indicates an expected call of PutBucketOwnershipControls. func (mr *MockS3APIMockRecorder) PutBucketOwnershipControls(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketOwnershipControls", reflect.TypeOf((*MockS3API)(nil).PutBucketOwnershipControls), arg0) } -// PutBucketOwnershipControlsRequest mocks base method +// PutBucketOwnershipControlsRequest mocks base method. func (m *MockS3API) PutBucketOwnershipControlsRequest(arg0 *s3.PutBucketOwnershipControlsInput) (*request.Request, *s3.PutBucketOwnershipControlsOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketOwnershipControlsRequest", arg0) @@ -3877,13 +4077,13 @@ func (m *MockS3API) PutBucketOwnershipControlsRequest(arg0 *s3.PutBucketOwnershi return ret0, ret1 } -// PutBucketOwnershipControlsRequest indicates an expected call of PutBucketOwnershipControlsRequest +// PutBucketOwnershipControlsRequest indicates an expected call of PutBucketOwnershipControlsRequest. func (mr *MockS3APIMockRecorder) PutBucketOwnershipControlsRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketOwnershipControlsRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketOwnershipControlsRequest), arg0) } -// PutBucketOwnershipControlsWithContext mocks base method +// PutBucketOwnershipControlsWithContext mocks base method. func (m *MockS3API) PutBucketOwnershipControlsWithContext(arg0 context.Context, arg1 *s3.PutBucketOwnershipControlsInput, arg2 ...request.Option) (*s3.PutBucketOwnershipControlsOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3896,14 +4096,14 @@ func (m *MockS3API) PutBucketOwnershipControlsWithContext(arg0 context.Context, return ret0, ret1 } -// PutBucketOwnershipControlsWithContext indicates an expected call of PutBucketOwnershipControlsWithContext +// PutBucketOwnershipControlsWithContext indicates an expected call of PutBucketOwnershipControlsWithContext. func (mr *MockS3APIMockRecorder) PutBucketOwnershipControlsWithContext(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, "PutBucketOwnershipControlsWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketOwnershipControlsWithContext), varargs...) } -// PutBucketPolicy mocks base method +// PutBucketPolicy mocks base method. func (m *MockS3API) PutBucketPolicy(arg0 *s3.PutBucketPolicyInput) (*s3.PutBucketPolicyOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketPolicy", arg0) @@ -3912,13 +4112,13 @@ func (m *MockS3API) PutBucketPolicy(arg0 *s3.PutBucketPolicyInput) (*s3.PutBucke return ret0, ret1 } -// PutBucketPolicy indicates an expected call of PutBucketPolicy +// PutBucketPolicy indicates an expected call of PutBucketPolicy. func (mr *MockS3APIMockRecorder) PutBucketPolicy(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketPolicy", reflect.TypeOf((*MockS3API)(nil).PutBucketPolicy), arg0) } -// PutBucketPolicyRequest mocks base method +// PutBucketPolicyRequest mocks base method. func (m *MockS3API) PutBucketPolicyRequest(arg0 *s3.PutBucketPolicyInput) (*request.Request, *s3.PutBucketPolicyOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketPolicyRequest", arg0) @@ -3927,13 +4127,13 @@ func (m *MockS3API) PutBucketPolicyRequest(arg0 *s3.PutBucketPolicyInput) (*requ return ret0, ret1 } -// PutBucketPolicyRequest indicates an expected call of PutBucketPolicyRequest +// PutBucketPolicyRequest indicates an expected call of PutBucketPolicyRequest. func (mr *MockS3APIMockRecorder) PutBucketPolicyRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketPolicyRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketPolicyRequest), arg0) } -// PutBucketPolicyWithContext mocks base method +// PutBucketPolicyWithContext mocks base method. func (m *MockS3API) PutBucketPolicyWithContext(arg0 context.Context, arg1 *s3.PutBucketPolicyInput, arg2 ...request.Option) (*s3.PutBucketPolicyOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3946,14 +4146,14 @@ func (m *MockS3API) PutBucketPolicyWithContext(arg0 context.Context, arg1 *s3.Pu return ret0, ret1 } -// PutBucketPolicyWithContext indicates an expected call of PutBucketPolicyWithContext +// PutBucketPolicyWithContext indicates an expected call of PutBucketPolicyWithContext. func (mr *MockS3APIMockRecorder) PutBucketPolicyWithContext(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, "PutBucketPolicyWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketPolicyWithContext), varargs...) } -// PutBucketReplication mocks base method +// PutBucketReplication mocks base method. func (m *MockS3API) PutBucketReplication(arg0 *s3.PutBucketReplicationInput) (*s3.PutBucketReplicationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketReplication", arg0) @@ -3962,13 +4162,13 @@ func (m *MockS3API) PutBucketReplication(arg0 *s3.PutBucketReplicationInput) (*s return ret0, ret1 } -// PutBucketReplication indicates an expected call of PutBucketReplication +// PutBucketReplication indicates an expected call of PutBucketReplication. func (mr *MockS3APIMockRecorder) PutBucketReplication(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketReplication", reflect.TypeOf((*MockS3API)(nil).PutBucketReplication), arg0) } -// PutBucketReplicationRequest mocks base method +// PutBucketReplicationRequest mocks base method. func (m *MockS3API) PutBucketReplicationRequest(arg0 *s3.PutBucketReplicationInput) (*request.Request, *s3.PutBucketReplicationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketReplicationRequest", arg0) @@ -3977,13 +4177,13 @@ func (m *MockS3API) PutBucketReplicationRequest(arg0 *s3.PutBucketReplicationInp return ret0, ret1 } -// PutBucketReplicationRequest indicates an expected call of PutBucketReplicationRequest +// PutBucketReplicationRequest indicates an expected call of PutBucketReplicationRequest. func (mr *MockS3APIMockRecorder) PutBucketReplicationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketReplicationRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketReplicationRequest), arg0) } -// PutBucketReplicationWithContext mocks base method +// PutBucketReplicationWithContext mocks base method. func (m *MockS3API) PutBucketReplicationWithContext(arg0 context.Context, arg1 *s3.PutBucketReplicationInput, arg2 ...request.Option) (*s3.PutBucketReplicationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -3996,14 +4196,14 @@ func (m *MockS3API) PutBucketReplicationWithContext(arg0 context.Context, arg1 * return ret0, ret1 } -// PutBucketReplicationWithContext indicates an expected call of PutBucketReplicationWithContext +// PutBucketReplicationWithContext indicates an expected call of PutBucketReplicationWithContext. func (mr *MockS3APIMockRecorder) PutBucketReplicationWithContext(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, "PutBucketReplicationWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketReplicationWithContext), varargs...) } -// PutBucketRequestPayment mocks base method +// PutBucketRequestPayment mocks base method. func (m *MockS3API) PutBucketRequestPayment(arg0 *s3.PutBucketRequestPaymentInput) (*s3.PutBucketRequestPaymentOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketRequestPayment", arg0) @@ -4012,13 +4212,13 @@ func (m *MockS3API) PutBucketRequestPayment(arg0 *s3.PutBucketRequestPaymentInpu return ret0, ret1 } -// PutBucketRequestPayment indicates an expected call of PutBucketRequestPayment +// PutBucketRequestPayment indicates an expected call of PutBucketRequestPayment. func (mr *MockS3APIMockRecorder) PutBucketRequestPayment(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketRequestPayment", reflect.TypeOf((*MockS3API)(nil).PutBucketRequestPayment), arg0) } -// PutBucketRequestPaymentRequest mocks base method +// PutBucketRequestPaymentRequest mocks base method. func (m *MockS3API) PutBucketRequestPaymentRequest(arg0 *s3.PutBucketRequestPaymentInput) (*request.Request, *s3.PutBucketRequestPaymentOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketRequestPaymentRequest", arg0) @@ -4027,13 +4227,13 @@ func (m *MockS3API) PutBucketRequestPaymentRequest(arg0 *s3.PutBucketRequestPaym return ret0, ret1 } -// PutBucketRequestPaymentRequest indicates an expected call of PutBucketRequestPaymentRequest +// PutBucketRequestPaymentRequest indicates an expected call of PutBucketRequestPaymentRequest. func (mr *MockS3APIMockRecorder) PutBucketRequestPaymentRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketRequestPaymentRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketRequestPaymentRequest), arg0) } -// PutBucketRequestPaymentWithContext mocks base method +// PutBucketRequestPaymentWithContext mocks base method. func (m *MockS3API) PutBucketRequestPaymentWithContext(arg0 context.Context, arg1 *s3.PutBucketRequestPaymentInput, arg2 ...request.Option) (*s3.PutBucketRequestPaymentOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4046,14 +4246,14 @@ func (m *MockS3API) PutBucketRequestPaymentWithContext(arg0 context.Context, arg return ret0, ret1 } -// PutBucketRequestPaymentWithContext indicates an expected call of PutBucketRequestPaymentWithContext +// PutBucketRequestPaymentWithContext indicates an expected call of PutBucketRequestPaymentWithContext. func (mr *MockS3APIMockRecorder) PutBucketRequestPaymentWithContext(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, "PutBucketRequestPaymentWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketRequestPaymentWithContext), varargs...) } -// PutBucketTagging mocks base method +// PutBucketTagging mocks base method. func (m *MockS3API) PutBucketTagging(arg0 *s3.PutBucketTaggingInput) (*s3.PutBucketTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketTagging", arg0) @@ -4062,13 +4262,13 @@ func (m *MockS3API) PutBucketTagging(arg0 *s3.PutBucketTaggingInput) (*s3.PutBuc return ret0, ret1 } -// PutBucketTagging indicates an expected call of PutBucketTagging +// PutBucketTagging indicates an expected call of PutBucketTagging. func (mr *MockS3APIMockRecorder) PutBucketTagging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketTagging", reflect.TypeOf((*MockS3API)(nil).PutBucketTagging), arg0) } -// PutBucketTaggingRequest mocks base method +// PutBucketTaggingRequest mocks base method. func (m *MockS3API) PutBucketTaggingRequest(arg0 *s3.PutBucketTaggingInput) (*request.Request, *s3.PutBucketTaggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketTaggingRequest", arg0) @@ -4077,13 +4277,13 @@ func (m *MockS3API) PutBucketTaggingRequest(arg0 *s3.PutBucketTaggingInput) (*re return ret0, ret1 } -// PutBucketTaggingRequest indicates an expected call of PutBucketTaggingRequest +// PutBucketTaggingRequest indicates an expected call of PutBucketTaggingRequest. func (mr *MockS3APIMockRecorder) PutBucketTaggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketTaggingRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketTaggingRequest), arg0) } -// PutBucketTaggingWithContext mocks base method +// PutBucketTaggingWithContext mocks base method. func (m *MockS3API) PutBucketTaggingWithContext(arg0 context.Context, arg1 *s3.PutBucketTaggingInput, arg2 ...request.Option) (*s3.PutBucketTaggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4096,14 +4296,14 @@ func (m *MockS3API) PutBucketTaggingWithContext(arg0 context.Context, arg1 *s3.P return ret0, ret1 } -// PutBucketTaggingWithContext indicates an expected call of PutBucketTaggingWithContext +// PutBucketTaggingWithContext indicates an expected call of PutBucketTaggingWithContext. func (mr *MockS3APIMockRecorder) PutBucketTaggingWithContext(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, "PutBucketTaggingWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketTaggingWithContext), varargs...) } -// PutBucketVersioning mocks base method +// PutBucketVersioning mocks base method. func (m *MockS3API) PutBucketVersioning(arg0 *s3.PutBucketVersioningInput) (*s3.PutBucketVersioningOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketVersioning", arg0) @@ -4112,13 +4312,13 @@ func (m *MockS3API) PutBucketVersioning(arg0 *s3.PutBucketVersioningInput) (*s3. return ret0, ret1 } -// PutBucketVersioning indicates an expected call of PutBucketVersioning +// PutBucketVersioning indicates an expected call of PutBucketVersioning. func (mr *MockS3APIMockRecorder) PutBucketVersioning(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketVersioning", reflect.TypeOf((*MockS3API)(nil).PutBucketVersioning), arg0) } -// PutBucketVersioningRequest mocks base method +// PutBucketVersioningRequest mocks base method. func (m *MockS3API) PutBucketVersioningRequest(arg0 *s3.PutBucketVersioningInput) (*request.Request, *s3.PutBucketVersioningOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketVersioningRequest", arg0) @@ -4127,13 +4327,13 @@ func (m *MockS3API) PutBucketVersioningRequest(arg0 *s3.PutBucketVersioningInput return ret0, ret1 } -// PutBucketVersioningRequest indicates an expected call of PutBucketVersioningRequest +// PutBucketVersioningRequest indicates an expected call of PutBucketVersioningRequest. func (mr *MockS3APIMockRecorder) PutBucketVersioningRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketVersioningRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketVersioningRequest), arg0) } -// PutBucketVersioningWithContext mocks base method +// PutBucketVersioningWithContext mocks base method. func (m *MockS3API) PutBucketVersioningWithContext(arg0 context.Context, arg1 *s3.PutBucketVersioningInput, arg2 ...request.Option) (*s3.PutBucketVersioningOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4146,14 +4346,14 @@ func (m *MockS3API) PutBucketVersioningWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// PutBucketVersioningWithContext indicates an expected call of PutBucketVersioningWithContext +// PutBucketVersioningWithContext indicates an expected call of PutBucketVersioningWithContext. func (mr *MockS3APIMockRecorder) PutBucketVersioningWithContext(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, "PutBucketVersioningWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketVersioningWithContext), varargs...) } -// PutBucketWebsite mocks base method +// PutBucketWebsite mocks base method. func (m *MockS3API) PutBucketWebsite(arg0 *s3.PutBucketWebsiteInput) (*s3.PutBucketWebsiteOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketWebsite", arg0) @@ -4162,13 +4362,13 @@ func (m *MockS3API) PutBucketWebsite(arg0 *s3.PutBucketWebsiteInput) (*s3.PutBuc return ret0, ret1 } -// PutBucketWebsite indicates an expected call of PutBucketWebsite +// PutBucketWebsite indicates an expected call of PutBucketWebsite. func (mr *MockS3APIMockRecorder) PutBucketWebsite(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketWebsite", reflect.TypeOf((*MockS3API)(nil).PutBucketWebsite), arg0) } -// PutBucketWebsiteRequest mocks base method +// PutBucketWebsiteRequest mocks base method. func (m *MockS3API) PutBucketWebsiteRequest(arg0 *s3.PutBucketWebsiteInput) (*request.Request, *s3.PutBucketWebsiteOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutBucketWebsiteRequest", arg0) @@ -4177,13 +4377,13 @@ func (m *MockS3API) PutBucketWebsiteRequest(arg0 *s3.PutBucketWebsiteInput) (*re return ret0, ret1 } -// PutBucketWebsiteRequest indicates an expected call of PutBucketWebsiteRequest +// PutBucketWebsiteRequest indicates an expected call of PutBucketWebsiteRequest. func (mr *MockS3APIMockRecorder) PutBucketWebsiteRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutBucketWebsiteRequest", reflect.TypeOf((*MockS3API)(nil).PutBucketWebsiteRequest), arg0) } -// PutBucketWebsiteWithContext mocks base method +// PutBucketWebsiteWithContext mocks base method. func (m *MockS3API) PutBucketWebsiteWithContext(arg0 context.Context, arg1 *s3.PutBucketWebsiteInput, arg2 ...request.Option) (*s3.PutBucketWebsiteOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4196,14 +4396,14 @@ func (m *MockS3API) PutBucketWebsiteWithContext(arg0 context.Context, arg1 *s3.P return ret0, ret1 } -// PutBucketWebsiteWithContext indicates an expected call of PutBucketWebsiteWithContext +// PutBucketWebsiteWithContext indicates an expected call of PutBucketWebsiteWithContext. func (mr *MockS3APIMockRecorder) PutBucketWebsiteWithContext(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, "PutBucketWebsiteWithContext", reflect.TypeOf((*MockS3API)(nil).PutBucketWebsiteWithContext), varargs...) } -// PutObject mocks base method +// PutObject mocks base method. func (m *MockS3API) PutObject(arg0 *s3.PutObjectInput) (*s3.PutObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObject", arg0) @@ -4212,13 +4412,13 @@ func (m *MockS3API) PutObject(arg0 *s3.PutObjectInput) (*s3.PutObjectOutput, err return ret0, ret1 } -// PutObject indicates an expected call of PutObject +// PutObject indicates an expected call of PutObject. func (mr *MockS3APIMockRecorder) PutObject(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObject", reflect.TypeOf((*MockS3API)(nil).PutObject), arg0) } -// PutObjectAcl mocks base method +// PutObjectAcl mocks base method. func (m *MockS3API) PutObjectAcl(arg0 *s3.PutObjectAclInput) (*s3.PutObjectAclOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectAcl", arg0) @@ -4227,13 +4427,13 @@ func (m *MockS3API) PutObjectAcl(arg0 *s3.PutObjectAclInput) (*s3.PutObjectAclOu return ret0, ret1 } -// PutObjectAcl indicates an expected call of PutObjectAcl +// PutObjectAcl indicates an expected call of PutObjectAcl. func (mr *MockS3APIMockRecorder) PutObjectAcl(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectAcl", reflect.TypeOf((*MockS3API)(nil).PutObjectAcl), arg0) } -// PutObjectAclRequest mocks base method +// PutObjectAclRequest mocks base method. func (m *MockS3API) PutObjectAclRequest(arg0 *s3.PutObjectAclInput) (*request.Request, *s3.PutObjectAclOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectAclRequest", arg0) @@ -4242,13 +4442,13 @@ func (m *MockS3API) PutObjectAclRequest(arg0 *s3.PutObjectAclInput) (*request.Re return ret0, ret1 } -// PutObjectAclRequest indicates an expected call of PutObjectAclRequest +// PutObjectAclRequest indicates an expected call of PutObjectAclRequest. func (mr *MockS3APIMockRecorder) PutObjectAclRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectAclRequest", reflect.TypeOf((*MockS3API)(nil).PutObjectAclRequest), arg0) } -// PutObjectAclWithContext mocks base method +// PutObjectAclWithContext mocks base method. func (m *MockS3API) PutObjectAclWithContext(arg0 context.Context, arg1 *s3.PutObjectAclInput, arg2 ...request.Option) (*s3.PutObjectAclOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4261,14 +4461,14 @@ func (m *MockS3API) PutObjectAclWithContext(arg0 context.Context, arg1 *s3.PutOb return ret0, ret1 } -// PutObjectAclWithContext indicates an expected call of PutObjectAclWithContext +// PutObjectAclWithContext indicates an expected call of PutObjectAclWithContext. func (mr *MockS3APIMockRecorder) PutObjectAclWithContext(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, "PutObjectAclWithContext", reflect.TypeOf((*MockS3API)(nil).PutObjectAclWithContext), varargs...) } -// PutObjectLegalHold mocks base method +// PutObjectLegalHold mocks base method. func (m *MockS3API) PutObjectLegalHold(arg0 *s3.PutObjectLegalHoldInput) (*s3.PutObjectLegalHoldOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectLegalHold", arg0) @@ -4277,13 +4477,13 @@ func (m *MockS3API) PutObjectLegalHold(arg0 *s3.PutObjectLegalHoldInput) (*s3.Pu return ret0, ret1 } -// PutObjectLegalHold indicates an expected call of PutObjectLegalHold +// PutObjectLegalHold indicates an expected call of PutObjectLegalHold. func (mr *MockS3APIMockRecorder) PutObjectLegalHold(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectLegalHold", reflect.TypeOf((*MockS3API)(nil).PutObjectLegalHold), arg0) } -// PutObjectLegalHoldRequest mocks base method +// PutObjectLegalHoldRequest mocks base method. func (m *MockS3API) PutObjectLegalHoldRequest(arg0 *s3.PutObjectLegalHoldInput) (*request.Request, *s3.PutObjectLegalHoldOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectLegalHoldRequest", arg0) @@ -4292,13 +4492,13 @@ func (m *MockS3API) PutObjectLegalHoldRequest(arg0 *s3.PutObjectLegalHoldInput) return ret0, ret1 } -// PutObjectLegalHoldRequest indicates an expected call of PutObjectLegalHoldRequest +// PutObjectLegalHoldRequest indicates an expected call of PutObjectLegalHoldRequest. func (mr *MockS3APIMockRecorder) PutObjectLegalHoldRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectLegalHoldRequest", reflect.TypeOf((*MockS3API)(nil).PutObjectLegalHoldRequest), arg0) } -// PutObjectLegalHoldWithContext mocks base method +// PutObjectLegalHoldWithContext mocks base method. func (m *MockS3API) PutObjectLegalHoldWithContext(arg0 context.Context, arg1 *s3.PutObjectLegalHoldInput, arg2 ...request.Option) (*s3.PutObjectLegalHoldOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4311,14 +4511,14 @@ func (m *MockS3API) PutObjectLegalHoldWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// PutObjectLegalHoldWithContext indicates an expected call of PutObjectLegalHoldWithContext +// PutObjectLegalHoldWithContext indicates an expected call of PutObjectLegalHoldWithContext. func (mr *MockS3APIMockRecorder) PutObjectLegalHoldWithContext(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, "PutObjectLegalHoldWithContext", reflect.TypeOf((*MockS3API)(nil).PutObjectLegalHoldWithContext), varargs...) } -// PutObjectLockConfiguration mocks base method +// PutObjectLockConfiguration mocks base method. func (m *MockS3API) PutObjectLockConfiguration(arg0 *s3.PutObjectLockConfigurationInput) (*s3.PutObjectLockConfigurationOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectLockConfiguration", arg0) @@ -4327,13 +4527,13 @@ func (m *MockS3API) PutObjectLockConfiguration(arg0 *s3.PutObjectLockConfigurati return ret0, ret1 } -// PutObjectLockConfiguration indicates an expected call of PutObjectLockConfiguration +// PutObjectLockConfiguration indicates an expected call of PutObjectLockConfiguration. func (mr *MockS3APIMockRecorder) PutObjectLockConfiguration(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectLockConfiguration", reflect.TypeOf((*MockS3API)(nil).PutObjectLockConfiguration), arg0) } -// PutObjectLockConfigurationRequest mocks base method +// PutObjectLockConfigurationRequest mocks base method. func (m *MockS3API) PutObjectLockConfigurationRequest(arg0 *s3.PutObjectLockConfigurationInput) (*request.Request, *s3.PutObjectLockConfigurationOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectLockConfigurationRequest", arg0) @@ -4342,13 +4542,13 @@ func (m *MockS3API) PutObjectLockConfigurationRequest(arg0 *s3.PutObjectLockConf return ret0, ret1 } -// PutObjectLockConfigurationRequest indicates an expected call of PutObjectLockConfigurationRequest +// PutObjectLockConfigurationRequest indicates an expected call of PutObjectLockConfigurationRequest. func (mr *MockS3APIMockRecorder) PutObjectLockConfigurationRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectLockConfigurationRequest", reflect.TypeOf((*MockS3API)(nil).PutObjectLockConfigurationRequest), arg0) } -// PutObjectLockConfigurationWithContext mocks base method +// PutObjectLockConfigurationWithContext mocks base method. func (m *MockS3API) PutObjectLockConfigurationWithContext(arg0 context.Context, arg1 *s3.PutObjectLockConfigurationInput, arg2 ...request.Option) (*s3.PutObjectLockConfigurationOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4361,14 +4561,14 @@ func (m *MockS3API) PutObjectLockConfigurationWithContext(arg0 context.Context, return ret0, ret1 } -// PutObjectLockConfigurationWithContext indicates an expected call of PutObjectLockConfigurationWithContext +// PutObjectLockConfigurationWithContext indicates an expected call of PutObjectLockConfigurationWithContext. func (mr *MockS3APIMockRecorder) PutObjectLockConfigurationWithContext(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, "PutObjectLockConfigurationWithContext", reflect.TypeOf((*MockS3API)(nil).PutObjectLockConfigurationWithContext), varargs...) } -// PutObjectRequest mocks base method +// PutObjectRequest mocks base method. func (m *MockS3API) PutObjectRequest(arg0 *s3.PutObjectInput) (*request.Request, *s3.PutObjectOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectRequest", arg0) @@ -4377,13 +4577,13 @@ func (m *MockS3API) PutObjectRequest(arg0 *s3.PutObjectInput) (*request.Request, return ret0, ret1 } -// PutObjectRequest indicates an expected call of PutObjectRequest +// PutObjectRequest indicates an expected call of PutObjectRequest. func (mr *MockS3APIMockRecorder) PutObjectRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectRequest", reflect.TypeOf((*MockS3API)(nil).PutObjectRequest), arg0) } -// PutObjectRetention mocks base method +// PutObjectRetention mocks base method. func (m *MockS3API) PutObjectRetention(arg0 *s3.PutObjectRetentionInput) (*s3.PutObjectRetentionOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectRetention", arg0) @@ -4392,13 +4592,13 @@ func (m *MockS3API) PutObjectRetention(arg0 *s3.PutObjectRetentionInput) (*s3.Pu return ret0, ret1 } -// PutObjectRetention indicates an expected call of PutObjectRetention +// PutObjectRetention indicates an expected call of PutObjectRetention. func (mr *MockS3APIMockRecorder) PutObjectRetention(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectRetention", reflect.TypeOf((*MockS3API)(nil).PutObjectRetention), arg0) } -// PutObjectRetentionRequest mocks base method +// PutObjectRetentionRequest mocks base method. func (m *MockS3API) PutObjectRetentionRequest(arg0 *s3.PutObjectRetentionInput) (*request.Request, *s3.PutObjectRetentionOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectRetentionRequest", arg0) @@ -4407,13 +4607,13 @@ func (m *MockS3API) PutObjectRetentionRequest(arg0 *s3.PutObjectRetentionInput) return ret0, ret1 } -// PutObjectRetentionRequest indicates an expected call of PutObjectRetentionRequest +// PutObjectRetentionRequest indicates an expected call of PutObjectRetentionRequest. func (mr *MockS3APIMockRecorder) PutObjectRetentionRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectRetentionRequest", reflect.TypeOf((*MockS3API)(nil).PutObjectRetentionRequest), arg0) } -// PutObjectRetentionWithContext mocks base method +// PutObjectRetentionWithContext mocks base method. func (m *MockS3API) PutObjectRetentionWithContext(arg0 context.Context, arg1 *s3.PutObjectRetentionInput, arg2 ...request.Option) (*s3.PutObjectRetentionOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4426,14 +4626,14 @@ func (m *MockS3API) PutObjectRetentionWithContext(arg0 context.Context, arg1 *s3 return ret0, ret1 } -// PutObjectRetentionWithContext indicates an expected call of PutObjectRetentionWithContext +// PutObjectRetentionWithContext indicates an expected call of PutObjectRetentionWithContext. func (mr *MockS3APIMockRecorder) PutObjectRetentionWithContext(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, "PutObjectRetentionWithContext", reflect.TypeOf((*MockS3API)(nil).PutObjectRetentionWithContext), varargs...) } -// PutObjectTagging mocks base method +// PutObjectTagging mocks base method. func (m *MockS3API) PutObjectTagging(arg0 *s3.PutObjectTaggingInput) (*s3.PutObjectTaggingOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectTagging", arg0) @@ -4442,13 +4642,13 @@ func (m *MockS3API) PutObjectTagging(arg0 *s3.PutObjectTaggingInput) (*s3.PutObj return ret0, ret1 } -// PutObjectTagging indicates an expected call of PutObjectTagging +// PutObjectTagging indicates an expected call of PutObjectTagging. func (mr *MockS3APIMockRecorder) PutObjectTagging(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectTagging", reflect.TypeOf((*MockS3API)(nil).PutObjectTagging), arg0) } -// PutObjectTaggingRequest mocks base method +// PutObjectTaggingRequest mocks base method. func (m *MockS3API) PutObjectTaggingRequest(arg0 *s3.PutObjectTaggingInput) (*request.Request, *s3.PutObjectTaggingOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutObjectTaggingRequest", arg0) @@ -4457,13 +4657,13 @@ func (m *MockS3API) PutObjectTaggingRequest(arg0 *s3.PutObjectTaggingInput) (*re return ret0, ret1 } -// PutObjectTaggingRequest indicates an expected call of PutObjectTaggingRequest +// PutObjectTaggingRequest indicates an expected call of PutObjectTaggingRequest. func (mr *MockS3APIMockRecorder) PutObjectTaggingRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutObjectTaggingRequest", reflect.TypeOf((*MockS3API)(nil).PutObjectTaggingRequest), arg0) } -// PutObjectTaggingWithContext mocks base method +// PutObjectTaggingWithContext mocks base method. func (m *MockS3API) PutObjectTaggingWithContext(arg0 context.Context, arg1 *s3.PutObjectTaggingInput, arg2 ...request.Option) (*s3.PutObjectTaggingOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4476,14 +4676,14 @@ func (m *MockS3API) PutObjectTaggingWithContext(arg0 context.Context, arg1 *s3.P return ret0, ret1 } -// PutObjectTaggingWithContext indicates an expected call of PutObjectTaggingWithContext +// PutObjectTaggingWithContext indicates an expected call of PutObjectTaggingWithContext. func (mr *MockS3APIMockRecorder) PutObjectTaggingWithContext(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, "PutObjectTaggingWithContext", reflect.TypeOf((*MockS3API)(nil).PutObjectTaggingWithContext), varargs...) } -// PutObjectWithContext mocks base method +// PutObjectWithContext mocks base method. func (m *MockS3API) PutObjectWithContext(arg0 context.Context, arg1 *s3.PutObjectInput, arg2 ...request.Option) (*s3.PutObjectOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4496,14 +4696,14 @@ func (m *MockS3API) PutObjectWithContext(arg0 context.Context, arg1 *s3.PutObjec return ret0, ret1 } -// PutObjectWithContext indicates an expected call of PutObjectWithContext +// PutObjectWithContext indicates an expected call of PutObjectWithContext. func (mr *MockS3APIMockRecorder) PutObjectWithContext(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, "PutObjectWithContext", reflect.TypeOf((*MockS3API)(nil).PutObjectWithContext), varargs...) } -// PutPublicAccessBlock mocks base method +// PutPublicAccessBlock mocks base method. func (m *MockS3API) PutPublicAccessBlock(arg0 *s3.PutPublicAccessBlockInput) (*s3.PutPublicAccessBlockOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutPublicAccessBlock", arg0) @@ -4512,13 +4712,13 @@ func (m *MockS3API) PutPublicAccessBlock(arg0 *s3.PutPublicAccessBlockInput) (*s return ret0, ret1 } -// PutPublicAccessBlock indicates an expected call of PutPublicAccessBlock +// PutPublicAccessBlock indicates an expected call of PutPublicAccessBlock. func (mr *MockS3APIMockRecorder) PutPublicAccessBlock(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutPublicAccessBlock", reflect.TypeOf((*MockS3API)(nil).PutPublicAccessBlock), arg0) } -// PutPublicAccessBlockRequest mocks base method +// PutPublicAccessBlockRequest mocks base method. func (m *MockS3API) PutPublicAccessBlockRequest(arg0 *s3.PutPublicAccessBlockInput) (*request.Request, *s3.PutPublicAccessBlockOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PutPublicAccessBlockRequest", arg0) @@ -4527,13 +4727,13 @@ func (m *MockS3API) PutPublicAccessBlockRequest(arg0 *s3.PutPublicAccessBlockInp return ret0, ret1 } -// PutPublicAccessBlockRequest indicates an expected call of PutPublicAccessBlockRequest +// PutPublicAccessBlockRequest indicates an expected call of PutPublicAccessBlockRequest. func (mr *MockS3APIMockRecorder) PutPublicAccessBlockRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PutPublicAccessBlockRequest", reflect.TypeOf((*MockS3API)(nil).PutPublicAccessBlockRequest), arg0) } -// PutPublicAccessBlockWithContext mocks base method +// PutPublicAccessBlockWithContext mocks base method. func (m *MockS3API) PutPublicAccessBlockWithContext(arg0 context.Context, arg1 *s3.PutPublicAccessBlockInput, arg2 ...request.Option) (*s3.PutPublicAccessBlockOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4546,14 +4746,14 @@ func (m *MockS3API) PutPublicAccessBlockWithContext(arg0 context.Context, arg1 * return ret0, ret1 } -// PutPublicAccessBlockWithContext indicates an expected call of PutPublicAccessBlockWithContext +// PutPublicAccessBlockWithContext indicates an expected call of PutPublicAccessBlockWithContext. func (mr *MockS3APIMockRecorder) PutPublicAccessBlockWithContext(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, "PutPublicAccessBlockWithContext", reflect.TypeOf((*MockS3API)(nil).PutPublicAccessBlockWithContext), varargs...) } -// RestoreObject mocks base method +// RestoreObject mocks base method. func (m *MockS3API) RestoreObject(arg0 *s3.RestoreObjectInput) (*s3.RestoreObjectOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RestoreObject", arg0) @@ -4562,13 +4762,13 @@ func (m *MockS3API) RestoreObject(arg0 *s3.RestoreObjectInput) (*s3.RestoreObjec return ret0, ret1 } -// RestoreObject indicates an expected call of RestoreObject +// RestoreObject indicates an expected call of RestoreObject. func (mr *MockS3APIMockRecorder) RestoreObject(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoreObject", reflect.TypeOf((*MockS3API)(nil).RestoreObject), arg0) } -// RestoreObjectRequest mocks base method +// RestoreObjectRequest mocks base method. func (m *MockS3API) RestoreObjectRequest(arg0 *s3.RestoreObjectInput) (*request.Request, *s3.RestoreObjectOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RestoreObjectRequest", arg0) @@ -4577,13 +4777,13 @@ func (m *MockS3API) RestoreObjectRequest(arg0 *s3.RestoreObjectInput) (*request. return ret0, ret1 } -// RestoreObjectRequest indicates an expected call of RestoreObjectRequest +// RestoreObjectRequest indicates an expected call of RestoreObjectRequest. func (mr *MockS3APIMockRecorder) RestoreObjectRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoreObjectRequest", reflect.TypeOf((*MockS3API)(nil).RestoreObjectRequest), arg0) } -// RestoreObjectWithContext mocks base method +// RestoreObjectWithContext mocks base method. func (m *MockS3API) RestoreObjectWithContext(arg0 context.Context, arg1 *s3.RestoreObjectInput, arg2 ...request.Option) (*s3.RestoreObjectOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4596,14 +4796,14 @@ func (m *MockS3API) RestoreObjectWithContext(arg0 context.Context, arg1 *s3.Rest return ret0, ret1 } -// RestoreObjectWithContext indicates an expected call of RestoreObjectWithContext +// RestoreObjectWithContext indicates an expected call of RestoreObjectWithContext. func (mr *MockS3APIMockRecorder) RestoreObjectWithContext(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, "RestoreObjectWithContext", reflect.TypeOf((*MockS3API)(nil).RestoreObjectWithContext), varargs...) } -// SelectObjectContent mocks base method +// SelectObjectContent mocks base method. func (m *MockS3API) SelectObjectContent(arg0 *s3.SelectObjectContentInput) (*s3.SelectObjectContentOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SelectObjectContent", arg0) @@ -4612,13 +4812,13 @@ func (m *MockS3API) SelectObjectContent(arg0 *s3.SelectObjectContentInput) (*s3. return ret0, ret1 } -// SelectObjectContent indicates an expected call of SelectObjectContent +// SelectObjectContent indicates an expected call of SelectObjectContent. func (mr *MockS3APIMockRecorder) SelectObjectContent(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectObjectContent", reflect.TypeOf((*MockS3API)(nil).SelectObjectContent), arg0) } -// SelectObjectContentRequest mocks base method +// SelectObjectContentRequest mocks base method. func (m *MockS3API) SelectObjectContentRequest(arg0 *s3.SelectObjectContentInput) (*request.Request, *s3.SelectObjectContentOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SelectObjectContentRequest", arg0) @@ -4627,13 +4827,13 @@ func (m *MockS3API) SelectObjectContentRequest(arg0 *s3.SelectObjectContentInput return ret0, ret1 } -// SelectObjectContentRequest indicates an expected call of SelectObjectContentRequest +// SelectObjectContentRequest indicates an expected call of SelectObjectContentRequest. func (mr *MockS3APIMockRecorder) SelectObjectContentRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SelectObjectContentRequest", reflect.TypeOf((*MockS3API)(nil).SelectObjectContentRequest), arg0) } -// SelectObjectContentWithContext mocks base method +// SelectObjectContentWithContext mocks base method. func (m *MockS3API) SelectObjectContentWithContext(arg0 context.Context, arg1 *s3.SelectObjectContentInput, arg2 ...request.Option) (*s3.SelectObjectContentOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4646,14 +4846,14 @@ func (m *MockS3API) SelectObjectContentWithContext(arg0 context.Context, arg1 *s return ret0, ret1 } -// SelectObjectContentWithContext indicates an expected call of SelectObjectContentWithContext +// SelectObjectContentWithContext indicates an expected call of SelectObjectContentWithContext. func (mr *MockS3APIMockRecorder) SelectObjectContentWithContext(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, "SelectObjectContentWithContext", reflect.TypeOf((*MockS3API)(nil).SelectObjectContentWithContext), varargs...) } -// UploadPart mocks base method +// UploadPart mocks base method. func (m *MockS3API) UploadPart(arg0 *s3.UploadPartInput) (*s3.UploadPartOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UploadPart", arg0) @@ -4662,13 +4862,13 @@ func (m *MockS3API) UploadPart(arg0 *s3.UploadPartInput) (*s3.UploadPartOutput, return ret0, ret1 } -// UploadPart indicates an expected call of UploadPart +// UploadPart indicates an expected call of UploadPart. func (mr *MockS3APIMockRecorder) UploadPart(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPart", reflect.TypeOf((*MockS3API)(nil).UploadPart), arg0) } -// UploadPartCopy mocks base method +// UploadPartCopy mocks base method. func (m *MockS3API) UploadPartCopy(arg0 *s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UploadPartCopy", arg0) @@ -4677,13 +4877,13 @@ func (m *MockS3API) UploadPartCopy(arg0 *s3.UploadPartCopyInput) (*s3.UploadPart return ret0, ret1 } -// UploadPartCopy indicates an expected call of UploadPartCopy +// UploadPartCopy indicates an expected call of UploadPartCopy. func (mr *MockS3APIMockRecorder) UploadPartCopy(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPartCopy", reflect.TypeOf((*MockS3API)(nil).UploadPartCopy), arg0) } -// UploadPartCopyRequest mocks base method +// UploadPartCopyRequest mocks base method. func (m *MockS3API) UploadPartCopyRequest(arg0 *s3.UploadPartCopyInput) (*request.Request, *s3.UploadPartCopyOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UploadPartCopyRequest", arg0) @@ -4692,13 +4892,13 @@ func (m *MockS3API) UploadPartCopyRequest(arg0 *s3.UploadPartCopyInput) (*reques return ret0, ret1 } -// UploadPartCopyRequest indicates an expected call of UploadPartCopyRequest +// UploadPartCopyRequest indicates an expected call of UploadPartCopyRequest. func (mr *MockS3APIMockRecorder) UploadPartCopyRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPartCopyRequest", reflect.TypeOf((*MockS3API)(nil).UploadPartCopyRequest), arg0) } -// UploadPartCopyWithContext mocks base method +// UploadPartCopyWithContext mocks base method. func (m *MockS3API) UploadPartCopyWithContext(arg0 context.Context, arg1 *s3.UploadPartCopyInput, arg2 ...request.Option) (*s3.UploadPartCopyOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4711,14 +4911,14 @@ func (m *MockS3API) UploadPartCopyWithContext(arg0 context.Context, arg1 *s3.Upl return ret0, ret1 } -// UploadPartCopyWithContext indicates an expected call of UploadPartCopyWithContext +// UploadPartCopyWithContext indicates an expected call of UploadPartCopyWithContext. func (mr *MockS3APIMockRecorder) UploadPartCopyWithContext(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, "UploadPartCopyWithContext", reflect.TypeOf((*MockS3API)(nil).UploadPartCopyWithContext), varargs...) } -// UploadPartRequest mocks base method +// UploadPartRequest mocks base method. func (m *MockS3API) UploadPartRequest(arg0 *s3.UploadPartInput) (*request.Request, *s3.UploadPartOutput) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UploadPartRequest", arg0) @@ -4727,13 +4927,13 @@ func (m *MockS3API) UploadPartRequest(arg0 *s3.UploadPartInput) (*request.Reques return ret0, ret1 } -// UploadPartRequest indicates an expected call of UploadPartRequest +// UploadPartRequest indicates an expected call of UploadPartRequest. func (mr *MockS3APIMockRecorder) UploadPartRequest(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UploadPartRequest", reflect.TypeOf((*MockS3API)(nil).UploadPartRequest), arg0) } -// UploadPartWithContext mocks base method +// UploadPartWithContext mocks base method. func (m *MockS3API) UploadPartWithContext(arg0 context.Context, arg1 *s3.UploadPartInput, arg2 ...request.Option) (*s3.UploadPartOutput, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4746,14 +4946,14 @@ func (m *MockS3API) UploadPartWithContext(arg0 context.Context, arg1 *s3.UploadP return ret0, ret1 } -// UploadPartWithContext indicates an expected call of UploadPartWithContext +// UploadPartWithContext indicates an expected call of UploadPartWithContext. func (mr *MockS3APIMockRecorder) UploadPartWithContext(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, "UploadPartWithContext", reflect.TypeOf((*MockS3API)(nil).UploadPartWithContext), varargs...) } -// WaitUntilBucketExists mocks base method +// WaitUntilBucketExists mocks base method. func (m *MockS3API) WaitUntilBucketExists(arg0 *s3.HeadBucketInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WaitUntilBucketExists", arg0) @@ -4761,13 +4961,13 @@ func (m *MockS3API) WaitUntilBucketExists(arg0 *s3.HeadBucketInput) error { return ret0 } -// WaitUntilBucketExists indicates an expected call of WaitUntilBucketExists +// WaitUntilBucketExists indicates an expected call of WaitUntilBucketExists. func (mr *MockS3APIMockRecorder) WaitUntilBucketExists(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitUntilBucketExists", reflect.TypeOf((*MockS3API)(nil).WaitUntilBucketExists), arg0) } -// WaitUntilBucketExistsWithContext mocks base method +// WaitUntilBucketExistsWithContext mocks base method. func (m *MockS3API) WaitUntilBucketExistsWithContext(arg0 context.Context, arg1 *s3.HeadBucketInput, arg2 ...request.WaiterOption) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4779,14 +4979,14 @@ func (m *MockS3API) WaitUntilBucketExistsWithContext(arg0 context.Context, arg1 return ret0 } -// WaitUntilBucketExistsWithContext indicates an expected call of WaitUntilBucketExistsWithContext +// WaitUntilBucketExistsWithContext indicates an expected call of WaitUntilBucketExistsWithContext. func (mr *MockS3APIMockRecorder) WaitUntilBucketExistsWithContext(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, "WaitUntilBucketExistsWithContext", reflect.TypeOf((*MockS3API)(nil).WaitUntilBucketExistsWithContext), varargs...) } -// WaitUntilBucketNotExists mocks base method +// WaitUntilBucketNotExists mocks base method. func (m *MockS3API) WaitUntilBucketNotExists(arg0 *s3.HeadBucketInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WaitUntilBucketNotExists", arg0) @@ -4794,13 +4994,13 @@ func (m *MockS3API) WaitUntilBucketNotExists(arg0 *s3.HeadBucketInput) error { return ret0 } -// WaitUntilBucketNotExists indicates an expected call of WaitUntilBucketNotExists +// WaitUntilBucketNotExists indicates an expected call of WaitUntilBucketNotExists. func (mr *MockS3APIMockRecorder) WaitUntilBucketNotExists(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitUntilBucketNotExists", reflect.TypeOf((*MockS3API)(nil).WaitUntilBucketNotExists), arg0) } -// WaitUntilBucketNotExistsWithContext mocks base method +// WaitUntilBucketNotExistsWithContext mocks base method. func (m *MockS3API) WaitUntilBucketNotExistsWithContext(arg0 context.Context, arg1 *s3.HeadBucketInput, arg2 ...request.WaiterOption) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4812,14 +5012,14 @@ func (m *MockS3API) WaitUntilBucketNotExistsWithContext(arg0 context.Context, ar return ret0 } -// WaitUntilBucketNotExistsWithContext indicates an expected call of WaitUntilBucketNotExistsWithContext +// WaitUntilBucketNotExistsWithContext indicates an expected call of WaitUntilBucketNotExistsWithContext. func (mr *MockS3APIMockRecorder) WaitUntilBucketNotExistsWithContext(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, "WaitUntilBucketNotExistsWithContext", reflect.TypeOf((*MockS3API)(nil).WaitUntilBucketNotExistsWithContext), varargs...) } -// WaitUntilObjectExists mocks base method +// WaitUntilObjectExists mocks base method. func (m *MockS3API) WaitUntilObjectExists(arg0 *s3.HeadObjectInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WaitUntilObjectExists", arg0) @@ -4827,13 +5027,13 @@ func (m *MockS3API) WaitUntilObjectExists(arg0 *s3.HeadObjectInput) error { return ret0 } -// WaitUntilObjectExists indicates an expected call of WaitUntilObjectExists +// WaitUntilObjectExists indicates an expected call of WaitUntilObjectExists. func (mr *MockS3APIMockRecorder) WaitUntilObjectExists(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitUntilObjectExists", reflect.TypeOf((*MockS3API)(nil).WaitUntilObjectExists), arg0) } -// WaitUntilObjectExistsWithContext mocks base method +// WaitUntilObjectExistsWithContext mocks base method. func (m *MockS3API) WaitUntilObjectExistsWithContext(arg0 context.Context, arg1 *s3.HeadObjectInput, arg2 ...request.WaiterOption) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4845,14 +5045,14 @@ func (m *MockS3API) WaitUntilObjectExistsWithContext(arg0 context.Context, arg1 return ret0 } -// WaitUntilObjectExistsWithContext indicates an expected call of WaitUntilObjectExistsWithContext +// WaitUntilObjectExistsWithContext indicates an expected call of WaitUntilObjectExistsWithContext. func (mr *MockS3APIMockRecorder) WaitUntilObjectExistsWithContext(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, "WaitUntilObjectExistsWithContext", reflect.TypeOf((*MockS3API)(nil).WaitUntilObjectExistsWithContext), varargs...) } -// WaitUntilObjectNotExists mocks base method +// WaitUntilObjectNotExists mocks base method. func (m *MockS3API) WaitUntilObjectNotExists(arg0 *s3.HeadObjectInput) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WaitUntilObjectNotExists", arg0) @@ -4860,13 +5060,13 @@ func (m *MockS3API) WaitUntilObjectNotExists(arg0 *s3.HeadObjectInput) error { return ret0 } -// WaitUntilObjectNotExists indicates an expected call of WaitUntilObjectNotExists +// WaitUntilObjectNotExists indicates an expected call of WaitUntilObjectNotExists. func (mr *MockS3APIMockRecorder) WaitUntilObjectNotExists(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WaitUntilObjectNotExists", reflect.TypeOf((*MockS3API)(nil).WaitUntilObjectNotExists), arg0) } -// WaitUntilObjectNotExistsWithContext mocks base method +// WaitUntilObjectNotExistsWithContext mocks base method. func (m *MockS3API) WaitUntilObjectNotExistsWithContext(arg0 context.Context, arg1 *s3.HeadObjectInput, arg2 ...request.WaiterOption) error { m.ctrl.T.Helper() varargs := []interface{}{arg0, arg1} @@ -4878,7 +5078,7 @@ func (m *MockS3API) WaitUntilObjectNotExistsWithContext(arg0 context.Context, ar return ret0 } -// WaitUntilObjectNotExistsWithContext indicates an expected call of WaitUntilObjectNotExistsWithContext +// WaitUntilObjectNotExistsWithContext indicates an expected call of WaitUntilObjectNotExistsWithContext. func (mr *MockS3APIMockRecorder) WaitUntilObjectNotExistsWithContext(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{arg0, arg1}, arg2...) diff --git a/br/pkg/pdutil/pd.go b/br/pkg/pdutil/pd.go index 1c2d8dd6754bc..07853096c5d34 100755 --- a/br/pkg/pdutil/pd.go +++ b/br/pkg/pdutil/pd.go @@ -631,7 +631,7 @@ func (p *PdController) RemoveSchedulers(ctx context.Context) (undo UndoFunc, err } // RemoveSchedulersWithOrigin pause and remove br related schedule configs and return the origin and modified configs -func (p *PdController) RemoveSchedulersWithOrigin(ctx context.Context) (ClusterConfig, ClusterConfig, error) { +func (p *PdController) RemoveSchedulersWithOrigin(ctx context.Context) (origin ClusterConfig, modified ClusterConfig, err error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("PdController.RemoveSchedulers", opentracing.ChildOf(span.Context())) defer span1.Finish() @@ -765,6 +765,7 @@ func (p *PdController) CreateOrUpdateRegionLabelRule(ctx context.Context, rule L return errors.Trace(lastErr) } +// DeleteRegionLabelRule deletes a region label rule. func (p *PdController) DeleteRegionLabelRule(ctx context.Context, ruleID string) error { var lastErr error for i, addr := range p.addrs { diff --git a/br/pkg/restore/BUILD.bazel b/br/pkg/restore/BUILD.bazel index e18abc5e82b59..e89f76d24d54c 100644 --- a/br/pkg/restore/BUILD.bazel +++ b/br/pkg/restore/BUILD.bazel @@ -12,6 +12,7 @@ go_library( "pipeline_items.go", "range.go", "rawkv_client.go", + "search.go", "split.go", "split_client.go", "stream_metas.go", @@ -21,6 +22,7 @@ go_library( importpath = "github.com/pingcap/tidb/br/pkg/restore", visibility = ["//visibility:public"], deps = [ + "//br/pkg/backup", "//br/pkg/checksum", "//br/pkg/conn", "//br/pkg/errors", @@ -35,6 +37,7 @@ go_library( "//br/pkg/stream", "//br/pkg/summary", "//br/pkg/utils", + "//config", "//ddl/util", "//domain", "//kv", @@ -45,6 +48,7 @@ go_library( "//statistics/handle", "//store/pdtypes", "//tablecodec", + "//util", "//util/codec", "//util/hack", "//util/mathutil", @@ -93,12 +97,13 @@ go_test( "merge_test.go", "range_test.go", "rawkv_client_test.go", + "search_test.go", "split_test.go", "stream_metas_test.go", "util_test.go", ], + embed = [":restore"], deps = [ - ":restore", "//br/pkg/backup", "//br/pkg/conn", "//br/pkg/errors", @@ -109,7 +114,9 @@ go_test( "//br/pkg/mock", "//br/pkg/rtree", "//br/pkg/storage", + "//br/pkg/stream", "//br/pkg/utils", + "//infoschema", "//kv", "//meta/autoid", "//parser/model", @@ -122,8 +129,10 @@ go_test( "//testkit/testsetup", "//types", "//util/codec", + "//util/mathutil", "@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/errorpb", diff --git a/br/pkg/restore/client.go b/br/pkg/restore/client.go index 4ab1b04e49b38..d67adb90dffe5 100644 --- a/br/pkg/restore/client.go +++ b/br/pkg/restore/client.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/backup" "github.com/pingcap/tidb/br/pkg/checksum" "github.com/pingcap/tidb/br/pkg/conn" berrors "github.com/pingcap/tidb/br/pkg/errors" @@ -36,11 +37,13 @@ import ( "github.com/pingcap/tidb/br/pkg/stream" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/config" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/store/pdtypes" "github.com/pingcap/tidb/tablecodec" @@ -129,15 +132,15 @@ type Client struct { supportPolicy bool - // startTS and restoreTs are used for kv file restore. + // startTS and restoreTS are used for kv file restore. // TiKV will filter the key space that don't belong to [startTS, restoreTS]. startTS uint64 restoreTS uint64 - // If the the commit-ts of txn-entry is belong [startTS, restoreTS], - // the start-ts of txn-entry may be smaller than startTS. - // We need maintain and restore more entries in default-cf - // (the start-ts in these entries is belong to [shiftStartTS, startTS]). + // If the commitTS of txn-entry belong to [startTS, restoreTS], + // the startTS of txn-entry may be smaller than startTS. + // We need maintain and restore more entries in default cf + // (the startTS in these entries belong to [shiftStartTS, startTS]). shiftStartTS uint64 // currentTS is used for rewrite meta kv when restore stream. @@ -145,6 +148,21 @@ type Client struct { currentTS uint64 storage storage.ExternalStorage + + // if fullClusterRestore = true: + // - if there's system tables in the backup(backup data since br 5.1.0), the cluster should be a fresh cluster + // without user database or table. and system tables about privileges is restored together with user data. + // - if there no system tables in the backup(backup data from br < 5.1.0), restore all user data just like + // previous version did. + // if fullClusterRestore = false, restore all user data just like previous version did. + // fullClusterRestore = true when there is no explicit filter setting, and it's full restore or point command + // with a full backup data. + // todo: maybe change to an enum + fullClusterRestore bool + // the query to insert rows into table `gc_delete_range`, lack of ts. + deleteRangeQuery []string + deleteRangeQueryCh chan string + deleteRangeQueryWaitGroup sync.WaitGroup } // NewRestoreClient returns a new RestoreClient. @@ -155,11 +173,13 @@ func NewRestoreClient( isRawKv bool, ) *Client { return &Client{ - pdClient: pdClient, - toolClient: NewSplitClient(pdClient, tlsConf, isRawKv), - tlsConf: tlsConf, - keepaliveConf: keepaliveConf, - switchCh: make(chan struct{}), + pdClient: pdClient, + toolClient: NewSplitClient(pdClient, tlsConf, isRawKv), + tlsConf: tlsConf, + keepaliveConf: keepaliveConf, + switchCh: make(chan struct{}), + deleteRangeQuery: make([]string, 0), + deleteRangeQueryCh: make(chan string, 10), } } @@ -297,6 +317,8 @@ func (rc *Client) SetRestoreRangeTS(startTs, restoreTS, shiftStartTS uint64) { rc.startTS = startTs rc.restoreTS = restoreTS rc.shiftStartTS = shiftStartTS + log.Info("set restore range ts", zap.Uint64("shift-start-ts", shiftStartTS), + zap.Uint64("start-ts", startTs), zap.Uint64("restored-ts", restoreTS)) } func (rc *Client) SetCurrentTS(ts uint64) { @@ -420,6 +442,7 @@ 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.Debug("new worker pool", zap.Uint("currency-count", c)) rc.workerPool = utils.NewWorkerPool(c, "file") } @@ -483,6 +506,14 @@ func (rc *Client) GetDatabase(name string) *utils.Database { return rc.databases[name] } +// HasBackedUpSysDB whether we have backed up system tables +// br backs system tables up since 5.1.0 +func (rc *Client) HasBackedUpSysDB() bool { + temporaryDB := utils.TemporaryDBName(mysql.SystemDB) + _, backedUp := rc.databases[temporaryDB.O] + return backedUp +} + // GetPlacementPolicies returns policies. func (rc *Client) GetPlacementPolicies() (*sync.Map, error) { policies := &sync.Map{} @@ -823,6 +854,101 @@ func (rc *Client) createTablesInWorkerPool(ctx context.Context, dom *domain.Doma return eg.Wait() } +// CheckTargetClusterFresh check whether the target cluster is fresh or not +// if there's no user dbs or tables, we take it as a fresh cluster, although +// user may have created some users or made other changes. +func (rc *Client) CheckTargetClusterFresh(ctx context.Context) error { + log.Info("checking whether target cluster is fresh") + userDBs := GetExistedUserDBs(rc.dom) + if len(userDBs) == 0 { + return nil + } + + const maxPrintCount = 10 + userTableOrDBNames := make([]string, 0, maxPrintCount+1) + addName := func(name string) bool { + if len(userTableOrDBNames) == maxPrintCount { + userTableOrDBNames = append(userTableOrDBNames, "...") + return false + } + userTableOrDBNames = append(userTableOrDBNames, name) + return true + } +outer: + for _, db := range userDBs { + if !addName(db.Name.L) { + break outer + } + for _, tbl := range db.Tables { + if !addName(tbl.Name.L) { + break outer + } + } + } + log.Error("not fresh cluster", zap.Strings("user tables", userTableOrDBNames)) + return errors.Annotate(berrors.ErrRestoreNotFreshCluster, "user db/tables: "+strings.Join(userTableOrDBNames, ", ")) +} + +func (rc *Client) CheckSysTableCompatibility(dom *domain.Domain, tables []*metautil.Table) error { + log.Info("checking target cluster system table compatibility with backed up data") + privilegeTablesInBackup := make([]*metautil.Table, 0) + for _, table := range tables { + decodedSysDBName, ok := utils.GetSysDBCIStrName(table.DB.Name) + if ok && utils.IsSysDB(decodedSysDBName.L) && sysPrivilegeTableSet[table.Info.Name.L] { + privilegeTablesInBackup = append(privilegeTablesInBackup, table) + } + } + sysDB := model.NewCIStr(mysql.SystemDB) + for _, table := range privilegeTablesInBackup { + ti, err := rc.GetTableSchema(dom, sysDB, table.Info.Name) + if err != nil { + log.Error("missing table on target cluster", zap.Stringer("table", table.Info.Name)) + return errors.Annotate(berrors.ErrRestoreIncompatibleSys, "missed system table: "+table.Info.Name.O) + } + backupTi := table.Info + if len(ti.Columns) != len(backupTi.Columns) { + log.Error("column count mismatch", + zap.Stringer("table", table.Info.Name), + zap.Int("col in cluster", len(ti.Columns)), + zap.Int("col in backup", len(backupTi.Columns))) + return errors.Annotatef(berrors.ErrRestoreIncompatibleSys, + "column count mismatch, table: %s, col in cluster: %d, col in backup: %d", + table.Info.Name.O, len(ti.Columns), len(backupTi.Columns)) + } + backupColMap := make(map[string]*model.ColumnInfo) + for i := range backupTi.Columns { + col := backupTi.Columns[i] + backupColMap[col.Name.L] = col + } + // order can be different but type must compatible + for i := range ti.Columns { + col := ti.Columns[i] + backupCol := backupColMap[col.Name.L] + if backupCol == nil { + log.Error("missing column in backup data", + zap.Stringer("table", table.Info.Name), + zap.String("col", fmt.Sprintf("%s %s", col.Name, col.FieldType.String()))) + return errors.Annotatef(berrors.ErrRestoreIncompatibleSys, + "missing column in backup data, table: %s, col: %s %s", + table.Info.Name.O, + col.Name, col.FieldType.String()) + } + if !utils.IsTypeCompatible(backupCol.FieldType, col.FieldType) { + log.Error("incompatible column", + zap.Stringer("table", table.Info.Name), + zap.String("col in cluster", fmt.Sprintf("%s %s", col.Name, col.FieldType.String())), + zap.String("col in backup", fmt.Sprintf("%s %s", backupCol.Name, backupCol.FieldType.String()))) + return errors.Annotatef(berrors.ErrRestoreIncompatibleSys, + "incompatible column, table: %s, col in cluster: %s %s, col in backup: %s %s", + table.Info.Name.O, + col.Name, col.FieldType.String(), + backupCol.Name, backupCol.FieldType.String()) + } + } + } + return nil +} + // ExecDDLs executes the queries of the ddl jobs. func (rc *Client) ExecDDLs(ctx context.Context, ddlJobs []*model.Job) error { // Sort the ddl jobs by schema version in ascending order. @@ -1456,6 +1582,14 @@ func (rc *Client) getRuleID(tableID int64) string { return "restore-t" + strconv.FormatInt(tableID, 10) } +// IsFull returns whether this backup is full. +func (rc *Client) IsFull() bool { + failpoint.Inject("mock-incr-backup-data", func() { + failpoint.Return(false) + }) + return !rc.IsIncremental() +} + // IsIncremental returns whether this backup is incremental. func (rc *Client) IsIncremental() bool { return !(rc.backupMeta.StartVersion == rc.backupMeta.EndVersion || @@ -1558,40 +1692,24 @@ func (rc *Client) PreCheckTableClusterIndex( return nil } -const ( - streamBackupMetaPrefix = "v1/backupmeta" -) - -func GetStreamBackupMetaPrefix() string { - return streamBackupMetaPrefix -} - // ReadStreamMetaByTS is used for streaming task. collect all meta file by TS. func (rc *Client) ReadStreamMetaByTS(ctx context.Context, restoreTS uint64) ([]*backuppb.Metadata, error) { - streamBackupMetaFiles := make([]*backuppb.Metadata, 0) - opt := &storage.WalkOption{SubDir: GetStreamBackupMetaPrefix()} - err := rc.storage.WalkDir(ctx, opt, func(path string, size int64) error { - if strings.Contains(path, streamBackupMetaPrefix) { - m := &backuppb.Metadata{} - b, err := rc.storage.ReadFile(ctx, path) - if err != nil { - return errors.Trace(err) - } - err = m.Unmarshal(b) - if err != nil { - return errors.Trace(err) - } - // TODO find a way to filter some unnecessary meta files. - log.Debug("backup stream collect meta file", zap.String("file", path)) - streamBackupMetaFiles = append(streamBackupMetaFiles, m) - } + streamBackupMetaFiles := struct { + sync.Mutex + metas []*backuppb.Metadata + }{} + streamBackupMetaFiles.metas = make([]*backuppb.Metadata, 0, 128) + + err := stream.FastUnmarshalMetaData(ctx, rc.storage, func(path string, metadata *backuppb.Metadata) error { + streamBackupMetaFiles.Lock() + streamBackupMetaFiles.metas = append(streamBackupMetaFiles.metas, metadata) + streamBackupMetaFiles.Unlock() return nil }) if err != nil { return nil, errors.Trace(err) } - - return streamBackupMetaFiles, nil + return streamBackupMetaFiles.metas, nil } // ReadStreamDataFiles is used for streaming task. collect all meta file by TS. @@ -1620,6 +1738,15 @@ func (rc *Client) ReadStreamDataFiles( log.Debug("backup stream collect data file", zap.String("file", d.Path)) } } + + // sort files firstly. + slices.SortFunc(mFiles, func(i, j *backuppb.DataFileInfo) bool { + if i.ResolvedTs > 0 && j.ResolvedTs > 0 { + return i.ResolvedTs < j.ResolvedTs + } else { + return i.MaxTs < j.MaxTs + } + }) return dFiles, mFiles, nil } @@ -1686,6 +1813,7 @@ func (rc *Client) RestoreKVFiles( ctx context.Context, rules map[int64]*RewriteRules, files []*backuppb.DataFileInfo, + updateStats func(kvCount uint64, size uint64), onProgress func(), ) error { var err error @@ -1727,6 +1855,7 @@ func (rc *Client) RestoreKVFiles( fileStart := time.Now() defer func() { onProgress() + updateStats(uint64(file.NumberOfEntries), file.Length) summary.CollectInt("File", 1) log.Info("import files done", zap.String("name", file.Path), zap.Duration("take", time.Since(fileStart))) }() @@ -1836,7 +1965,7 @@ func (rc *Client) InitSchemasReplaceForDDL( }()...) } - return stream.NewSchemasReplace(dbMap, rc.currentTS, tableFilter, rc.GenGlobalID, rc.GenGlobalIDs), nil + return stream.NewSchemasReplace(dbMap, rc.currentTS, tableFilter, rc.GenGlobalID, rc.GenGlobalIDs, rc.InsertDeleteRangeForTable, rc.InsertDeleteRangeForIndex), nil } // RestoreMetaKVFiles tries to restore files about meta kv-event from stream-backup. @@ -1844,13 +1973,14 @@ func (rc *Client) RestoreMetaKVFiles( ctx context.Context, files []*backuppb.DataFileInfo, schemasReplace *stream.SchemasReplace, + updateStats func(kvCount uint64, size uint64), progressInc func(), ) error { filesInWriteCF := make([]*backuppb.DataFileInfo, 0, len(files)) // The k-v events in default CF should be restored firstly. The reason is that: - // The error of transactions of meta will happen, - // if restore default CF events successfully, but failed to restore write CF events. + // The error of transactions of meta could happen if restore write CF events successfully, + // but failed to restore default CF events. for _, f := range files { if f.Cf == stream.WriteCF { filesInWriteCF = append(filesInWriteCF, f) @@ -1864,19 +1994,21 @@ func (rc *Client) RestoreMetaKVFiles( continue } - err := rc.RestoreMetaKVFile(ctx, f, schemasReplace) + kvCount, size, err := rc.RestoreMetaKVFile(ctx, f, schemasReplace) if err != nil { return errors.Trace(err) } + updateStats(kvCount, size) progressInc() } // Restore files in write CF. for _, f := range filesInWriteCF { - err := rc.RestoreMetaKVFile(ctx, f, schemasReplace) + kvCount, size, err := rc.RestoreMetaKVFile(ctx, f, schemasReplace) if err != nil { return errors.Trace(err) } + updateStats(kvCount, size) progressInc() } @@ -1892,18 +2024,22 @@ func (rc *Client) RestoreMetaKVFile( ctx context.Context, file *backuppb.DataFileInfo, sr *stream.SchemasReplace, -) error { +) (uint64, uint64, error) { + var ( + kvCount uint64 + size uint64 + ) log.Info("restore meta kv events", zap.String("file", file.Path), - zap.String("cf", file.Cf), zap.Int64(("kv-count"), file.NumberOfEntries), + zap.String("cf", file.Cf), zap.Int64("kv-count", file.NumberOfEntries), zap.Uint64("min-ts", file.MinTs), zap.Uint64("max-ts", file.MaxTs)) rc.rawKVClient.SetColumnFamily(file.GetCf()) buff, err := rc.storage.ReadFile(ctx, file.Path) if err != nil { - return errors.Trace(err) + return 0, 0, errors.Trace(err) } if checksum := sha256.Sum256(buff); !bytes.Equal(checksum[:], file.GetSha256()) { - return errors.Annotatef(berrors.ErrInvalidMetaFile, + return 0, 0, errors.Annotatef(berrors.ErrInvalidMetaFile, "checksum mismatch expect %x, got %x", file.GetSha256(), checksum[:]) } @@ -1911,13 +2047,13 @@ func (rc *Client) RestoreMetaKVFile( for iter.Valid() { iter.Next() if iter.GetError() != nil { - return errors.Trace(iter.GetError()) + return 0, 0, errors.Trace(iter.GetError()) } txnEntry := kv.Entry{Key: iter.Key(), Value: iter.Value()} ts, err := GetKeyTS(txnEntry.Key) if err != nil { - return errors.Trace(err) + return 0, 0, errors.Trace(err) } // The commitTs in write CF need be limited on [startTs, restoreTs]. @@ -1943,7 +2079,7 @@ func (rc *Client) RestoreMetaKVFile( if err != nil { log.Error("rewrite txn entry failed", zap.Int("klen", len(txnEntry.Key)), logutil.Key("txn-key", txnEntry.Key)) - return errors.Trace(err) + return 0, 0, errors.Trace(err) } else if newEntry == nil { continue } @@ -1951,11 +2087,14 @@ func (rc *Client) RestoreMetaKVFile( zap.Int("newValue-len", len(txnEntry.Value)), zap.ByteString("newkey", newEntry.Key)) if err := rc.rawKVClient.Put(ctx, newEntry.Key, newEntry.Value, ts); err != nil { - return errors.Trace(err) + return 0, 0, errors.Trace(err) } + + kvCount += 1 + size += uint64(len(newEntry.Key) + len(newEntry.Value)) } - return rc.rawKVClient.PutRest(ctx) + return kvCount, size, rc.rawKVClient.PutRest(ctx) } func transferBoolToValue(enable bool) string { @@ -2041,6 +2180,111 @@ func (rc *Client) UpdateSchemaVersion(ctx context.Context) error { 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() + } +} + +// use channel to save the delete-range query to make it thread-safety. +func (rc *Client) RunGCRowsLoader(ctx context.Context) { + rc.deleteRangeQueryWaitGroup.Add(1) + + go func() { + defer rc.deleteRangeQueryWaitGroup.Done() + for { + select { + case <-ctx.Done(): + return + case query, ok := <-rc.deleteRangeQueryCh: + if !ok { + return + } + rc.deleteRangeQuery = append(rc.deleteRangeQuery, query) + } + } + }() +} + +// InsertGCRows insert the querys into table `gc_delete_range` +func (rc *Client) InsertGCRows(ctx context.Context) error { + close(rc.deleteRangeQueryCh) + rc.deleteRangeQueryWaitGroup.Wait() + ts, err := rc.GetTS(ctx) + if err != nil { + return errors.Trace(err) + } + for _, query := range rc.deleteRangeQuery { + if err := rc.db.se.ExecuteInternal(ctx, fmt.Sprintf(query, ts)); err != nil { + return errors.Trace(err) + } + } + return nil +} + +// only for unit test +func (rc *Client) GetGCRows() []string { + close(rc.deleteRangeQueryCh) + rc.deleteRangeQueryWaitGroup.Wait() + return rc.deleteRangeQuery +} + func (rc *Client) SaveSchemas( ctx context.Context, sr *stream.SchemasReplace, @@ -2054,7 +2298,7 @@ func (rc *Client) SaveSchemas( m.StartVersion = logStartTS }) - schemas := sr.TidyOldSchemas() + schemas := TidyOldSchemas(sr) schemasConcurrency := uint(mathutil.Min(64, schemas.Len())) err := schemas.BackupSchemas(ctx, metaWriter, nil, nil, rc.restoreTS, schemasConcurrency, 0, true, nil) if err != nil { @@ -2067,7 +2311,51 @@ func (rc *Client) SaveSchemas( return nil } +// InitFullClusterRestore init fullClusterRestore and set SkipGrantTable as needed +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 { + return rc.fullClusterRestore +} + // MockClient create a fake client used to test. func MockClient(dbs map[string]*utils.Database) *Client { return &Client{databases: dbs} } + +// TidyOldSchemas produces schemas information. +func TidyOldSchemas(sr *stream.SchemasReplace) *backup.Schemas { + var schemaIsEmpty bool + schemas := backup.NewBackupSchemas() + + for _, dr := range sr.DbMap { + if dr.OldDBInfo == nil { + continue + } + + schemaIsEmpty = true + for _, tr := range dr.TableMap { + if tr.OldTableInfo == nil { + continue + } + schemas.AddSchema(dr.OldDBInfo, tr.OldTableInfo) + schemaIsEmpty = false + } + + // backup this empty schema if it has nothing table. + if schemaIsEmpty { + schemas.AddSchema(dr.OldDBInfo, nil) + } + } + return schemas + +} diff --git a/br/pkg/restore/client_test.go b/br/pkg/restore/client_test.go index 08e57e83a7095..64da7f2a9e579 100644 --- a/br/pkg/restore/client_test.go +++ b/br/pkg/restore/client_test.go @@ -12,12 +12,15 @@ import ( "testing" "time" + "github.com/pingcap/failpoint" "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/gluetidb" "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/br/pkg/restore" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/types" @@ -105,6 +108,157 @@ func TestIsOnline(t *testing.T) { require.True(t, client.IsOnline()) } +func getStartedMockedCluster(t *testing.T) *mock.Cluster { + t.Helper() + cluster, err := mock.NewCluster() + require.NoError(t, err) + err = cluster.Start() + require.NoError(t, err) + return cluster +} + +func TestCheckTargetClusterFresh(t *testing.T) { + // cannot use shared `mc`, other parallel case may change it. + cluster := getStartedMockedCluster(t) + defer cluster.Stop() + + g := gluetidb.New() + client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + err := client.Init(g, cluster.Storage) + require.NoError(t, err) + + ctx := context.Background() + require.NoError(t, client.CheckTargetClusterFresh(ctx)) + + require.NoError(t, client.CreateDatabase(ctx, &model.DBInfo{Name: model.NewCIStr("user_db")})) + require.True(t, berrors.ErrRestoreNotFreshCluster.Equal(client.CheckTargetClusterFresh(ctx))) +} + +func TestCheckTargetClusterFreshWithTable(t *testing.T) { + // cannot use shared `mc`, other parallel case may change it. + cluster := getStartedMockedCluster(t) + defer cluster.Stop() + + g := gluetidb.New() + client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + err := client.Init(g, cluster.Storage) + require.NoError(t, err) + + ctx := context.Background() + info, err := cluster.Domain.GetSnapshotInfoSchema(math.MaxUint64) + require.NoError(t, err) + dbSchema, isExist := info.SchemaByName(model.NewCIStr("test")) + require.True(t, isExist) + intField := types.NewFieldType(mysql.TypeLong) + intField.SetCharset("binary") + table := &metautil.Table{ + DB: dbSchema, + Info: &model.TableInfo{ + ID: int64(1), + Name: model.NewCIStr("t"), + Columns: []*model.ColumnInfo{{ + ID: 1, + Name: model.NewCIStr("id"), + FieldType: *intField, + State: model.StatePublic, + }}, + Charset: "utf8mb4", + Collate: "utf8mb4_bin", + }, + } + _, _, err = client.CreateTables(cluster.Domain, []*metautil.Table{table}, 0) + require.NoError(t, err) + + require.True(t, berrors.ErrRestoreNotFreshCluster.Equal(client.CheckTargetClusterFresh(ctx))) +} + +func TestCheckSysTableCompatibility(t *testing.T) { + cluster := mc + g := gluetidb.New() + client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + err := client.Init(g, cluster.Storage) + require.NoError(t, err) + + info, err := cluster.Domain.GetSnapshotInfoSchema(math.MaxUint64) + require.NoError(t, err) + dbSchema, isExist := info.SchemaByName(model.NewCIStr(mysql.SystemDB)) + require.True(t, isExist) + tmpSysDB := dbSchema.Clone() + tmpSysDB.Name = utils.TemporaryDBName(mysql.SystemDB) + sysDB := model.NewCIStr(mysql.SystemDB) + userTI, err := client.GetTableSchema(cluster.Domain, sysDB, model.NewCIStr("user")) + require.NoError(t, err) + + // column count mismatch + mockedUserTI := userTI.Clone() + mockedUserTI.Columns = mockedUserTI.Columns[:len(mockedUserTI.Columns)-1] + err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ + DB: tmpSysDB, + Info: mockedUserTI, + }}) + require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) + + // column order mismatch(success) + mockedUserTI = userTI.Clone() + mockedUserTI.Columns[4], mockedUserTI.Columns[5] = mockedUserTI.Columns[5], mockedUserTI.Columns[4] + err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ + DB: tmpSysDB, + Info: mockedUserTI, + }}) + require.NoError(t, err) + + // missing column + mockedUserTI = userTI.Clone() + mockedUserTI.Columns[0].Name = model.NewCIStr("new-name") + err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ + DB: tmpSysDB, + Info: mockedUserTI, + }}) + require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) + + // incompatible column type + mockedUserTI = userTI.Clone() + mockedUserTI.Columns[0].FieldType.SetFlen(2000) // Columns[0] is `Host` char(255) + err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ + DB: tmpSysDB, + Info: mockedUserTI, + }}) + require.True(t, berrors.ErrRestoreIncompatibleSys.Equal(err)) + + // compatible + mockedUserTI = userTI.Clone() + err = client.CheckSysTableCompatibility(cluster.Domain, []*metautil.Table{{ + DB: tmpSysDB, + Info: mockedUserTI, + }}) + require.NoError(t, err) +} + +func TestInitFullClusterRestore(t *testing.T) { + cluster := mc + g := gluetidb.New() + client := restore.NewRestoreClient(cluster.PDClient, nil, defaultKeepaliveCfg, false) + err := client.Init(g, cluster.Storage) + require.NoError(t, err) + + // explicit filter + client.InitFullClusterRestore(true) + require.False(t, client.IsFullClusterRestore()) + + client.InitFullClusterRestore(false) + require.True(t, client.IsFullClusterRestore()) + // set it to false again + client.InitFullClusterRestore(true) + require.False(t, client.IsFullClusterRestore()) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/br/pkg/restore/mock-incr-backup-data", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/br/pkg/restore/mock-incr-backup-data")) + }() + client.InitFullClusterRestore(false) + require.False(t, client.IsFullClusterRestore()) +} + func TestPreCheckTableClusterIndex(t *testing.T) { m := mc g := gluetidb.New() @@ -351,3 +505,50 @@ func TestSetSpeedLimit(t *testing.T) { require.Equal(t, mockStores[i].Id, recordStores.stores[i]) } } + +func TestDeleteRangeQuery(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() + client := restore.NewRestoreClient(fakePDClient{ + stores: mockStores, + }, 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}) + + elementID := int64(1) + client.InsertDeleteRangeForIndex(7, &elementID, 8, []int64{1}) + client.InsertDeleteRangeForIndex(9, &elementID, 10, []int64{1, 2}) + + 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)") +} diff --git a/br/pkg/restore/db.go b/br/pkg/restore/db.go index a7b29a3e90a00..1e45725f920fc 100644 --- a/br/pkg/restore/db.go +++ b/br/pkg/restore/db.go @@ -461,6 +461,8 @@ func GetExistedUserDBs(dom *domain.Domain) []*model.DBInfo { if tidbutil.IsMemOrSysDB(dbName) { continue } else if dbName == "test" && len(db.Tables) == 0 { + // tidb create test db on fresh cluster + // if it's empty we don't take it as user db continue } else { existedDatabases = append(existedDatabases, db) diff --git a/br/pkg/restore/db_test.go b/br/pkg/restore/db_test.go index a3279ddaad3d9..89ff7a9ab62a4 100644 --- a/br/pkg/restore/db_test.go +++ b/br/pkg/restore/db_test.go @@ -194,7 +194,7 @@ func TestFilterDDLJobs(t *testing.T) { metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, false, "", &cipher) ctx := context.Background() metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) - err = backup.WriteBackupDDLJobs(metaWriter, s.mock.Storage, lastTS, ts) + err = backup.WriteBackupDDLJobs(metaWriter, tk.Session(), s.mock.Storage, lastTS, ts) require.NoErrorf(t, err, "Error get ddl jobs: %s", err) err = metaWriter.FinishWriteMetas(ctx, metautil.AppendDDL) require.NoErrorf(t, err, "Flush failed", err) @@ -258,7 +258,7 @@ func TestFilterDDLJobsV2(t *testing.T) { metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, true, "", &cipher) ctx := context.Background() metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) - err = backup.WriteBackupDDLJobs(metaWriter, s.mock.Storage, lastTS, ts) + err = backup.WriteBackupDDLJobs(metaWriter, tk.Session(), s.mock.Storage, lastTS, ts) require.NoErrorf(t, err, "Error get ddl jobs: %s", err) err = metaWriter.FinishWriteMetas(ctx, metautil.AppendDDL) require.NoErrorf(t, err, "Flush failed", err) diff --git a/br/pkg/restore/import_retry.go b/br/pkg/restore/import_retry.go index f770ab79eba30..17c706c9e4444 100644 --- a/br/pkg/restore/import_retry.go +++ b/br/pkg/restore/import_retry.go @@ -107,30 +107,35 @@ func (o *OverRegionsInRangeController) handleInRegionError(ctx context.Context, return true } +func (o *OverRegionsInRangeController) prepareLogCtx(ctx context.Context) context.Context { + lctx := logutil.ContextWithField( + ctx, + logutil.Key("startKey", o.start), + logutil.Key("endKey", o.end), + ) + return lctx +} + // Run executes the `regionFunc` over the regions in `o.start` and `o.end`. // It would retry the errors according to the `rpcResponse`. func (o *OverRegionsInRangeController) Run(ctx context.Context, f RegionFunc) error { + return o.runOverRegions(o.prepareLogCtx(ctx), f) +} + +func (o *OverRegionsInRangeController) runOverRegions(ctx context.Context, f RegionFunc) error { if !o.rs.ShouldRetry() { return o.errors } - tctx, cancel := context.WithTimeout(ctx, importScanRegionTime) - defer cancel() + // Scan regions covered by the file range regionInfos, errScanRegion := PaginateScanRegion( - tctx, o.metaClient, o.start, o.end, ScanRegionPaginationLimit) + ctx, o.metaClient, o.start, o.end, ScanRegionPaginationLimit) if errScanRegion != nil { return errors.Trace(errScanRegion) } - // Try to download and ingest the file in every region - lctx := logutil.ContextWithField( - ctx, - logutil.Key("startKey", o.start), - logutil.Key("endKey", o.end), - ) - for _, region := range regionInfos { - cont, err := o.runInRegion(lctx, f, region) + cont, err := o.runInRegion(ctx, f, region) if err != nil { return err } @@ -157,7 +162,7 @@ func (o *OverRegionsInRangeController) runInRegion(ctx context.Context, f Region case StrategyFromThisRegion: logutil.CL(ctx).Warn("retry for region", logutil.Region(region.Region), logutil.ShortError(&result)) if !o.handleInRegionError(ctx, result, region) { - return false, o.Run(ctx, f) + return false, o.runOverRegions(ctx, f) } return o.runInRegion(ctx, f, region) case StrategyFromStart: @@ -165,7 +170,7 @@ func (o *OverRegionsInRangeController) runInRegion(ctx context.Context, f Region // TODO: make a backoffer considering more about the error info, // instead of ingore the result and retry. time.Sleep(o.rs.ExponentialBackoff()) - return false, o.Run(ctx, f) + return false, o.runOverRegions(ctx, f) } } return true, nil @@ -229,6 +234,7 @@ func (r *RPCResult) StrategyForRetryGoError() RetryStrategy { if r.Err == nil { return StrategyGiveUp } + // 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() { diff --git a/br/pkg/restore/import_retry_test.go b/br/pkg/restore/import_retry_test.go index 62817eaf92173..4349d9ffc2435 100644 --- a/br/pkg/restore/import_retry_test.go +++ b/br/pkg/restore/import_retry_test.go @@ -6,6 +6,8 @@ import ( "context" "encoding/hex" "fmt" + "os" + "strconv" "testing" "time" @@ -32,7 +34,7 @@ func assertDecode(t *testing.T, key []byte) []byte { } func assertRegions(t *testing.T, regions []*restore.RegionInfo, keys ...string) { - require.Equal(t, len(regions)+1, len(keys)) + require.Equal(t, len(regions)+1, len(keys), "%+v\nvs\n%+v", regions, keys) last := keys[0] for i, r := range regions { start := assertDecode(t, r.Region.StartKey) @@ -127,7 +129,7 @@ func TestNotLeader(t *testing.T) { func printRegion(name string, infos []*restore.RegionInfo) { fmt.Printf(">>>>> %s <<<<<\n", name) for _, info := range infos { - fmt.Printf("[%d] %s ~ %s\n", info.Region.Id, hex.EncodeToString(info.Region.StartKey), hex.EncodeToString(info.Region.EndKey)) + fmt.Printf("[%04d] %s ~ %s\n", info.Region.Id, hex.EncodeToString(info.Region.StartKey), hex.EncodeToString(info.Region.EndKey)) } fmt.Printf("<<<<< %s >>>>>\n", name) } @@ -135,7 +137,7 @@ func printRegion(name string, infos []*restore.RegionInfo) { func printPDRegion(name string, infos []*pdtypes.Region) { fmt.Printf(">>>>> %s <<<<<\n", name) for _, info := range infos { - fmt.Printf("[%d] %s ~ %s\n", info.Meta.Id, hex.EncodeToString(info.Meta.StartKey), hex.EncodeToString(info.Meta.EndKey)) + fmt.Printf("[%04d] %s ~ %s\n", info.Meta.Id, hex.EncodeToString(info.Meta.StartKey), hex.EncodeToString(info.Meta.EndKey)) } fmt.Printf("<<<<< %s >>>>>\n", name) } @@ -316,3 +318,29 @@ func TestWrappedError(t *testing.T) { result = restore.RPCResultFromError(errors.Trace(status.Error(codes.Unknown, "the server said something hard to understand"))) require.Equal(t, result.StrategyForRetry(), restore.StrategyGiveUp) } + +func envInt(name string, def int) int { + lit := os.Getenv(name) + r, err := strconv.Atoi(lit) + if err != nil { + return def + } + return r +} + +func TestPaginateScanLeader(t *testing.T) { + // region: [, aay), [aay, bba), [bba, bbh), [bbh, cca), [cca, ) + cli := initTestClient() + rs := utils.InitialRetryState(2, time.Millisecond, 10*time.Millisecond) + ctl := restore.OverRegionsInRange([]byte("aa"), []byte("aaz"), cli, &rs) + ctx := context.Background() + + cli.InjectErr = true + cli.InjectTimes = int32(envInt("PAGINATE_SCAN_LEADER_FAILURE_COUNT", 2)) + collectedRegions := []*restore.RegionInfo{} + ctl.Run(ctx, func(ctx context.Context, r *restore.RegionInfo) restore.RPCResult { + collectedRegions = append(collectedRegions, r) + return restore.RPCResultOK() + }) + assertRegions(t, collectedRegions, "", "aay", "bba") +} diff --git a/br/pkg/restore/search.go b/br/pkg/restore/search.go new file mode 100644 index 0000000000000..65078f5b6af1e --- /dev/null +++ b/br/pkg/restore/search.go @@ -0,0 +1,309 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package restore + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/base64" + "encoding/hex" + "sort" + "strings" + "sync" + + "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/stream" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/util/codec" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" +) + +// Comparator is used for comparing the relationship of src and dst +type Comparator interface { + Compare(src, dst []byte) bool +} + +// startWithComparator is used for comparing whether src starts with dst +type startWithComparator struct{} + +// NewStartWithComparator create a comparator to compare whether src starts with dst +func NewStartWithComparator() Comparator { + return new(startWithComparator) +} + +// Compare whether src starts with dst +func (ec *startWithComparator) Compare(src, dst []byte) bool { + return bytes.HasPrefix(src, dst) +} + +// StreamKVInfo stores kv info searched from log data files +type StreamKVInfo struct { + Key string `json:"key"` + EncodedKey string `json:"-"` + WriteType byte `json:"write-type"` + StartTs uint64 `json:"start-ts"` + CommitTs uint64 `json:"commit-ts"` + CFName string `json:"cf-name"` + Value string `json:"value,omitempty"` + ShortValue string `json:"short-value,omitempty"` +} + +// StreamBackupSearch is used for searching key from log data files +type StreamBackupSearch struct { + storage storage.ExternalStorage + comparator Comparator + searchKey []byte // hex string + startTs uint64 + endTs uint64 +} + +// NewStreamBackupSearch creates an instance of StreamBackupSearch +func NewStreamBackupSearch(storage storage.ExternalStorage, comparator Comparator, searchKey []byte) *StreamBackupSearch { + bs := &StreamBackupSearch{ + storage: storage, + comparator: comparator, + } + + bs.searchKey = codec.EncodeBytes([]byte{}, searchKey) + return bs +} + +// SetStartTS set start timestamp searched from +func (s *StreamBackupSearch) SetStartTS(startTs uint64) { + s.startTs = startTs +} + +// SetEndTs set end timestamp searched to +func (s *StreamBackupSearch) SetEndTs(endTs uint64) { + s.endTs = endTs +} + +func (s *StreamBackupSearch) readDataFiles(ctx context.Context, ch chan<- *backuppb.DataFileInfo) error { + opt := &storage.WalkOption{SubDir: stream.GetStreamBackupMetaPrefix()} + pool := utils.NewWorkerPool(64, "read backup meta") + eg, egCtx := errgroup.WithContext(ctx) + err := s.storage.WalkDir(egCtx, opt, func(path string, size int64) error { + if !strings.Contains(path, stream.GetStreamBackupMetaPrefix()) { + return nil + } + + pool.ApplyOnErrorGroup(eg, func() error { + m := &backuppb.Metadata{} + b, err := s.storage.ReadFile(egCtx, path) + if err != nil { + return errors.Trace(err) + } + err = m.Unmarshal(b) + if err != nil { + return errors.Trace(err) + } + + s.resolveMetaData(egCtx, m, ch) + log.Debug("read backup meta file", zap.String("path", path)) + return nil + }) + + return nil + }) + + if err != nil { + return errors.Trace(err) + } + + return eg.Wait() +} + +func (s *StreamBackupSearch) resolveMetaData(ctx context.Context, metaData *backuppb.Metadata, ch chan<- *backuppb.DataFileInfo) { + for _, file := range metaData.Files { + if file.IsMeta { + continue + } + + // TODO dynamically configure filter policy + if bytes.Compare(s.searchKey, file.StartKey) < 0 { + continue + } + if bytes.Compare(s.searchKey, file.EndKey) > 0 { + continue + } + + if s.startTs > 0 { + if file.MaxTs < s.startTs { + continue + } + } + if s.endTs > 0 { + if file.MinTs > s.endTs { + continue + } + } + + ch <- file + } +} + +// Search kv entries from log data files +func (s *StreamBackupSearch) Search(ctx context.Context) ([]*StreamKVInfo, error) { + dataFilesCh := make(chan *backuppb.DataFileInfo, 32) + entriesCh, errCh := make(chan *StreamKVInfo, 64), make(chan error, 8) + go func() { + defer close(dataFilesCh) + if err := s.readDataFiles(ctx, dataFilesCh); err != nil { + errCh <- err + } + }() + + pool := utils.NewWorkerPool(16, "search key") + var wg sync.WaitGroup + + for dataFile := range dataFilesCh { + wg.Add(1) + file := dataFile + pool.Apply(func() { + defer wg.Done() + if err := s.searchFromDataFile(ctx, file, entriesCh); err != nil { + errCh <- err + } + }) + } + + go func() { + wg.Wait() + close(entriesCh) + close(errCh) + }() + + for err := range errCh { + return nil, errors.Trace(err) + } + + defaultCFEntries := make(map[string]*StreamKVInfo, 64) + writeCFEntries := make(map[string]*StreamKVInfo, 64) + + for entry := range entriesCh { + if entry.CFName == writeCFName { + writeCFEntries[entry.EncodedKey] = entry + } else if entry.CFName == defaultCFName { + defaultCFEntries[entry.EncodedKey] = entry + } + } + + entries := s.mergeCFEntries(defaultCFEntries, writeCFEntries) + return entries, nil +} + +func (s *StreamBackupSearch) searchFromDataFile(ctx context.Context, dataFile *backuppb.DataFileInfo, ch chan<- *StreamKVInfo) error { + buff, err := s.storage.ReadFile(ctx, dataFile.Path) + if err != nil { + return errors.Annotatef(err, "read data file error, file: %s", dataFile.Path) + } + + if checksum := sha256.Sum256(buff); !bytes.Equal(checksum[:], dataFile.GetSha256()) { + return errors.Annotatef(err, "validate checksum failed, file: %s", dataFile.Path) + } + + iter := stream.NewEventIterator(buff) + for iter.Valid() { + iter.Next() + if err := iter.GetError(); err != nil { + return errors.Trace(err) + } + + k, v := iter.Key(), iter.Value() + if !s.comparator.Compare(k, s.searchKey) { + continue + } + + _, ts, err := codec.DecodeUintDesc(k[len(k)-8:]) + if err != nil { + return errors.Annotatef(err, "decode ts from key error, file: %s", dataFile.Path) + } + + k = k[:len(k)-8] + _, rawKey, err := codec.DecodeBytes(k, nil) + if err != nil { + return errors.Annotatef(err, "decode raw key error, file: %s", dataFile.Path) + } + + if dataFile.Cf == writeCFName { + rawWriteCFValue := new(stream.RawWriteCFValue) + if err := rawWriteCFValue.ParseFrom(v); err != nil { + return errors.Annotatef(err, "parse raw write cf value error, file: %s", dataFile.Path) + } + + valueStr := "" + if rawWriteCFValue.HasShortValue() { + valueStr = base64.StdEncoding.EncodeToString(rawWriteCFValue.GetShortValue()) + } + + kvInfo := &StreamKVInfo{ + WriteType: rawWriteCFValue.GetWriteType(), + CFName: dataFile.Cf, + CommitTs: ts, + StartTs: rawWriteCFValue.GetStartTs(), + Key: strings.ToUpper(hex.EncodeToString(rawKey)), + EncodedKey: hex.EncodeToString(iter.Key()), + ShortValue: valueStr, + } + ch <- kvInfo + } else if dataFile.Cf == defaultCFName { + kvInfo := &StreamKVInfo{ + CFName: dataFile.Cf, + StartTs: ts, + Key: strings.ToUpper(hex.EncodeToString(rawKey)), + EncodedKey: hex.EncodeToString(iter.Key()), + Value: base64.StdEncoding.EncodeToString(v), + } + ch <- kvInfo + } + } + + log.Info("finish search data file", zap.String("file", dataFile.Path)) + return nil +} + +func (s *StreamBackupSearch) mergeCFEntries(defaultCFEntries, writeCFEntries map[string]*StreamKVInfo) []*StreamKVInfo { + entries := make([]*StreamKVInfo, 0, len(defaultCFEntries)+len(writeCFEntries)) + mergedDefaultCFKeys := make(map[string]struct{}, 16) + for _, entry := range writeCFEntries { + entries = append(entries, entry) + if entry.ShortValue != "" { + continue + } + + keyBytes, err := hex.DecodeString(entry.Key) + if err != nil { + log.Warn("hex decode key failed", zap.String("key", entry.Key), zap.String("encode-key", entry.EncodedKey), zap.Error(err)) + continue + } + + encodedKey := codec.EncodeBytes([]byte{}, keyBytes) + defaultCFKey := hex.EncodeToString(codec.EncodeUintDesc(encodedKey, entry.StartTs)) + defaultCFEntry, ok := defaultCFEntries[defaultCFKey] + if !ok { + continue + } + + entry.Value = defaultCFEntry.Value + mergedDefaultCFKeys[defaultCFKey] = struct{}{} + } + + for key, entry := range defaultCFEntries { + if _, ok := mergedDefaultCFKeys[key]; ok { + continue + } + + entries = append(entries, entry) + } + + sort.Slice(entries, func(i, j int) bool { + return entries[i].CommitTs < entries[j].CommitTs + }) + + return entries +} diff --git a/br/pkg/restore/search_test.go b/br/pkg/restore/search_test.go new file mode 100644 index 0000000000000..6af96b10b3536 --- /dev/null +++ b/br/pkg/restore/search_test.go @@ -0,0 +1,203 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package restore + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "strings" + "testing" + "time" + + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/stream" + "github.com/pingcap/tidb/util/codec" + "github.com/stretchr/testify/require" +) + +func TestStartWithComparator(t *testing.T) { + comparator := NewStartWithComparator() + require.True(t, comparator.Compare([]byte("aa_key"), []byte("aa"))) + require.False(t, comparator.Compare([]byte("aa_key"), []byte("aak"))) + require.False(t, comparator.Compare([]byte("aa_key"), []byte("bb"))) +} + +func fakeStorage(t *testing.T) storage.ExternalStorage { + baseDir := t.TempDir() + s, err := storage.NewLocalStorage(baseDir) + require.NoError(t, err) + return s +} + +func encodeKey(key string, ts int64) []byte { + encodedKey := codec.EncodeBytes([]byte{}, []byte(key)) + return codec.EncodeUintDesc(encodedKey, uint64(ts)) +} + +func encodeShortValue(val string, ts int64) []byte { + flagShortValuePrefix := byte('v') + valBytes := []byte(val) + buff := make([]byte, 0, 11+len(valBytes)) + buff = append(buff, byte('P')) + buff = codec.EncodeUvarint(buff, uint64(ts)) + buff = append(buff, flagShortValuePrefix) + buff = append(buff, byte(len(valBytes))) + buff = append(buff, valBytes...) + return buff +} + +type cf struct { + key string + startTs int64 + commitTS int64 + val string +} + +func fakeCFs() (defaultCFs, writeCFs []*cf) { + defaultCFs = []*cf{ + { + key: "aa_big_key_1", + startTs: time.Now().UnixNano(), + val: "aa_big_val_1", + }, + { + key: "bb_big_key_1", + startTs: time.Now().UnixNano(), + val: "bb_big_val_1", + }, + { + key: "cc_big_key_1", + startTs: time.Now().UnixNano(), + val: "cc_big_val_1", + }, + } + + writeCFs = []*cf{ + { + key: "aa_small_key_1", + startTs: time.Now().UnixNano(), + commitTS: time.Now().UnixNano(), + val: "aa_small_val_1", + }, + { + key: "aa_big_key_1", + startTs: defaultCFs[0].startTs, + commitTS: time.Now().UnixNano(), + val: "aa_short_val_1", + }, + { + key: "bb_small_key_1", + startTs: time.Now().UnixNano(), + commitTS: time.Now().UnixNano(), + val: "bb_small_val_1", + }, + { + key: "bb_big_key_1", + startTs: defaultCFs[1].startTs, + commitTS: time.Now().UnixNano(), + val: "bb_short_val_1", + }, + } + + return +} + +func fakeDataFile(t *testing.T, s storage.ExternalStorage) (defaultCFDataFile, writeCFDataFile *backuppb.DataFileInfo) { + const ( + defaultCFFile = "default_cf" + writeCFFile = "write_cf" + ) + defaultCFs, writeCFs := fakeCFs() + ctx := context.Background() + defaultCFBuf := bytes.NewBuffer([]byte{}) + for _, defaultCF := range defaultCFs { + defaultCFBuf.Write(stream.EncodeKVEntry(encodeKey(defaultCF.key, defaultCF.startTs), []byte(defaultCF.val))) + } + + err := s.WriteFile(ctx, defaultCFFile, defaultCFBuf.Bytes()) + require.NoError(t, err) + defaultCFCheckSum := sha256.Sum256(defaultCFBuf.Bytes()) + defaultCFDataFile = &backuppb.DataFileInfo{ + Path: defaultCFFile, + Cf: defaultCFName, + Sha256: defaultCFCheckSum[:], + } + + writeCFBuf := bytes.NewBuffer([]byte{}) + for _, writeCF := range writeCFs { + writeCFBuf.Write(stream.EncodeKVEntry(encodeKey(writeCF.key, writeCF.commitTS), encodeShortValue(writeCF.val, writeCF.startTs))) + } + + err = s.WriteFile(ctx, writeCFFile, writeCFBuf.Bytes()) + require.NoError(t, err) + writeCFCheckSum := sha256.Sum256(writeCFBuf.Bytes()) + writeCFDataFile = &backuppb.DataFileInfo{ + Path: writeCFFile, + Cf: writeCFName, + Sha256: writeCFCheckSum[:], + } + + return +} + +func TestSearchFromDataFile(t *testing.T) { + s := fakeStorage(t) + defaultCFDataFile, writeCFDataFile := fakeDataFile(t, s) + comparator := NewStartWithComparator() + searchKey := []byte("aa_big_key_1") + bs := NewStreamBackupSearch(s, comparator, searchKey) + ch := make(chan *StreamKVInfo, 16) + ctx := context.Background() + + err := bs.searchFromDataFile(ctx, defaultCFDataFile, ch) + require.NoError(t, err) + err = bs.searchFromDataFile(ctx, writeCFDataFile, ch) + require.NoError(t, err) + close(ch) + + hexSearchKey := strings.ToUpper(hex.EncodeToString(searchKey)) + searchKeyCount := 0 + for kvEntry := range ch { + require.True(t, strings.HasPrefix(kvEntry.Key, hexSearchKey)) + searchKeyCount++ + } + + require.Equal(t, 2, searchKeyCount) +} + +func TestMergeCFEntries(t *testing.T) { + defaultCFs, writeCFs := fakeCFs() + defaultCFEntries := make(map[string]*StreamKVInfo, 8) + writeCFEntries := make(map[string]*StreamKVInfo, 8) + + for _, defaultCF := range defaultCFs { + encodedKey := hex.EncodeToString(encodeKey(defaultCF.key, defaultCF.startTs)) + defaultCFEntries[encodedKey] = &StreamKVInfo{ + Key: hex.EncodeToString([]byte(defaultCF.key)), + EncodedKey: encodedKey, + StartTs: uint64(defaultCF.startTs), + CFName: defaultCFName, + Value: defaultCF.val, + } + } + for _, writeCF := range writeCFs { + encodedKey := hex.EncodeToString(encodeKey(writeCF.key, writeCF.commitTS)) + writeCFEntries[encodedKey] = &StreamKVInfo{ + Key: hex.EncodeToString([]byte(writeCF.key)), + EncodedKey: encodedKey, + StartTs: uint64(writeCF.startTs), + CommitTs: uint64(writeCF.commitTS), + CFName: writeCFName, + Value: writeCF.val, + } + } + + s := fakeStorage(t) + comparator := NewStartWithComparator() + bs := NewStreamBackupSearch(s, comparator, []byte{}) + kvEntries := bs.mergeCFEntries(defaultCFEntries, writeCFEntries) + require.Equal(t, len(writeCFs)+1, len(kvEntries)) +} diff --git a/br/pkg/restore/split.go b/br/pkg/restore/split.go index 00ff0dc44cbde..a0aa6810ae195 100644 --- a/br/pkg/restore/split.go +++ b/br/pkg/restore/split.go @@ -12,6 +12,7 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" sst "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/log" @@ -50,7 +51,7 @@ const ( ) var ( - ScanRegionAttemptTimes = 30 + ScanRegionAttemptTimes = 60 ) // RegionSplitter is a executor of region split by rules. @@ -482,17 +483,24 @@ type scanRegionBackoffer struct { } func newScanRegionBackoffer() utils.Backoffer { + attempt := ScanRegionAttemptTimes + // only use for test. + failpoint.Inject("scanRegionBackoffer", func(val failpoint.Value) { + if val.(bool) { + attempt = 3 + } + }) return &scanRegionBackoffer{ - attempt: ScanRegionAttemptTimes, + attempt: attempt, } } // NextBackoff returns a duration to wait before retrying again func (b *scanRegionBackoffer) NextBackoff(err error) time.Duration { if berrors.ErrPDBatchScanRegion.Equal(err) { - // 500ms * 30 could be enough for splitting remain regions in the hole. + // 1s * 60 could be enough for splitting remain regions in the hole. b.attempt-- - return 500 * time.Millisecond + return time.Second } b.attempt = 0 return 0 diff --git a/br/pkg/restore/stream_metas.go b/br/pkg/restore/stream_metas.go index 716d994822850..57ebe35eb81d7 100644 --- a/br/pkg/restore/stream_metas.go +++ b/br/pkg/restore/stream_metas.go @@ -5,11 +5,16 @@ package restore import ( "context" "strconv" + "sync" "github.com/pingcap/errors" 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/storage" + "github.com/pingcap/tidb/br/pkg/stream" + "github.com/pingcap/tidb/util/mathutil" + "go.uber.org/zap" ) type StreamMetadataSet struct { @@ -22,22 +27,23 @@ type StreamMetadataSet struct { // LoadFrom loads data from an external storage into the stream metadata set. func (ms *StreamMetadataSet) LoadFrom(ctx context.Context, s storage.ExternalStorage) error { - ms.metadata = map[string]*backuppb.Metadata{} - ms.writeback = map[string]*backuppb.Metadata{} - opt := &storage.WalkOption{SubDir: GetStreamBackupMetaPrefix()} - return s.WalkDir(ctx, opt, func(path string, size int64) error { - // Maybe load them lazily for preventing out of memory? - bs, err := s.ReadFile(ctx, path) - if err != nil { - return errors.Annotatef(err, "failed to read file %s", path) - } - var meta backuppb.Metadata - if err := meta.Unmarshal(bs); err != nil { - return errors.Annotatef(err, "failed to unmarshal file %s, maybe corrupted", path) - } - ms.metadata[path] = &meta + metadataMap := struct { + sync.Mutex + metas map[string]*backuppb.Metadata + }{} + ms.writeback = make(map[string]*backuppb.Metadata) + metadataMap.metas = make(map[string]*backuppb.Metadata) + err := stream.FastUnmarshalMetaData(ctx, s, func(path string, m *backuppb.Metadata) error { + metadataMap.Lock() + metadataMap.metas[path] = m + metadataMap.Unlock() return nil }) + if err != nil { + return errors.Trace(err) + } + ms.metadata = metadataMap.metas + return nil } func (ms *StreamMetadataSet) iterateDataFiles(f func(d *backuppb.DataFileInfo) (shouldBreak bool)) { @@ -50,6 +56,21 @@ func (ms *StreamMetadataSet) iterateDataFiles(f func(d *backuppb.DataFileInfo) ( } } +// CalculateShiftTS calculates the shift-ts. +func (ms *StreamMetadataSet) CalculateShiftTS(startTS uint64) uint64 { + metadatas := make([]*backuppb.Metadata, 0, len(ms.metadata)) + for _, m := range ms.metadata { + metadatas = append(metadatas, m) + } + + minBeginTS, exist := CalculateShiftTS(metadatas, startTS, mathutil.MaxUint) + if !exist { + minBeginTS = startTS + } + log.Warn("calculate shift-ts", zap.Uint64("start-ts", startTS), zap.Uint64("shift-ts", minBeginTS)) + return minBeginTS +} + // IterateFilesFullyBefore runs the function over all files contain data before the timestamp only. // 0 before // |------------------------------------------| @@ -211,3 +232,35 @@ func SetTSToFile( content := strconv.FormatUint(safepoint, 10) return truncateAndWrite(ctx, s, filename, []byte(content)) } + +// CalculateShiftTS gets the minimal begin-ts about transaction according to the kv-event in write-cf. +func CalculateShiftTS( + metas []*backuppb.Metadata, + startTS uint64, + restoreTS uint64, +) (uint64, bool) { + var ( + minBeginTS uint64 + isExist bool + ) + for _, m := range metas { + if len(m.Files) == 0 || m.MinTs > restoreTS || m.MaxTs < startTS { + continue + } + + for _, d := range m.Files { + if d.Cf == stream.DefaultCF || d.MinBeginTsInDefaultCf == 0 { + continue + } + if d.MinTs > restoreTS || d.MaxTs < startTS { + continue + } + if d.MinBeginTsInDefaultCf < minBeginTS || !isExist { + isExist = true + minBeginTS = d.MinBeginTsInDefaultCf + } + } + } + + return minBeginTS, isExist +} diff --git a/br/pkg/restore/stream_metas_test.go b/br/pkg/restore/stream_metas_test.go index 0eca7b4f86b47..e7e1607f4a0cf 100644 --- a/br/pkg/restore/stream_metas_test.go +++ b/br/pkg/restore/stream_metas_test.go @@ -14,6 +14,8 @@ import ( "github.com/pingcap/log" "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/util/mathutil" "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -47,7 +49,7 @@ func fakeStreamBackup(s storage.ExternalStorage) error { if err != nil { panic("failed to marshal test meta") } - name := fmt.Sprintf("%s/%04d.meta", restore.GetStreamBackupMetaPrefix(), i) + name := fmt.Sprintf("%s/%04d.meta", stream.GetStreamBackupMetaPrefix(), i) if err = s.WriteFile(ctx, name, bs); err != nil { return errors.Trace(err) } @@ -60,7 +62,7 @@ func fakeStreamBackup(s storage.ExternalStorage) error { func TestTruncateLog(t *testing.T) { ctx := context.Background() tmpdir := t.TempDir() - backupMetaDir := filepath.Join(tmpdir, restore.GetStreamBackupMetaPrefix()) + backupMetaDir := filepath.Join(tmpdir, stream.GetStreamBackupMetaPrefix()) _, err := storage.NewLocalStorage(backupMetaDir) require.NoError(t, err) @@ -103,7 +105,7 @@ func TestTruncateLog(t *testing.T) { }) l.WalkDir(ctx, &storage.WalkOption{ - SubDir: restore.GetStreamBackupMetaPrefix(), + SubDir: stream.GetStreamBackupMetaPrefix(), }, func(s string, i int64) error { require.NotContains(t, deletedFiles, s) return nil @@ -128,3 +130,72 @@ func TestTruncateSafepoint(t *testing.T) { require.Equal(t, ts, n, "failed at %d round: truncate safepoint mismatch", i) } } + +func fakeMetaDatas(cf string) []*backuppb.Metadata { + ms := []*backuppb.Metadata{ + { + StoreId: 1, + MinTs: 1500, + MaxTs: 2000, + Files: []*backuppb.DataFileInfo{ + { + MinTs: 1500, + MaxTs: 2000, + Cf: cf, + MinBeginTsInDefaultCf: 800, + }, + }, + }, + { + StoreId: 2, + MinTs: 3000, + MaxTs: 4000, + Files: []*backuppb.DataFileInfo{ + { + MinTs: 3000, + MaxTs: 4000, + Cf: cf, + MinBeginTsInDefaultCf: 2000, + }, + }, + }, + { + StoreId: 3, + MinTs: 5100, + MaxTs: 6100, + Files: []*backuppb.DataFileInfo{ + { + MinTs: 5100, + MaxTs: 6100, + Cf: cf, + MinBeginTsInDefaultCf: 1800, + }, + }, + }, + } + return ms +} + +func TestCalculateShiftTS(t *testing.T) { + var ( + startTs uint64 = 2900 + restoreTS uint64 = 4500 + ) + + ms := fakeMetaDatas(stream.WriteCF) + shiftTS, exist := restore.CalculateShiftTS(ms, startTs, restoreTS) + require.Equal(t, shiftTS, uint64(2000)) + require.Equal(t, exist, true) + + shiftTS, exist = restore.CalculateShiftTS(ms, startTs, mathutil.MaxUint) + require.Equal(t, shiftTS, uint64(1800)) + require.Equal(t, exist, true) + + shiftTS, exist = restore.CalculateShiftTS(ms, 1999, 3001) + require.Equal(t, shiftTS, uint64(800)) + require.Equal(t, exist, true) + + ms = fakeMetaDatas(stream.DefaultCF) + _, exist = restore.CalculateShiftTS(ms, startTs, restoreTS) + require.Equal(t, exist, false) +} diff --git a/br/pkg/restore/systable_restore.go b/br/pkg/restore/systable_restore.go index b0f588fa2286c..edbf1629f2e80 100644 --- a/br/pkg/restore/systable_restore.go +++ b/br/pkg/restore/systable_restore.go @@ -5,6 +5,7 @@ package restore import ( "context" "fmt" + "strings" "github.com/pingcap/errors" "github.com/pingcap/log" @@ -33,16 +34,7 @@ var unRecoverableTable = map[string]struct{}{ "tidb": {}, "global_variables": {}, - // all user related tables cannot be recovered for now. "column_stats_usage": {}, - "columns_priv": {}, - "db": {}, - "default_roles": {}, - "global_grants": {}, - "global_priv": {}, - "role_edges": {}, - "tables_priv": {}, - "user": {}, "capture_plan_baselines_blacklist": {}, // gc info don't need to recover. "gc_delete_range": {}, @@ -52,6 +44,17 @@ var unRecoverableTable = map[string]struct{}{ "schema_index_usage": {}, } +var sysPrivilegeTableSet = map[string]bool{ + "user": true, // since v1.0.0 + "db": true, // since v1.0.0 + "tables_priv": true, // since v1.0.0 + "columns_priv": true, // since v1.0.0 + "default_roles": true, // since v3.0.0 + "role_edges": true, // since v3.0.0 + "global_priv": true, // since v3.0.8 + "global_grants": true, // since v5.0.3 +} + func isUnrecoverableTable(tableName string) bool { _, ok := unRecoverableTable[tableName] return ok @@ -90,7 +93,7 @@ func (rc *Client) RestoreSystemSchemas(ctx context.Context, f filter.Filter) { for _, table := range originDatabase.Tables { tableName := table.Info.Name if f.MatchTable(sysDB, tableName.O) { - if err := rc.replaceTemporaryTableToSystable(ctx, tableName.L, db); err != nil { + if err := rc.replaceTemporaryTableToSystable(ctx, table.Info, db); err != nil { log.Warn("error during merging temporary tables into system tables", logutil.ShortError(err), zap.Stringer("table", tableName), @@ -139,18 +142,24 @@ func (rc *Client) afterSystemTablesReplaced(tables []string) error { for _, table := range tables { switch { case table == "user": - // We cannot execute `rc.dom.NotifyUpdatePrivilege` here, because there isn't - // sessionctx.Context provided by the glue. - // TODO: update the glue type and allow we retrieve a session context from it. - err = multierr.Append(err, errors.Annotatef(berrors.ErrUnsupportedSystemTable, - "restored user info may not take effect, until you should execute `FLUSH PRIVILEGES` manually")) + if rc.fullClusterRestore { + log.Info("privilege system table restored, please reconnect to make it effective") + err = rc.dom.NotifyUpdatePrivilege() + } 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")) + } } } return err } // replaceTemporaryTableToSystable replaces the temporary table to real system table. -func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, tableName string, db *database) error { +func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, ti *model.TableInfo, db *database) error { + tableName := ti.Name.L 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 { @@ -188,11 +197,26 @@ func (rc *Client) replaceTemporaryTableToSystable(ctx context.Context, tableName } if db.ExistingTables[tableName] != nil { - log.Info("table existing, using replace into for restore", + if rc.fullClusterRestore && sysPrivilegeTableSet[tableName] { + log.Info("full cluster restore, delete existing data", + zap.String("table", tableName), zap.Stringer("schema", db.Name)) + deleteSQL := fmt.Sprintf("DELETE FROM %s;", utils.EncloseDBAndTable(db.Name.L, tableName)) + if err := execSQL(deleteSQL); err != nil { + return err + } + } + log.Info("replace into existing table", zap.String("table", tableName), zap.Stringer("schema", db.Name)) - replaceIntoSQL := fmt.Sprintf("REPLACE INTO %s SELECT * FROM %s;", + // target column order may different with source cluster + columnNames := make([]string, 0, len(ti.Columns)) + for _, col := range ti.Columns { + columnNames = append(columnNames, utils.EncloseName(col.Name.L)) + } + colListStr := strings.Join(columnNames, ",") + 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)) return execSQL(replaceIntoSQL) } diff --git a/br/pkg/restore/util_test.go b/br/pkg/restore/util_test.go index 23fe2de3d3dc0..fbb7f48894d1d 100644 --- a/br/pkg/restore/util_test.go +++ b/br/pkg/restore/util_test.go @@ -7,6 +7,7 @@ import ( "encoding/binary" "testing" + "github.com/pingcap/failpoint" backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/metapb" @@ -227,6 +228,7 @@ func TestPaginateScanRegion(t *testing.T) { regionMap := make(map[uint64]*restore.RegionInfo) var regions []*restore.RegionInfo var batch []*restore.RegionInfo + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/br/pkg/restore/scanRegionBackoffer", "return(true)")) _, err := restore.PaginateScanRegion(ctx, NewTestClient(stores, regionMap, 0), []byte{}, []byte{}, 3) require.Error(t, err) require.True(t, berrors.ErrPDBatchScanRegion.Equal(err)) @@ -235,7 +237,7 @@ func TestPaginateScanRegion(t *testing.T) { regionMap, regions = makeRegions(1) tc := NewTestClient(stores, regionMap, 0) tc.InjectErr = true - tc.InjectTimes = 10 + tc.InjectTimes = 2 batch, err = restore.PaginateScanRegion(ctx, tc, []byte{}, []byte{}, 3) require.NoError(t, err) require.Equal(t, regions, batch) @@ -278,7 +280,7 @@ func TestPaginateScanRegion(t *testing.T) { tc = NewTestClient(stores, regionMap, 0) tc.InjectErr = true - tc.InjectTimes = 65 + tc.InjectTimes = 5 _, err = restore.PaginateScanRegion(ctx, tc, []byte{}, []byte{}, 3) require.Error(t, err) require.True(t, berrors.ErrPDBatchScanRegion.Equal(err)) @@ -290,6 +292,7 @@ func TestPaginateScanRegion(t *testing.T) { require.True(t, berrors.ErrPDBatchScanRegion.Equal(err)) require.Regexp(t, ".*region endKey not equal to next region startKey.*", err.Error()) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/br/pkg/restore/scanRegionBackoffer")) } func TestRewriteFileKeys(t *testing.T) { diff --git a/br/pkg/storage/BUILD.bazel b/br/pkg/storage/BUILD.bazel index 46150497b872b..762df1ae59957 100644 --- a/br/pkg/storage/BUILD.bazel +++ b/br/pkg/storage/BUILD.bazel @@ -33,6 +33,7 @@ go_library( "@com_github_aws_aws_sdk_go//aws/session", "@com_github_aws_aws_sdk_go//service/s3", "@com_github_aws_aws_sdk_go//service/s3/s3iface", + "@com_github_aws_aws_sdk_go//service/s3/s3manager", "@com_github_azure_azure_sdk_for_go_sdk_azidentity//:azidentity", "@com_github_azure_azure_sdk_for_go_sdk_storage_azblob//:azblob", "@com_github_google_uuid//:uuid", diff --git a/br/pkg/storage/azblob.go b/br/pkg/storage/azblob.go index 24c3b06930025..e96a9fe8f9e5a 100644 --- a/br/pkg/storage/azblob.go +++ b/br/pkg/storage/azblob.go @@ -30,6 +30,7 @@ const ( azblobAccountKey = "azblob.account-key" ) +// AzblobBackendOptions is the options for Azure Blob storage. type AzblobBackendOptions struct { Endpoint string `json:"endpoint" toml:"endpoint"` AccountName string `json:"account-name" toml:"account-name"` @@ -83,6 +84,7 @@ func (options *AzblobBackendOptions) parseFromFlags(flags *pflag.FlagSet) error return nil } +// ClientBuilder provides common method to build a service client. type ClientBuilder interface { // Example of serviceURL: https://.blob.core.windows.net GetServiceClient() (azblob.ServiceClient, error) @@ -119,7 +121,7 @@ func (b *tokenClientBuilder) GetAccountName() string { return b.accountName } -func getAuthorizerFromEnvironment() (clientId, tenantId, clientSecret string) { +func getAuthorizerFromEnvironment() (clientID, tenantID, clientSecret string) { return os.Getenv("AZURE_CLIENT_ID"), os.Getenv("AZURE_TENANT_ID"), os.Getenv("AZURE_CLIENT_SECRET") @@ -149,11 +151,11 @@ func getAzureServiceClientBuilder(options *backuppb.AzureBlobStorage, opts *Exte accountName := options.AccountName if len(accountName) == 0 { - if val := os.Getenv("AZURE_STORAGE_ACCOUNT"); len(val) > 0 { - accountName = val - } else { + val := os.Getenv("AZURE_STORAGE_ACCOUNT") + if len(val) <= 0 { return nil, errors.New("account name cannot be empty to access azure blob storage") } + accountName = val } serviceURL := options.Endpoint @@ -161,11 +163,9 @@ func getAzureServiceClientBuilder(options *backuppb.AzureBlobStorage, opts *Exte serviceURL = fmt.Sprintf("https://%s.blob.core.windows.net", accountName) } - if clientId, tenantId, clientSecret := getAuthorizerFromEnvironment(); len(clientId) > 0 && len(tenantId) > 0 && len(clientSecret) > 0 { - cred, err := azidentity.NewClientSecretCredential(tenantId, clientId, clientSecret, nil) - if err != nil { - log.Warn("Failed to get azure token credential but environment variables exist, try to use shared key.", zap.String("tenantId", tenantId), zap.String("clientId", clientId), zap.String("clientSecret", "?")) - } else { + if clientID, tenantID, clientSecret := getAuthorizerFromEnvironment(); len(clientID) > 0 && len(tenantID) > 0 && len(clientSecret) > 0 { + cred, err := azidentity.NewClientSecretCredential(tenantID, clientID, clientSecret, nil) + if err == nil { // send account-name to TiKV if opts != nil && opts.SendCredentials { options.AccountName = accountName @@ -176,15 +176,16 @@ func getAzureServiceClientBuilder(options *backuppb.AzureBlobStorage, opts *Exte serviceURL, }, nil } + log.Warn("Failed to get azure token credential but environment variables exist, try to use shared key.", zap.String("tenantId", tenantID), zap.String("clientId", clientID), zap.String("clientSecret", "?")) } var sharedKey string - if val := os.Getenv("AZURE_STORAGE_KEY"); len(val) > 0 { - log.Info("Get azure sharedKey from environment variable $AZURE_STORAGE_KEY") - sharedKey = val - } else { + val := os.Getenv("AZURE_STORAGE_KEY") + if len(val) <= 0 { return nil, errors.New("cannot find any credential info to access azure blob storage") } + log.Info("Get azure sharedKey from environment variable $AZURE_STORAGE_KEY") + sharedKey = val cred, err := azblob.NewSharedKeyCredential(accountName, sharedKey) if err != nil { @@ -203,6 +204,7 @@ func getAzureServiceClientBuilder(options *backuppb.AzureBlobStorage, opts *Exte }, nil } +// AzureBlobStorage is a storage engine that stores data in Azure Blob Storage. type AzureBlobStorage struct { options *backuppb.AzureBlobStorage @@ -221,7 +223,6 @@ func newAzureBlobStorage(ctx context.Context, options *backuppb.AzureBlobStorage } func newAzureBlobStorageWithClientBuilder(ctx context.Context, options *backuppb.AzureBlobStorage, clientBuilder ClientBuilder) (*AzureBlobStorage, error) { - serviceClient, err := clientBuilder.GetServiceClient() if err != nil { return nil, errors.Annotate(err, "Failed to create azure service client") @@ -231,13 +232,12 @@ func newAzureBlobStorageWithClientBuilder(ctx context.Context, options *backuppb _, err = containerClient.Create(ctx, nil) if err != nil { var errResp *azblob.StorageError - if internalErr, ok := err.(*azblob.InternalError); ok && internalErr.As(&errResp) { - if errResp.ErrorCode != azblob.StorageErrorCodeContainerAlreadyExists { - return nil, errors.Annotate(err, fmt.Sprintf("Failed to create the container: %s", errResp.ErrorCode)) - } - } else { + if internalErr, ok := err.(*azblob.InternalError); !(ok && internalErr.As(&errResp)) { return nil, errors.Annotate(err, "Failed to create the container: error can not be parsed") } + if errResp.ErrorCode != azblob.StorageErrorCodeContainerAlreadyExists { + return nil, errors.Annotate(err, fmt.Sprintf("Failed to create the container: %s", errResp.ErrorCode)) + } } // parse storage access-tier @@ -266,6 +266,7 @@ func (s *AzureBlobStorage) withPrefix(name string) string { return path.Join(s.options.Prefix, name) } +// WriteFile writes a file to Azure Blob Storage. func (s *AzureBlobStorage) WriteFile(ctx context.Context, name string, data []byte) error { client := s.containerClient.NewBlockBlobClient(s.withPrefix(name)) resp, err := client.UploadBufferToBlockBlob(ctx, data, azblob.HighLevelUploadToBlockBlobOption{AccessTier: &s.accessTier}) @@ -276,6 +277,7 @@ func (s *AzureBlobStorage) WriteFile(ctx context.Context, name string, data []by return nil } +// ReadFile reads a file from Azure Blob Storage. func (s *AzureBlobStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { client := s.containerClient.NewBlockBlobClient(s.withPrefix(name)) resp, err := client.Download(ctx, nil) @@ -290,6 +292,7 @@ func (s *AzureBlobStorage) ReadFile(ctx context.Context, name string) ([]byte, e return data, err } +// FileExists checks if a file exists in Azure Blob Storage. func (s *AzureBlobStorage) FileExists(ctx context.Context, name string) (bool, error) { client := s.containerClient.NewBlockBlobClient(s.withPrefix(name)) _, err := client.GetProperties(ctx, nil) @@ -305,6 +308,7 @@ func (s *AzureBlobStorage) FileExists(ctx context.Context, name string) (bool, e return true, nil } +// DeleteFile deletes the file with the given name. func (s *AzureBlobStorage) DeleteFile(ctx context.Context, name string) error { client := s.containerClient.NewBlockBlobClient(s.withPrefix(name)) _, err := client.Delete(ctx, nil) @@ -314,6 +318,7 @@ func (s *AzureBlobStorage) DeleteFile(ctx context.Context, name string) error { return nil } +// Open implements the StorageReader interface. func (s *AzureBlobStorage) Open(ctx context.Context, name string) (ExternalFileReader, error) { client := s.containerClient.NewBlockBlobClient(s.withPrefix(name)) return &azblobObjectReader{ @@ -325,6 +330,7 @@ func (s *AzureBlobStorage) Open(ctx context.Context, name string) (ExternalFileR }, nil } +// WalkDir implements the StorageReader interface. func (s *AzureBlobStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(path string, size int64) error) error { if opt == nil { opt = &WalkOption{} @@ -371,11 +377,13 @@ func (s *AzureBlobStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func return nil } +// URI implements the StorageReader interface. func (s *AzureBlobStorage) URI() string { return "azure://" + s.options.Bucket + "/" + s.options.Prefix } -func (s *AzureBlobStorage) Create(ctx context.Context, name string) (ExternalFileWriter, error) { +// Create implements the StorageWriter interface. +func (s *AzureBlobStorage) Create(_ context.Context, name string) (ExternalFileWriter, error) { client := s.containerClient.NewBlockBlobClient(s.withPrefix(name)) uploader := &azblobUploader{ blobClient: client, @@ -389,6 +397,7 @@ func (s *AzureBlobStorage) Create(ctx context.Context, name string) (ExternalFil return uploaderWriter, nil } +// Rename implements the StorageWriter interface. func (s *AzureBlobStorage) Rename(ctx context.Context, oldFileName, newFileName string) error { data, err := s.ReadFile(ctx, oldFileName) if err != nil { @@ -425,7 +434,7 @@ func (r *azblobObjectReader) Read(p []byte) (n int, err error) { } // Close implement the io.Closer interface. -func (r *azblobObjectReader) Close() error { +func (*azblobObjectReader) Close() error { return nil } @@ -476,7 +485,7 @@ func newNopCloser(r io.ReadSeeker) nopCloser { return nopCloser{r} } -func (r nopCloser) Close() error { +func (nopCloser) Close() error { return nil } @@ -489,17 +498,17 @@ type azblobUploader struct { } func (u *azblobUploader) Write(ctx context.Context, data []byte) (int, error) { - generatedUuid, err := uuid.NewUUID() + generatedUUID, err := uuid.NewUUID() if err != nil { return 0, errors.Annotate(err, "Fail to generate uuid") } - blockId := base64.StdEncoding.EncodeToString([]byte(generatedUuid.String())) + blockID := base64.StdEncoding.EncodeToString([]byte(generatedUUID.String())) - _, err = u.blobClient.StageBlock(ctx, blockId, newNopCloser(bytes.NewReader(data)), nil) + _, err = u.blobClient.StageBlock(ctx, blockID, newNopCloser(bytes.NewReader(data)), nil) if err != nil { return 0, errors.Annotate(err, "Failed to upload block to azure blob") } - u.blockIDList = append(u.blockIDList, blockId) + u.blockIDList = append(u.blockIDList, blockID) return len(data), nil } diff --git a/br/pkg/storage/compress.go b/br/pkg/storage/compress.go index fc0976420996b..96258221d9b62 100644 --- a/br/pkg/storage/compress.go +++ b/br/pkg/storage/compress.go @@ -98,7 +98,7 @@ func newInterceptReader(fileReader ExternalFileReader, compressType CompressType }, nil } -func (r *compressReader) Seek(_ int64, _ int) (int64, error) { +func (*compressReader) Seek(_ int64, _ int) (int64, error) { return int64(0), errors.Annotatef(berrors.ErrStorageInvalidConfig, "compressReader doesn't support Seek now") } @@ -108,12 +108,12 @@ type flushStorageWriter struct { closer io.Closer } -func (w *flushStorageWriter) Write(ctx context.Context, data []byte) (int, error) { +func (w *flushStorageWriter) Write(_ context.Context, data []byte) (int, error) { n, err := w.writer.Write(data) return n, errors.Trace(err) } -func (w *flushStorageWriter) Close(ctx context.Context) error { +func (w *flushStorageWriter) Close(_ context.Context) error { err := w.flusher.Flush() if err != nil { return errors.Trace(err) diff --git a/br/pkg/storage/gcs.go b/br/pkg/storage/gcs.go index abecab4362c74..4609c977766fa 100644 --- a/br/pkg/storage/gcs.go +++ b/br/pkg/storage/gcs.go @@ -258,12 +258,11 @@ func newGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorage return nil, errors.Annotatef(berrors.ErrStorageInvalidConfig, "%v Or you should provide '--gcs.credentials_file'", err) } if opts.SendCredentials { - if len(creds.JSON) > 0 { - gcs.CredentialsBlob = string(creds.JSON) - } else { + if len(creds.JSON) <= 0 { return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "You should provide '--gcs.credentials_file' when '--send-credentials-to-tikv' is true") } + gcs.CredentialsBlob = string(creds.JSON) } if creds != nil { clientOps = append(clientOps, option.WithCredentials(creds)) diff --git a/br/pkg/storage/hdfs.go b/br/pkg/storage/hdfs.go index 3dc8e7a8d6491..4a971f7a3cb0f 100644 --- a/br/pkg/storage/hdfs.go +++ b/br/pkg/storage/hdfs.go @@ -19,6 +19,7 @@ type HDFSStorage struct { remote string } +// NewHDFSStorage creates a new HDFS storage. func NewHDFSStorage(remote string) *HDFSStorage { return &HDFSStorage{ remote: remote, @@ -26,11 +27,11 @@ func NewHDFSStorage(remote string) *HDFSStorage { } func getHdfsBin() (string, error) { - hadoop_home, ok := os.LookupEnv("HADOOP_HOME") + hadoopHome, ok := os.LookupEnv("HADOOP_HOME") if !ok { return "", errors.Annotatef(berrors.ErrEnvNotSpecified, "please specify environment variable HADOOP_HOME") } - return filepath.Join(hadoop_home, "bin/hdfs"), nil + return filepath.Join(hadoopHome, "bin/hdfs"), nil } func getLinuxUser() (string, bool) { @@ -54,9 +55,9 @@ func dfsCommand(args ...string) (*exec.Cmd, error) { } // WriteFile writes a complete file to storage, similar to os.WriteFile -func (s *HDFSStorage) WriteFile(ctx context.Context, name string, data []byte) error { - file_path := fmt.Sprintf("%s/%s", s.remote, name) - cmd, err := dfsCommand("-put", "-", file_path) +func (s *HDFSStorage) WriteFile(_ context.Context, name string, data []byte) error { + filePath := fmt.Sprintf("%s/%s", s.remote, name) + cmd, err := dfsCommand("-put", "-", filePath) if err != nil { return err } @@ -73,14 +74,14 @@ func (s *HDFSStorage) WriteFile(ctx context.Context, name string, data []byte) e } // ReadFile reads a complete file from storage, similar to os.ReadFile -func (s *HDFSStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { +func (*HDFSStorage) ReadFile(_ context.Context, _ string) ([]byte, error) { return nil, errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") } // FileExists return true if file exists -func (s *HDFSStorage) FileExists(ctx context.Context, name string) (bool, error) { - file_path := fmt.Sprintf("%s/%s", s.remote, name) - cmd, err := dfsCommand("-ls", file_path) +func (s *HDFSStorage) FileExists(_ context.Context, name string) (bool, error) { + filePath := fmt.Sprintf("%s/%s", s.remote, name) + cmd, err := dfsCommand("-ls", filePath) if err != nil { return false, err } @@ -97,12 +98,12 @@ func (s *HDFSStorage) FileExists(ctx context.Context, name string) (bool, error) } // DeleteFile delete the file in storage -func (s *HDFSStorage) DeleteFile(ctx context.Context, name string) error { +func (*HDFSStorage) DeleteFile(_ context.Context, _ string) error { return errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") } // Open a Reader by file path. path is relative path to storage base path -func (s *HDFSStorage) Open(ctx context.Context, path string) (ExternalFileReader, error) { +func (*HDFSStorage) Open(_ context.Context, _ string) (ExternalFileReader, error) { return nil, errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") } @@ -112,7 +113,7 @@ func (s *HDFSStorage) Open(ctx context.Context, path string) (ExternalFileReader // The argument `path` is the file path that can be used in `Open` // function; the argument `size` is the size in byte of the file determined // by path. -func (s *HDFSStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(path string, size int64) error) error { +func (*HDFSStorage) WalkDir(_ context.Context, _ *WalkOption, _ func(path string, size int64) error) error { return errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") } @@ -122,11 +123,11 @@ func (s *HDFSStorage) URI() string { } // Create opens a file writer by path. path is relative path to storage base path -func (s *HDFSStorage) Create(ctx context.Context, path string) (ExternalFileWriter, error) { +func (*HDFSStorage) Create(_ context.Context, _ string) (ExternalFileWriter, error) { return nil, errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") } // Rename a file name from oldFileName to newFileName. -func (s *HDFSStorage) Rename(ctx context.Context, oldFileName, newFileName string) error { +func (*HDFSStorage) Rename(_ context.Context, _, _ string) error { return errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") } diff --git a/br/pkg/storage/local.go b/br/pkg/storage/local.go index 0004648899aa8..68dc760cc1c9a 100644 --- a/br/pkg/storage/local.go +++ b/br/pkg/storage/local.go @@ -26,13 +26,14 @@ type LocalStorage struct { base string } -func (l *LocalStorage) DeleteFile(ctx context.Context, name string) error { +// DeleteFile deletes the file. +func (l *LocalStorage) DeleteFile(_ context.Context, name string) error { path := filepath.Join(l.base, name) return os.Remove(path) } // WriteFile writes data to a file to storage. -func (l *LocalStorage) WriteFile(ctx context.Context, name string, data []byte) error { +func (l *LocalStorage) WriteFile(_ context.Context, name string, data []byte) error { // because `os.WriteFile` is not atomic, directly write into it may reset the file // to an empty file if write is not finished. tmpPath := filepath.Join(l.base, name) + ".tmp" @@ -46,13 +47,13 @@ func (l *LocalStorage) WriteFile(ctx context.Context, name string, data []byte) } // ReadFile reads the file from the storage and returns the contents. -func (l *LocalStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { +func (l *LocalStorage) ReadFile(_ context.Context, name string) ([]byte, error) { path := filepath.Join(l.base, name) return os.ReadFile(path) } // FileExists implement ExternalStorage.FileExists. -func (l *LocalStorage) FileExists(ctx context.Context, name string) (bool, error) { +func (l *LocalStorage) FileExists(_ context.Context, name string) (bool, error) { path := filepath.Join(l.base, name) return pathExists(path) } @@ -63,7 +64,7 @@ func (l *LocalStorage) FileExists(ctx context.Context, name 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 (l *LocalStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(string, int64) error) error { +func (l *LocalStorage) WalkDir(_ context.Context, opt *WalkOption, fn func(string, int64) error) error { if opt == nil { opt = &WalkOption{} } @@ -107,13 +108,13 @@ func (l *LocalStorage) URI() string { } // Open a Reader by file path, path is a relative path to base path. -func (l *LocalStorage) Open(ctx context.Context, path string) (ExternalFileReader, error) { +func (l *LocalStorage) Open(_ context.Context, path string) (ExternalFileReader, error) { //nolint: gosec return os.Open(filepath.Join(l.base, path)) } // Create implements ExternalStorage interface. -func (l *LocalStorage) Create(ctx context.Context, name string) (ExternalFileWriter, error) { +func (l *LocalStorage) Create(_ context.Context, name string) (ExternalFileWriter, error) { file, err := os.Create(filepath.Join(l.base, name)) if err != nil { return nil, errors.Trace(err) @@ -123,7 +124,7 @@ func (l *LocalStorage) Create(ctx context.Context, name string) (ExternalFileWri } // Rename implements ExternalStorage interface. -func (l *LocalStorage) Rename(ctx context.Context, oldFileName, newFileName string) error { +func (l *LocalStorage) Rename(_ context.Context, oldFileName, newFileName string) error { return errors.Trace(os.Rename(filepath.Join(l.base, oldFileName), filepath.Join(l.base, newFileName))) } diff --git a/br/pkg/storage/memstore.go b/br/pkg/storage/memstore.go index 0d60edc04de7c..96276ca600790 100644 --- a/br/pkg/storage/memstore.go +++ b/br/pkg/storage/memstore.go @@ -46,6 +46,7 @@ type MemStorage struct { dataStore map[string]*memFile } +// NewMemStorage creates a new in-memory storage. func NewMemStorage() *MemStorage { return &MemStorage{ dataStore: make(map[string]*memFile), @@ -210,7 +211,8 @@ func (s *MemStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(strin return nil } -func (s *MemStorage) URI() string { +// URI returns the URI of the storage. +func (*MemStorage) URI() string { return "memstore://" } diff --git a/br/pkg/storage/noop.go b/br/pkg/storage/noop.go index 41788a1f37cd4..8e58366efdcf5 100644 --- a/br/pkg/storage/noop.go +++ b/br/pkg/storage/noop.go @@ -9,46 +9,46 @@ import ( type noopStorage struct{} // DeleteFile delete the file in storage -func (s *noopStorage) DeleteFile(ctx context.Context, name string) error { +func (*noopStorage) DeleteFile(_ context.Context, _ string) error { return nil } // WriteFile file to storage. -func (*noopStorage) WriteFile(ctx context.Context, name string, data []byte) error { +func (*noopStorage) WriteFile(_ context.Context, _ string, _ []byte) error { return nil } // ReadFile storage file. -func (*noopStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { +func (*noopStorage) ReadFile(_ context.Context, _ string) ([]byte, error) { return []byte{}, nil } // FileExists return true if file exists. -func (*noopStorage) FileExists(ctx context.Context, name string) (bool, error) { +func (*noopStorage) FileExists(_ context.Context, _ string) (bool, error) { return false, nil } // Open a Reader by file path. -func (*noopStorage) Open(ctx context.Context, path string) (ExternalFileReader, error) { +func (*noopStorage) Open(_ context.Context, _ string) (ExternalFileReader, error) { return noopReader{}, nil } // WalkDir traverse all the files in a dir. -func (*noopStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(string, int64) error) error { +func (*noopStorage) WalkDir(_ context.Context, _ *WalkOption, _ func(string, int64) error) error { return nil } -func (s *noopStorage) URI() string { +func (*noopStorage) URI() string { return "noop:///" } // Create implements ExternalStorage interface. -func (*noopStorage) Create(ctx context.Context, name string) (ExternalFileWriter, error) { +func (*noopStorage) Create(_ context.Context, _ string) (ExternalFileWriter, error) { return &noopWriter{}, nil } // Rename implements ExternalStorage interface. -func (*noopStorage) Rename(ctx context.Context, oldFileName, newFileName string) error { +func (*noopStorage) Rename(_ context.Context, _, _ string) error { return nil } @@ -66,16 +66,16 @@ func (noopReader) Close() error { return nil } -func (noopReader) Seek(offset int64, whence int) (int64, error) { +func (noopReader) Seek(offset int64, _ int) (int64, error) { return offset, nil } type noopWriter struct{} -func (noopWriter) Write(ctx context.Context, p []byte) (int, error) { +func (noopWriter) Write(_ context.Context, p []byte) (int, error) { return len(p), nil } -func (noopWriter) Close(ctx context.Context) error { +func (noopWriter) Close(_ context.Context) error { return nil } diff --git a/br/pkg/storage/s3.go b/br/pkg/storage/s3.go index 64e25b4e874d6..862f419e9d291 100644 --- a/br/pkg/storage/s3.go +++ b/br/pkg/storage/s3.go @@ -255,13 +255,13 @@ func autoNewCred(qs *backuppb.S3) (cred *credentials.Credentials, err error) { } // if it Contains 'aliyuncs', fetch the sts token. if strings.Contains(endpoint, domainAliyun) { - return createOssRamCred() + return createOssRAMCred() } // other case ,return no error and run default(aws) follow. return nil, nil } -func createOssRamCred() (*credentials.Credentials, error) { +func createOssRAMCred() (*credentials.Credentials, error) { cred, err := aliproviders.NewInstanceMetadataProvider().Retrieve() if err != nil { return nil, errors.Annotate(err, "Alibaba RAM Provider Retrieve") @@ -338,6 +338,7 @@ func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (obj *S3St } qs.Region = region + backend.Region = region if region != defaultRegion { awsConfig.WithRegion(region) c = s3.New(ses, awsConfig) @@ -553,7 +554,6 @@ func (rs *S3Storage) WalkDir(ctx context.Context, opt *WalkOption, fn func(strin if err = fn(path, itemSize); err != nil { return errors.Trace(err) } - } if !aws.BoolValue(res.IsTruncated) { break diff --git a/br/pkg/storage/writer.go b/br/pkg/storage/writer.go index 55fb4e8ac319b..455cc9c3c3411 100644 --- a/br/pkg/storage/writer.go +++ b/br/pkg/storage/writer.go @@ -25,7 +25,7 @@ type flusher interface { type emptyFlusher struct{} -func (e *emptyFlusher) Flush() error { +func (*emptyFlusher) Flush() error { return nil } @@ -68,15 +68,15 @@ type noCompressionBuffer struct { *bytes.Buffer } -func (b *noCompressionBuffer) Flush() error { +func (*noCompressionBuffer) Flush() error { return nil } -func (b *noCompressionBuffer) Close() error { +func (*noCompressionBuffer) Close() error { return nil } -func (b *noCompressionBuffer) Compressed() bool { +func (*noCompressionBuffer) Compressed() bool { return false } @@ -120,7 +120,7 @@ func (b *simpleCompressBuffer) Close() error { return b.compressWriter.Close() } -func (b *simpleCompressBuffer) Compressed() bool { +func (*simpleCompressBuffer) Compressed() bool { return true } @@ -208,12 +208,12 @@ type BytesWriter struct { } // Write delegates to bytes.Buffer. -func (u *BytesWriter) Write(ctx context.Context, p []byte) (int, error) { +func (u *BytesWriter) Write(_ context.Context, p []byte) (int, error) { return u.buf.Write(p) } // Close delegates to bytes.Buffer. -func (u *BytesWriter) Close(ctx context.Context) error { +func (*BytesWriter) Close(_ context.Context) error { // noop return nil } diff --git a/br/pkg/stream/BUILD.bazel b/br/pkg/stream/BUILD.bazel index 7d2ac25a863c9..15ee92d85b2a2 100644 --- a/br/pkg/stream/BUILD.bazel +++ b/br/pkg/stream/BUILD.bazel @@ -3,11 +3,8 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "stream", srcs = [ - "client.go", "decode_kv.go", "meta_kv.go", - "models.go", - "prefix_scanner.go", "rewrite_meta_rawkv.go", "stream_mgr.go", "stream_status.go", @@ -15,14 +12,13 @@ go_library( importpath = "github.com/pingcap/tidb/br/pkg/stream", visibility = ["//visibility:public"], deps = [ - "//br/pkg/backup", - "//br/pkg/conn", "//br/pkg/errors", "//br/pkg/glue", "//br/pkg/httputil", "//br/pkg/logutil", - "//br/pkg/redact", "//br/pkg/storage", + "//br/pkg/streamhelper", + "//br/pkg/utils", "//kv", "//meta", "//parser/model", @@ -31,14 +27,12 @@ go_library( "//util/codec", "//util/table-filter", "@com_github_fatih_color//:color", - "@com_github_gogo_protobuf//proto", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_log//:log", - "@com_github_tikv_client_go_v2//kv", "@com_github_tikv_client_go_v2//oracle", - "@io_etcd_go_etcd_client_v3//:client", + "@com_github_tikv_pd_client//:client", "@org_golang_x_sync//errgroup", "@org_uber_go_zap//:zap", ], @@ -48,28 +42,19 @@ go_test( name = "stream_test", srcs = [ "decode_kv_test.go", - "integration_test.go", "meta_kv_test.go", "rewrite_meta_rawkv_test.go", "stream_misc_test.go", ], embed = [":stream"], deps = [ - "//br/pkg/errors", - "//br/pkg/logutil", - "//br/pkg/storage", + "//br/pkg/streamhelper", "//meta", "//parser/model", "//tablecodec", "//util/codec", - "@com_github_pingcap_errors//:errors", + "//util/table-filter", "@com_github_pingcap_kvproto//pkg/brpb", - "@com_github_pingcap_log//:log", "@com_github_stretchr_testify//require", - "@com_github_tikv_client_go_v2//kv", - "@io_etcd_go_etcd_client_v3//:client", - "@io_etcd_go_etcd_server_v3//embed", - "@io_etcd_go_etcd_server_v3//mvcc", - "@org_uber_go_zap//:zap", ], ) diff --git a/br/pkg/stream/meta_kv.go b/br/pkg/stream/meta_kv.go index 323ae40c0aeeb..9d054f0bef454 100644 --- a/br/pkg/stream/meta_kv.go +++ b/br/pkg/stream/meta_kv.go @@ -179,6 +179,14 @@ func (v *RawWriteCFValue) UpdateShortValue(value []byte) { v.shortValue = value } +func (v *RawWriteCFValue) GetStartTs() uint64 { + return v.startTs +} + +func (v *RawWriteCFValue) GetWriteType() byte { + return v.t +} + // EncodeTo encodes the RawWriteCFValue to get encoded value. func (v *RawWriteCFValue) EncodeTo() []byte { data := make([]byte, 0, 9) diff --git a/br/pkg/stream/rewrite_meta_rawkv.go b/br/pkg/stream/rewrite_meta_rawkv.go index 671d310406050..b8e9599f17ce8 100644 --- a/br/pkg/stream/rewrite_meta_rawkv.go +++ b/br/pkg/stream/rewrite_meta_rawkv.go @@ -22,7 +22,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/log" - "github.com/pingcap/tidb/br/pkg/backup" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" @@ -55,11 +54,13 @@ type DBReplace struct { } type SchemasReplace struct { - DbMap map[OldID]*DBReplace - RewriteTS uint64 - TableFilter filter.Filter - genGenGlobalID func(ctx context.Context) (int64, error) - genGenGlobalIDs func(ctx context.Context, n int) ([]int64, error) + DbMap map[OldID]*DBReplace + RewriteTS uint64 + TableFilter filter.Filter + 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) } // NewTableReplace creates a TableReplace struct. @@ -88,43 +89,20 @@ 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), ) *SchemasReplace { return &SchemasReplace{ - DbMap: dbMap, - RewriteTS: restoreTS, - TableFilter: tableFilter, - genGenGlobalID: genID, - genGenGlobalIDs: genIDs, + DbMap: dbMap, + RewriteTS: restoreTS, + TableFilter: tableFilter, + genGenGlobalID: genID, + genGenGlobalIDs: genIDs, + insertDeleteRangeForTable: insertDeleteRangeForTable, + insertDeleteRangeForIndex: insertDeleteRangeForIndex, } } -// TidyOldSchemas produces schemas information. -func (sr *SchemasReplace) TidyOldSchemas() *backup.Schemas { - var schemaIsEmpty bool - schemas := backup.NewBackupSchemas() - - for _, dr := range sr.DbMap { - if dr.OldDBInfo == nil { - continue - } - - schemaIsEmpty = true - for _, tr := range dr.TableMap { - if tr.OldTableInfo == nil { - continue - } - schemas.AddSchema(dr.OldDBInfo, tr.OldTableInfo) - schemaIsEmpty = false - } - - // backup this empty schema if it has nothing table. - if schemaIsEmpty { - schemas.AddSchema(dr.OldDBInfo, nil) - } - } - return schemas -} - func (sr *SchemasReplace) rewriteKeyForDB(key []byte, cf string) ([]byte, bool, error) { rawMetaKey, err := ParseTxnMetaKeyFrom(key) if err != nil { @@ -311,7 +289,8 @@ func (sr *SchemasReplace) rewriteTableInfo(value []byte, dbID int64) ([]byte, bo for i, tbl := range partitions.Definitions { newID, exist := tableReplace.PartitionMap[tbl.ID] if !exist { - newID, err := sr.genGenGlobalID(context.Background()) + var err error + newID, err = sr.genGenGlobalID(context.Background()) if err != nil { return nil, false, errors.Trace(err) } @@ -433,7 +412,19 @@ func (sr *SchemasReplace) rewriteValue( // RewriteKvEntry uses to rewrite tableID/dbID in entry.key and entry.value func (sr *SchemasReplace) RewriteKvEntry(e *kv.Entry, cf string) (*kv.Entry, error) { // skip mDDLJob + if !strings.HasPrefix(string(e.Key), "mDB") { + if cf == DefaultCF && strings.HasPrefix(string(e.Key), "mDDLJobH") { // mDDLJobHistory + job := &model.Job{} + if err := job.Decode(e.Value); err != nil { + log.Debug("failed to decode the job", zap.String("error", err.Error()), zap.String("job", string(e.Value))) + // The value in write-cf is like "p\XXXX\XXX" need not restore. skip it + // The value in default-cf that can Decode() need restore. + return nil, nil + } + + return nil, sr.tryToGCJob(job) + } return nil, nil } @@ -460,3 +451,333 @@ func (sr *SchemasReplace) RewriteKvEntry(e *kv.Entry, cf string) (*kv.Entry, err return nil, nil } } + +func (sr *SchemasReplace) tryToGCJob(job *model.Job) error { + if !job.IsCancelled() { + switch job.Type { + case model.ActionAddIndex, model.ActionAddPrimaryKey: + if job.State == model.JobStateRollbackDone { + return sr.deleteRange(job) + } + return nil + 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 _, sub := range job.MultiSchemaInfo.SubJobs { + proxyJob := sub.ToProxyJob(job) + if err := sr.tryToGCJob(&proxyJob); err != nil { + return err + } + } + case model.ActionExchangeTablePartition: + return errors.Errorf("restore of ddl `exchange-table-partition` is not supported") + } + } + return nil +} + +func (sr *SchemasReplace) deleteRange(job *model.Job) error { + dbReplace, exist := sr.DbMap[job.SchemaID] + if !exist { + // skip this mddljob, the same below + log.Debug("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 { + log.Debug("DropSchema: record a table, but it doesn't exist in job args", zap.Int64("oldTableID", tableID)) + continue + } + newTableIDs = append(newTableIDs, tableReplace.NewTableID) + for partitionID, newPartitionID := range tableReplace.PartitionMap { + if _, exist := argsSet[partitionID]; !exist { + log.Debug("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) { + log.Debug("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 { + log.Debug("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 { + // delete partition id instead of table id + for i := 0; i < len(physicalTableIDs); i++ { + newPid, exist := tableReplace.PartitionMap[physicalTableIDs[i]] + if !exist { + log.Debug("DropTable/TruncateTable: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", physicalTableIDs[i])) + continue + } + physicalTableIDs[i] = newPid + } + if len(physicalTableIDs) > 0 { + sr.insertDeleteRangeForTable(newJobID, physicalTableIDs) + } + return nil + } + + sr.insertDeleteRangeForTable(newJobID, []int64{tableReplace.NewTableID}) + return nil + case model.ActionDropTablePartition, model.ActionTruncateTablePartition: + tableReplace, exist := dbReplace.TableMap[job.TableID] + if !exist { + log.Debug("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) + } + + for i := 0; i < len(physicalTableIDs); i++ { + newPid, exist := tableReplace.PartitionMap[physicalTableIDs[i]] + if !exist { + log.Debug("DropTablePartition/TruncateTablePartition: try to drop a non-existent table, missing oldPartitionID", zap.Int64("oldPartitionID", physicalTableIDs[i])) + continue + } + physicalTableIDs[i] = newPid + } + if len(physicalTableIDs) > 0 { + sr.insertDeleteRangeForTable(newJobID, physicalTableIDs) + } + 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 { + log.Debug("AddIndex/AddPrimaryKey roll-back: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) + return nil + } + var indexID int64 + var ifExists bool + var partitionIDs []int64 + if err := job.DecodeArgs(&indexID, &ifExists, &partitionIDs); err != nil { + return errors.Trace(err) + } + + var elementID int64 = 1 + indexIDs := []int64{indexID} + + if len(partitionIDs) > 0 { + for _, oldPid := range partitionIDs { + newPid, exist := tableReplace.PartitionMap[oldPid] + if !exist { + log.Debug("AddIndex/AddPrimaryKey roll-back: 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.NewTableID, indexIDs) + } + return nil + case model.ActionDropIndex, model.ActionDropPrimaryKey: + tableReplace, exist := dbReplace.TableMap[job.TableID] + if !exist { + log.Debug("DropIndex/DropPrimaryKey: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) + return nil + } + + 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) + } + + var elementID int64 = 1 + indexIDs := []int64{indexID} + + if len(partitionIDs) > 0 { + for _, oldPid := range partitionIDs { + newPid, exist := tableReplace.PartitionMap[oldPid] + if !exist { + log.Debug("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.NewTableID, 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 + } + + tableReplace, exist := dbReplace.TableMap[job.TableID] + if !exist { + log.Debug("DropIndexes: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) + return nil + } + + var elementID int64 = 1 + if len(partitionIDs) > 0 { + for _, oldPid := range partitionIDs { + newPid, exist := tableReplace.PartitionMap[oldPid] + if !exist { + log.Debug("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.NewTableID, 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 { + log.Debug("DropColumn: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) + return nil + } + + var elementID int64 = 1 + if len(partitionIDs) > 0 { + for _, oldPid := range partitionIDs { + newPid, exist := tableReplace.PartitionMap[oldPid] + if !exist { + log.Debug("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.NewTableID, 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 { + log.Debug("DropColumns: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) + return nil + } + + var elementID int64 = 1 + if len(partitionIDs) > 0 { + for _, oldPid := range partitionIDs { + newPid, exist := tableReplace.PartitionMap[oldPid] + if !exist { + log.Debug("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.NewTableID, 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 { + log.Debug("DropColumn: try to drop a non-existent table, missing oldTableID", zap.Int64("oldTableID", job.TableID)) + return nil + } + + var elementID int64 = 1 + if len(partitionIDs) > 0 { + for _, oldPid := range partitionIDs { + newPid, exist := tableReplace.PartitionMap[oldPid] + if !exist { + log.Debug("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.NewTableID, indexIDs) + } + } + return nil +} diff --git a/br/pkg/stream/rewrite_meta_rawkv_test.go b/br/pkg/stream/rewrite_meta_rawkv_test.go index 4467a456710c7..e49cbd3860585 100644 --- a/br/pkg/stream/rewrite_meta_rawkv_test.go +++ b/br/pkg/stream/rewrite_meta_rawkv_test.go @@ -1,18 +1,24 @@ // Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. -package stream_test +package stream import ( + "context" "encoding/json" "testing" - "github.com/pingcap/log" - "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/parser/model" + filter "github.com/pingcap/tidb/util/table-filter" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) +var increaseID int64 = 100 + +func mockGenGenGlobalID(ctx context.Context) (int64, error) { + increaseID++ + return increaseID, nil +} + func ProduceValue(tableName string, dbID int64) ([]byte, error) { tableInfo := model.TableInfo{ ID: dbID, @@ -22,18 +28,542 @@ func ProduceValue(tableName string, dbID int64) ([]byte, error) { return json.Marshal(tableInfo) } +func MockEmptySchemasReplace(midr *mockInsertDeleteRange) *SchemasReplace { + dbMap := make(map[OldID]*DBReplace) + if midr == nil { + midr = newMockInsertDeleteRange() + } + return NewSchemasReplace( + dbMap, + 0, + filter.All(), + mockGenGenGlobalID, + nil, + midr.mockInsertDeleteRangeForTable, + midr.mockInsertDeleteRangeForIndex, + ) +} + +func produceDBInfoValue(dbName string, dbID int64) ([]byte, error) { + dbInfo := model.DBInfo{ + ID: dbID, + Name: model.NewCIStr(dbName), + } + return json.Marshal(&dbInfo) +} + +func produceTableInfoValue(tableName string, tableID int64) ([]byte, error) { + tableInfo := model.TableInfo{ + ID: tableID, + Name: model.NewCIStr(tableName), + } + + return json.Marshal(&tableInfo) +} + +func TestRewriteValueForDB(t *testing.T) { + var ( + dbID int64 = 1 + dbName = "db1" + DBInfo model.DBInfo + ) + + value, err := produceDBInfoValue(dbName, dbID) + require.Nil(t, err) + + sr := MockEmptySchemasReplace(nil) + newValue, needWrite, err := sr.rewriteDBInfo(value) + require.Nil(t, err) + require.True(t, needWrite) + + err = json.Unmarshal(newValue, &DBInfo) + require.Nil(t, err) + require.Equal(t, DBInfo.ID, sr.DbMap[dbID].NewDBID) + + newId := sr.DbMap[dbID].NewDBID + newValue, needWrite, err = sr.rewriteDBInfo(value) + require.Nil(t, err) + require.True(t, needWrite) + + err = json.Unmarshal(newValue, &DBInfo) + require.Nil(t, err) + require.Equal(t, DBInfo.ID, sr.DbMap[dbID].NewDBID) + require.Equal(t, newId, sr.DbMap[dbID].NewDBID) +} + func TestRewriteValueForTable(t *testing.T) { + + var ( + dbId int64 = 40 + tableID int64 = 100 + tableName = "t1" + tableInfo model.TableInfo + ) + + value, err := produceTableInfoValue(tableName, tableID) + require.Nil(t, err) + + sr := MockEmptySchemasReplace(nil) + newValue, needRewrite, err := sr.rewriteTableInfo(value, dbId) + require.Nil(t, err) + require.True(t, needRewrite) + + err = json.Unmarshal(newValue, &tableInfo) + require.Nil(t, err) + require.Equal(t, tableInfo.ID, sr.DbMap[dbId].TableMap[tableID].NewTableID) + + newID := sr.DbMap[dbId].TableMap[tableID].NewTableID + newValue, needRewrite, err = sr.rewriteTableInfo(value, dbId) + require.Nil(t, err) + require.True(t, needRewrite) + + err = json.Unmarshal(newValue, &tableInfo) + require.Nil(t, err) + require.Equal(t, tableInfo.ID, sr.DbMap[dbId].TableMap[tableID].NewTableID) + require.Equal(t, newID, sr.DbMap[dbId].TableMap[tableID].NewTableID) +} + +func TestRewriteValueForPartitionTable(t *testing.T) { var ( - tableName = "person" - tableID = 57 - newTableID = 63 + dbId int64 = 40 + tableID int64 = 100 + pt1ID int64 = 101 + pt2ID int64 = 102 + tableName = "t1" + pt1Name = "pt1" + pt2Name = "pt2" + tableInfo model.TableInfo + ) + + pt1 := model.PartitionDefinition{ + ID: pt1ID, + Name: model.NewCIStr(pt1Name), + } + pt2 := model.PartitionDefinition{ + ID: pt2ID, + Name: model.NewCIStr(pt2Name), + } + + pi := model.PartitionInfo{ + Enable: true, + Definitions: make([]model.PartitionDefinition, 0), + } + pi.Definitions = append(pi.Definitions, pt1) + pi.Definitions = append(pi.Definitions, pt2) + + tbl := model.TableInfo{ + ID: tableID, + Name: model.NewCIStr(tableName), + Partition: &pi, + } + value, err := json.Marshal(&tbl) + require.Nil(t, err) + + sr := MockEmptySchemasReplace(nil) + newValue, needRewrite, err := sr.rewriteTableInfo(value, dbId) + require.Nil(t, err) + require.True(t, needRewrite) + + err = json.Unmarshal(newValue, &tableInfo) + require.Nil(t, err) + require.Equal(t, tableInfo.Name.String(), tableName) + require.Equal(t, tableInfo.ID, sr.DbMap[dbId].TableMap[tableID].NewTableID) + require.Equal( + t, + tableInfo.Partition.Definitions[0].ID, + sr.DbMap[dbId].TableMap[tableID].PartitionMap[pt1ID], + ) + require.Equal( + t, + tbl.Partition.Definitions[0].Name, + tableInfo.Partition.Definitions[0].Name, + ) + require.Equal( + t, + tableInfo.Partition.Definitions[1].ID, + sr.DbMap[dbId].TableMap[tableID].PartitionMap[pt2ID], + ) + require.Equal( + t, + tbl.Partition.Definitions[1].Name, + tableInfo.Partition.Definitions[1].Name, + ) + + newID1 := sr.DbMap[dbId].TableMap[tableID].PartitionMap[pt1ID] + newID2 := sr.DbMap[dbId].TableMap[tableID].PartitionMap[pt2ID] + newValue, needRewrite, err = sr.rewriteTableInfo(value, dbId) + require.Nil(t, err) + require.True(t, needRewrite) + + err = json.Unmarshal(newValue, &tableInfo) + require.Nil(t, err) + require.Equal(t, tableInfo.Name.String(), tableName) + require.Equal( + t, + tableInfo.Partition.Definitions[0].ID, + sr.DbMap[dbId].TableMap[tableID].PartitionMap[pt1ID], + ) + require.Equal(t, tableInfo.Partition.Definitions[0].ID, newID1) + require.Equal( + t, + tableInfo.Partition.Definitions[1].ID, + sr.DbMap[dbId].TableMap[tableID].PartitionMap[pt2ID], ) + require.Equal(t, tableInfo.Partition.Definitions[1].ID, newID2) +} + +// db:70->80 - +// | - t0:71->81 - +// | | - p0:72->82 +// | | - p1:73->83 +// | | - p2:74->84 +// | - t1:75->85 + +const ( + mDDLJobDBOldID int64 = 70 + iota + mDDLJobTable0OldID + mDDLJobPartition0OldID + mDDLJobPartition1OldID + mDDLJobPartition2OldID + mDDLJobTable1OldID +) + +const ( + mDDLJobDBNewID int64 = 80 + iota + mDDLJobTable0NewID + mDDLJobPartition0NewID + mDDLJobPartition1NewID + mDDLJobPartition2NewID + mDDLJobTable1NewID +) + +var ( + mDDLJobALLNewTableIDSet = map[int64]struct{}{ + mDDLJobTable0NewID: {}, + mDDLJobPartition0NewID: {}, + mDDLJobPartition1NewID: {}, + mDDLJobPartition2NewID: {}, + mDDLJobTable1NewID: {}, + } + mDDLJobALLNewPartitionIDSet = map[int64]struct{}{ + mDDLJobPartition0NewID: {}, + mDDLJobPartition1NewID: {}, + mDDLJobPartition2NewID: {}, + } + mDDLJobALLIndexesIDSet = map[int64]struct{}{ + 2: {}, + 3: {}, + } +) + +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{ + Type: model.ActionMultiSchemaChange, + SchemaID: mDDLJobDBOldID, + TableID: mDDLJobTable0OldID, + MultiSchemaInfo: &model.MultiSchemaInfo{ + SubJobs: []*model.SubJob{ + { + Type: model.ActionDropIndex, + RawArgs: json.RawMessage(`[{"O":"k1","L":"k1"},false,1,[72,73,74]]`), + }, + { + Type: model.ActionDropIndex, + RawArgs: json.RawMessage(`[{"O":"k2","L":"k2"},false,2,[72,73,74]]`), + }, + }, + }, + } + multiSchemaChangeJob1 = &model.Job{ + Type: model.ActionMultiSchemaChange, + SchemaID: mDDLJobDBOldID, + TableID: mDDLJobTable1OldID, + MultiSchemaInfo: &model.MultiSchemaInfo{ + SubJobs: []*model.SubJob{ + { + Type: model.ActionDropIndex, + RawArgs: json.RawMessage(`[{"O":"k1","L":"k1"},false,1,[]]`), + }, + { + Type: model.ActionDropIndex, + RawArgs: json.RawMessage(`[{"O":"k2","L":"k2"},false,2,[]]`), + }, + }, + }, + } +) - v, err := ProduceValue(tableName, int64(tableID)) +type TableDeletQueryArgs struct { + tableIDs []int64 +} + +type IndexDeleteQueryArgs struct { + tableID int64 + indexIDs []int64 +} + +type mockInsertDeleteRange struct { + tableCh chan TableDeletQueryArgs + indexCh chan IndexDeleteQueryArgs +} + +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), + } +} + +func (midr *mockInsertDeleteRange) mockInsertDeleteRangeForTable(jobID int64, tableIDs []int64) { + midr.tableCh <- TableDeletQueryArgs{ + tableIDs: tableIDs, + } +} + +func (midr *mockInsertDeleteRange) mockInsertDeleteRangeForIndex(jobID int64, elementID *int64, tableID int64, indexIDs []int64) { + midr.indexCh <- IndexDeleteQueryArgs{ + tableID: tableID, + indexIDs: indexIDs, + } +} + +func TestDeleteRangeForMDDLJob(t *testing.T) { + midr := newMockInsertDeleteRange() + schemaReplace := MockEmptySchemasReplace(midr) + partitionMap := map[int64]int64{ + mDDLJobPartition0OldID: mDDLJobPartition0NewID, + mDDLJobPartition1OldID: mDDLJobPartition1NewID, + mDDLJobPartition2OldID: mDDLJobPartition2NewID, + } + tableReplace0 := &TableReplace{ + NewTableID: mDDLJobTable0NewID, + PartitionMap: partitionMap, + } + tableReplace1 := &TableReplace{ + NewTableID: mDDLJobTable1NewID, + } + tableMap := map[int64]*TableReplace{ + mDDLJobTable0OldID: tableReplace0, + mDDLJobTable1OldID: tableReplace1, + } + dbReplace := &DBReplace{ + NewDBID: mDDLJobDBNewID, + TableMap: tableMap, + } + schemaReplace.DbMap[mDDLJobDBOldID] = dbReplace + + var targs TableDeletQueryArgs + var iargs IndexDeleteQueryArgs + var err error + // drop schema + err = schemaReplace.deleteRange(dropSchemaJob) + require.NoError(t, err) + targs = <-midr.tableCh + require.Equal(t, len(targs.tableIDs), len(mDDLJobALLNewTableIDSet)) + for _, tableID := range targs.tableIDs { + _, exist := mDDLJobALLNewTableIDSet[tableID] + require.True(t, exist) + } + + // drop table0 + err = schemaReplace.deleteRange(dropTable0Job) + require.NoError(t, err) + targs = <-midr.tableCh + require.Equal(t, len(targs.tableIDs), len(mDDLJobALLNewPartitionIDSet)) + for _, tableID := range targs.tableIDs { + _, exist := mDDLJobALLNewPartitionIDSet[tableID] + require.True(t, exist) + } + + // drop table1 + err = schemaReplace.deleteRange(dropTable1Job) + require.NoError(t, err) + targs = <-midr.tableCh + require.Equal(t, len(targs.tableIDs), 1) + require.Equal(t, targs.tableIDs[0], mDDLJobTable1NewID) + + // drop table partition1 + err = schemaReplace.deleteRange(dropTable0Partition1Job) + require.NoError(t, err) + targs = <-midr.tableCh + require.Equal(t, len(targs.tableIDs), 1) + require.Equal(t, targs.tableIDs[0], mDDLJobPartition1NewID) + + // roll back add index for table0 + err = schemaReplace.deleteRange(rollBackTable0IndexJob) + require.NoError(t, err) + for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { + iargs = <-midr.indexCh + _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + 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) require.NoError(t, err) - log.Info("old-value", zap.Int("value-len", len(v)), zap.ByteString("old-value", v), logutil.Key("old-value", v)) + iargs = <-midr.indexCh + require.Equal(t, iargs.tableID, mDDLJobTable1NewID) + require.Equal(t, len(iargs.indexIDs), 1) + require.Equal(t, iargs.indexIDs[0], int64(2)) - v, err = ProduceValue(tableName, int64(newTableID)) + // drop index for table0 + err = schemaReplace.deleteRange(dropTable0IndexJob) require.NoError(t, err) - log.Info("new-value", zap.Int("value-len", len(v)), zap.ByteString("new-value", v), logutil.Key("new-value", v)) + for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { + iargs = <-midr.indexCh + _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + 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) + 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)) + + // drop indexes for table0 + err = schemaReplace.deleteRange(dropTable0IndexesJob) + require.NoError(t, err) + 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) + } + } + + // drop indexes for table1 + err = schemaReplace.deleteRange(dropTable1IndexesJob) + 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) + } + + // drop column for table0 + err = schemaReplace.deleteRange(dropTable0ColumnJob) + require.NoError(t, err) + 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) + } + } + + // 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] + require.True(t, exist) + } + + // drop columns for table0 + err = schemaReplace.deleteRange(dropTable0ColumnsJob) + require.NoError(t, err) + 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) + } + } + + // 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] + 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] + 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) + 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) + } + + // drop indexes(multi-schema-change) for table0 + err = schemaReplace.tryToGCJob(multiSchemaChangeJob0) + require.NoError(t, err) + for l := 0; l < 2; l++ { + for i := 0; i < len(mDDLJobALLNewPartitionIDSet); i++ { + iargs = <-midr.indexCh + _, exist := mDDLJobALLNewPartitionIDSet[iargs.tableID] + 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.tryToGCJob(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)) + } } diff --git a/br/pkg/stream/stream_mgr.go b/br/pkg/stream/stream_mgr.go index ca1322a2f66a5..c7604b62b2de2 100644 --- a/br/pkg/stream/stream_mgr.go +++ b/br/pkg/stream/stream_mgr.go @@ -15,8 +15,14 @@ package stream import ( + "context" + "strings" + "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" @@ -24,8 +30,25 @@ import ( "github.com/pingcap/tidb/util" filter "github.com/pingcap/tidb/util/table-filter" "go.uber.org/zap" + "golang.org/x/sync/errgroup" +) + +const ( + streamBackupMetaPrefix = "v1/backupmeta" + + streamBackupGlobalCheckpointPrefix = "v1/global_checkpoint" + + metaDataWorkerPoolSize = 128 ) +func GetStreamBackupMetaPrefix() string { + return streamBackupMetaPrefix +} + +func GetStreamBackupGlobalCheckpointPrefix() string { + return streamBackupGlobalCheckpointPrefix +} + // appendTableObserveRanges builds key ranges corresponding to `tblIDS`. func appendTableObserveRanges(tblIDs []int64) []kv.KeyRange { krs := make([]kv.KeyRange, 0, len(tblIDs)) @@ -133,3 +156,41 @@ func BuildObserveMetaRange() *kv.KeyRange { return &kv.KeyRange{StartKey: sk, EndKey: ek} } + +// FastUnmarshalMetaData used a 128 worker pool to speed up +// read metadata content from external_storage. +func FastUnmarshalMetaData( + ctx context.Context, + s storage.ExternalStorage, + fn func(path string, m *backuppb.Metadata) error, +) error { + log.Info("use workers to speed up reading metadata files", zap.Int("workers", metaDataWorkerPoolSize)) + pool := utils.NewWorkerPool(metaDataWorkerPoolSize, "metadata") + eg, ectx := errgroup.WithContext(ctx) + opt := &storage.WalkOption{SubDir: GetStreamBackupMetaPrefix()} + err := s.WalkDir(ectx, opt, func(path string, size int64) error { + readPath := path + pool.ApplyOnErrorGroup(eg, func() error { + log.Info("fast read meta file from storage", zap.String("path", readPath)) + b, err := s.ReadFile(ectx, readPath) + if err != nil { + return errors.Trace(err) + } + m := &backuppb.Metadata{} + err = m.Unmarshal(b) + if err != nil { + if !strings.HasSuffix(path, ".meta") { + return nil + } else { + return err + } + } + return fn(readPath, m) + }) + return nil + }) + if err != nil { + return errors.Trace(err) + } + return eg.Wait() +} diff --git a/br/pkg/stream/stream_misc_test.go b/br/pkg/stream/stream_misc_test.go index 804b9b25a877b..3a057ed2a16df 100644 --- a/br/pkg/stream/stream_misc_test.go +++ b/br/pkg/stream/stream_misc_test.go @@ -7,6 +7,7 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/tidb/br/pkg/stream" + "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/stretchr/testify/require" ) @@ -15,18 +16,27 @@ func TestGetCheckpointOfTask(t *testing.T) { Info: backuppb.StreamBackupTaskInfo{ StartTs: 8, }, - Progress: map[uint64]uint64{ - 1: 10, - 2: 8, - 6: 12, + Checkpoints: []streamhelper.Checkpoint{ + { + ID: 1, + TS: 10, + }, + { + ID: 2, + TS: 8, + }, + { + ID: 6, + TS: 12, + }, }, } - require.Equal(t, task.GetCheckpoint(), uint64(8), "progress = %v", task.Progress) - task.Progress[2] = 18 + require.Equal(t, task.GetMinStoreCheckpoint().TS, uint64(8), "progress = %v", task.Checkpoints) + task.Checkpoints[1].TS = 18 - require.Equal(t, task.GetCheckpoint(), uint64(10)) - task.Progress[1] = 14 + require.Equal(t, task.GetMinStoreCheckpoint().TS, uint64(10)) + task.Checkpoints[0].TS = 14 - require.Equal(t, task.GetCheckpoint(), uint64(12), "progress = %v", task.Progress) + require.Equal(t, task.GetMinStoreCheckpoint().TS, uint64(12), "progress = %v", task.Checkpoints) } diff --git a/br/pkg/stream/stream_status.go b/br/pkg/stream/stream_status.go index 3e59c638714ce..2fea633fae02d 100644 --- a/br/pkg/stream/stream_status.go +++ b/br/pkg/stream/stream_status.go @@ -4,12 +4,12 @@ package stream import ( "context" + "crypto/tls" "encoding/json" "fmt" "io" "regexp" "strconv" - "strings" "sync" "time" @@ -18,12 +18,13 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/log" - "github.com/pingcap/tidb/br/pkg/conn" "github.com/pingcap/tidb/br/pkg/glue" "github.com/pingcap/tidb/br/pkg/httputil" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/storage" + . "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/tikv/client-go/v2/oracle" + pd "github.com/tikv/pd/client" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) @@ -35,8 +36,10 @@ type TaskStatus struct { Info backuppb.StreamBackupTaskInfo // paused checks whether the task is paused. paused bool - // Progress maps the StoreID to NextBackupTs. - Progress map[uint64]uint64 + // global checkpoint from storage + globalCheckpoint uint64 + // Checkpoints collects the checkpoints. + Checkpoints []Checkpoint // Total QPS of the task in recent seconds. QPS float64 // Last error reported by the store. @@ -95,13 +98,18 @@ func (t *TaskStatus) colorfulStatusString() string { } // GetCheckpoint calculates the checkpoint of the task. -func (t TaskStatus) GetCheckpoint() uint64 { +func (t TaskStatus) GetMinStoreCheckpoint() Checkpoint { initialized := false - checkpoint := t.Info.StartTs - for _, ts := range t.Progress { - if !initialized || ts < checkpoint { + checkpoint := Checkpoint{ + TS: t.Info.StartTs, + } + for _, cp := range t.Checkpoints { + if cp.Type() == CheckpointTypeStore && (!initialized || cp.TS < checkpoint.TS) { initialized = true - checkpoint = ts + checkpoint = cp + } + if cp.Type() == CheckpointTypeGlobal { + return cp } } return checkpoint @@ -124,16 +132,14 @@ func (p *printByTable) AddTask(task TaskStatus) { pTime := oracle.GetTimeFromTS(ts) gap := now.Sub(pTime).Round(time.Second) gapColor := color.New(color.FgGreen) - if gap > 5*time.Minute { + if gap > 10*time.Minute { gapColor = color.New(color.FgRed) } info := fmt.Sprintf("%s; gap=%s", pTime, gapColor.Sprint(gap)) return info } - table.Add("checkpoint[global]", formatTS(task.GetCheckpoint())) - for store, p := range task.Progress { - table.Add(fmt.Sprintf("checkpoint[store=%d]", store), formatTS(p)) - } + table.Add("checkpoint[global]", formatTS(task.globalCheckpoint)) + p.addCheckpoints(&task, table, formatTS) for store, e := range task.LastErrors { table.Add(fmt.Sprintf("error[store=%d]", store), e.ErrorCode) table.Add(fmt.Sprintf("error-happen-at[store=%d]", store), formatTS(oracle.ComposeTS(int64(e.HappenAt), 0))) @@ -142,6 +148,19 @@ func (p *printByTable) AddTask(task TaskStatus) { p.pendingTables = append(p.pendingTables, table) } +func (p *printByTable) addCheckpoints(task *TaskStatus, table *glue.Table, formatTS func(uint64) string) { + cp := task.GetMinStoreCheckpoint() + if cp.Type() != CheckpointTypeGlobal { + for _, cp := range task.Checkpoints { + switch cp.Type() { + case CheckpointTypeStore: + table.Add(fmt.Sprintf("checkpoint[store=%d]", cp.ID), formatTS(cp.TS)) + } + } + } + +} + func (p *printByTable) PrintTasks() { if len(p.pendingTables) == 0 { p.console.Println(statusErr("No Task Yet.")) @@ -173,24 +192,26 @@ func (p *printByJSON) PrintTasks() { LastError backuppb.StreamBackupError `json:"last_error"` } type jsonTask struct { - Name string `json:"name"` - StartTS uint64 `json:"start_ts,omitempty"` - EndTS uint64 `json:"end_ts,omitempty"` - TableFilter []string `json:"table_filter"` - Progress []storeProgress `json:"progress"` - Storage string `json:"storage"` - Checkpoint uint64 `json:"checkpoint"` - EstQPS float64 `json:"estimate_qps"` - LastErrors []storeLastError `json:"last_errors"` + Name string `json:"name"` + StartTS uint64 `json:"start_ts,omitempty"` + EndTS uint64 `json:"end_ts,omitempty"` + TableFilter []string `json:"table_filter"` + Progress []storeProgress `json:"progress"` + Storage string `json:"storage"` + CheckpointTS uint64 `json:"checkpoint"` + EstQPS float64 `json:"estimate_qps"` + LastErrors []storeLastError `json:"last_errors"` } taskToJSON := func(t TaskStatus) jsonTask { s := storage.FormatBackendURL(t.Info.GetStorage()) - sp := make([]storeProgress, 0, len(t.Progress)) - for store, checkpoint := range t.Progress { - sp = append(sp, storeProgress{ - StoreID: store, - Checkpoint: checkpoint, - }) + sp := make([]storeProgress, 0, len(t.Checkpoints)) + for _, checkpoint := range t.Checkpoints { + if checkpoint.Type() == CheckpointTypeStore { + sp = append(sp, storeProgress{ + StoreID: checkpoint.ID, + Checkpoint: checkpoint.TS, + }) + } } se := make([]storeLastError, 0, len(t.LastErrors)) for store, lastError := range t.LastErrors { @@ -200,15 +221,15 @@ func (p *printByJSON) PrintTasks() { }) } return jsonTask{ - Name: t.Info.GetName(), - StartTS: t.Info.GetStartTs(), - EndTS: t.Info.GetEndTs(), - TableFilter: t.Info.GetTableFilter(), - Progress: sp, - Storage: s.String(), - Checkpoint: t.GetCheckpoint(), - EstQPS: t.QPS, - LastErrors: se, + Name: t.Info.GetName(), + StartTS: t.Info.GetStartTs(), + EndTS: t.Info.GetEndTs(), + TableFilter: t.Info.GetTableFilter(), + Progress: sp, + Storage: s.String(), + CheckpointTS: t.globalCheckpoint, + EstQPS: t.QPS, + LastErrors: se, } } mustMarshal := func(i interface{}) string { @@ -228,10 +249,15 @@ func (p *printByJSON) PrintTasks() { var logCountSumRe = regexp.MustCompile(`tikv_stream_handle_kv_batch_sum ([0-9]+)`) +type PDInfoProvider interface { + GetPDClient() pd.Client + GetTLSConfig() *tls.Config +} + // MaybeQPS get a number like the QPS of last seconds for each store via the prometheus interface. // TODO: this is a temporary solution(aha, like in a Hackthon), // we MUST find a better way for providing this information. -func MaybeQPS(ctx context.Context, mgr *conn.Mgr) (float64, error) { +func MaybeQPS(ctx context.Context, mgr PDInfoProvider) (float64, error) { c := mgr.GetPDClient() prefix := "http://" if mgr.GetTLSConfig() != nil { @@ -303,12 +329,12 @@ func MaybeQPS(ctx context.Context, mgr *conn.Mgr) (float64, error) { // StatusController is the controller type (or context type) for the command `stream status`. type StatusController struct { meta *MetaDataClient - mgr *conn.Mgr + mgr PDInfoProvider view TaskPrinter } // NewStatusContorller make a status controller via some resource accessors. -func NewStatusController(meta *MetaDataClient, mgr *conn.Mgr, view TaskPrinter) *StatusController { +func NewStatusController(meta *MetaDataClient, mgr PDInfoProvider, view TaskPrinter) *StatusController { return &StatusController{ meta: meta, mgr: mgr, @@ -316,15 +342,6 @@ func NewStatusController(meta *MetaDataClient, mgr *conn.Mgr, view TaskPrinter) } } -func isTiFlash(store *metapb.Store) bool { - for _, l := range store.GetLabels() { - if strings.EqualFold(l.Key, "engine") && strings.EqualFold(l.Value, "tiflash") { - return true - } - } - return false -} - // fillTask queries and fills the extra information for a raw task. func (ctl *StatusController) fillTask(ctx context.Context, task Task) (TaskStatus, error) { var err error @@ -336,21 +353,12 @@ func (ctl *StatusController) fillTask(ctx context.Context, task Task) (TaskStatu return s, errors.Annotatef(err, "failed to get pause status of task %s", s.Info.Name) } - if s.Progress, err = task.NextBackupTSList(ctx); err != nil { + if s.Checkpoints, err = task.NextBackupTSList(ctx); err != nil { return s, errors.Annotatef(err, "failed to get progress of task %s", s.Info.Name) } - stores, err := ctl.mgr.GetPDClient().GetAllStores(ctx) - if err != nil { - return s, errors.Annotate(err, "failed to get stores from PD") - } - for _, store := range stores { - if isTiFlash(store) { - continue - } - if _, ok := s.Progress[store.GetId()]; !ok { - s.Progress[store.GetId()] = s.Info.StartTs - } + if s.globalCheckpoint, err = task.GetStorageCheckpoint(ctx); err != nil { + return s, errors.Annotatef(err, "failed to get storage checkpoint of task %s", s.Info.Name) } s.LastErrors, err = task.LastError(ctx) diff --git a/br/pkg/streamhelper/BUILD.bazel b/br/pkg/streamhelper/BUILD.bazel new file mode 100644 index 0000000000000..e3761c9b14361 --- /dev/null +++ b/br/pkg/streamhelper/BUILD.bazel @@ -0,0 +1,84 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "streamhelper", + srcs = [ + "advancer.go", + "advancer_daemon.go", + "advancer_env.go", + "client.go", + "collector.go", + "models.go", + "prefix_scanner.go", + "regioniter.go", + "stream_listener.go", + "tsheap.go", + ], + importpath = "github.com/pingcap/tidb/br/pkg/streamhelper", + visibility = ["//visibility:public"], + deps = [ + "//br/pkg/errors", + "//br/pkg/logutil", + "//br/pkg/redact", + "//br/pkg/streamhelper/config", + "//br/pkg/utils", + "//config", + "//kv", + "//metrics", + "//owner", + "@com_github_gogo_protobuf//proto", + "@com_github_golang_protobuf//proto", + "@com_github_google_btree//:btree", + "@com_github_google_uuid//:uuid", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_kvproto//pkg/logbackuppb", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_log//:log", + "@com_github_tikv_client_go_v2//kv", + "@com_github_tikv_client_go_v2//oracle", + "@com_github_tikv_pd_client//:client", + "@io_etcd_go_etcd_client_v3//:client", + "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//keepalive", + "@org_golang_x_sync//errgroup", + "@org_uber_go_zap//:zap", + "@org_uber_go_zap//zapcore", + ], +) + +go_test( + name = "streamhelper_test", + srcs = [ + "advancer_test.go", + "basic_lib_for_test.go", + "integration_test.go", + "regioniter_test.go", + "tsheap_test.go", + ], + deps = [ + ":streamhelper", + "//br/pkg/errors", + "//br/pkg/logutil", + "//br/pkg/redact", + "//br/pkg/storage", + "//br/pkg/streamhelper/config", + "//kv", + "//tablecodec", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_kvproto//pkg/brpb", + "@com_github_pingcap_kvproto//pkg/errorpb", + "@com_github_pingcap_kvproto//pkg/logbackuppb", + "@com_github_pingcap_kvproto//pkg/metapb", + "@com_github_pingcap_log//:log", + "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//kv", + "@io_etcd_go_etcd_client_v3//:client", + "@io_etcd_go_etcd_server_v3//embed", + "@io_etcd_go_etcd_server_v3//mvcc", + "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//status", + "@org_uber_go_zap//zapcore", + ], +) diff --git a/br/pkg/streamhelper/advancer.go b/br/pkg/streamhelper/advancer.go new file mode 100644 index 0000000000000..1dc911b5f81bf --- /dev/null +++ b/br/pkg/streamhelper/advancer.go @@ -0,0 +1,521 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "bytes" + "context" + "math" + "reflect" + "sort" + "strings" + "sync" + "time" + + "github.com/pingcap/errors" + 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/streamhelper/config" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" + "github.com/tikv/client-go/v2/oracle" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" +) + +// CheckpointAdvancer is the central node for advancing the checkpoint of log backup. +// It's a part of "checkpoint v3". +// Generally, it scan the regions in the task range, collect checkpoints from tikvs. +// ┌──────┐ +// ┌────►│ TiKV │ +// │ └──────┘ +// │ +// │ +// ┌──────────┐GetLastFlushTSOfRegion│ ┌──────┐ +// │ Advancer ├──────────────────────┼────►│ TiKV │ +// └────┬─────┘ │ └──────┘ +// │ │ +// │ │ +// │ │ ┌──────┐ +// │ └────►│ TiKV │ +// │ └──────┘ +// │ +// │ UploadCheckpointV3 ┌──────────────────┐ +// └─────────────────────►│ PD │ +// └──────────────────┘ +type CheckpointAdvancer struct { + env Env + + // The concurrency accessed task: + // both by the task listener and ticking. + task *backuppb.StreamBackupTaskInfo + taskMu sync.Mutex + + // the read-only config. + // once tick begin, this should not be changed for now. + cfg config.Config + + // the cache of region checkpoints. + // so we can advance only ranges with huge gap. + cache CheckpointsCache + + // the internal state of advancer. + state advancerState + // the cached last checkpoint. + // if no progress, this cache can help us don't to send useless requests. + lastCheckpoint uint64 +} + +// advancerState is the sealed type for the state of advancer. +// the advancer has two stage: full scan and update small tree. +type advancerState interface { + // Note: + // Go doesn't support sealed classes or ADTs currently. + // (it can only be used at generic constraints...) + // Leave it empty for now. + + // ~*fullScan | ~*updateSmallTree +} + +// fullScan is the initial state of advancer. +// in this stage, we would "fill" the cache: +// insert ranges that union of them become the full range of task. +type fullScan struct { + fullScanTick int +} + +// updateSmallTree is the "incremental stage" of advancer. +// we have build a "filled" cache, and we can pop a subrange of it, +// try to advance the checkpoint of those ranges. +type updateSmallTree struct { + consistencyCheckTick int +} + +// NewCheckpointAdvancer creates a checkpoint advancer with the env. +func NewCheckpointAdvancer(env Env) *CheckpointAdvancer { + return &CheckpointAdvancer{ + env: env, + cfg: config.Default(), + cache: NewCheckpoints(), + state: &fullScan{}, + } +} + +// disableCache removes the cache. +// note this won't lock the checkpoint advancer at `fullScan` state forever, +// you may need to change the config `AdvancingByCache`. +func (c *CheckpointAdvancer) disableCache() { + c.cache = NoOPCheckpointCache{} + c.state = &fullScan{} +} + +// enable the cache. +// also check `AdvancingByCache` in the config. +func (c *CheckpointAdvancer) enableCache() { + c.cache = NewCheckpoints() + c.state = &fullScan{} +} + +// UpdateConfig updates the config for the advancer. +// Note this should be called before starting the loop, because there isn't locks, +// TODO: support updating config when advancer starts working. +// (Maybe by applying changes at begin of ticking, and add locks.) +func (c *CheckpointAdvancer) UpdateConfig(newConf config.Config) { + needRefreshCache := newConf.AdvancingByCache != c.cfg.AdvancingByCache + c.cfg = newConf + if needRefreshCache { + if c.cfg.AdvancingByCache { + c.enableCache() + } else { + c.disableCache() + } + } +} + +// UpdateConfigWith updates the config by modifying the current config. +func (c *CheckpointAdvancer) UpdateConfigWith(f func(*config.Config)) { + cfg := c.cfg + f(&cfg) + c.UpdateConfig(cfg) +} + +// Config returns the current config. +func (c *CheckpointAdvancer) Config() config.Config { + return c.cfg +} + +// GetCheckpointInRange scans the regions in the range, +// collect them to the collector. +func (c *CheckpointAdvancer) GetCheckpointInRange(ctx context.Context, start, end []byte, collector *clusterCollector) error { + log.Debug("scanning range", logutil.Key("start", start), logutil.Key("end", end)) + iter := IterateRegion(c.env, start, end) + for !iter.Done() { + rs, err := iter.Next(ctx) + if err != nil { + return err + } + log.Debug("scan region", zap.Int("len", len(rs))) + for _, r := range rs { + err := collector.collectRegion(r) + if err != nil { + log.Warn("meet error during getting checkpoint", logutil.ShortError(err)) + return err + } + } + } + return nil +} + +func (c *CheckpointAdvancer) recordTimeCost(message string, fields ...zap.Field) func() { + now := time.Now() + label := strings.ReplaceAll(message, " ", "-") + return func() { + cost := time.Since(now) + fields = append(fields, zap.Stringer("take", cost)) + metrics.AdvancerTickDuration.WithLabelValues(label).Observe(cost.Seconds()) + log.Debug(message, fields...) + } +} + +// tryAdvance tries to advance the checkpoint ts of a set of ranges which shares the same checkpoint. +func (c *CheckpointAdvancer) tryAdvance(ctx context.Context, rst RangesSharesTS) (err error) { + defer c.recordTimeCost("try advance", zap.Uint64("checkpoint", rst.TS), zap.Int("len", len(rst.Ranges)))() + defer func() { + if err != nil { + log.Warn("failed to advance", logutil.ShortError(err), zap.Object("target", rst.Zap())) + c.cache.InsertRanges(rst) + } + }() + defer utils.PanicToErr(&err) + + ranges := CollapseRanges(len(rst.Ranges), func(i int) kv.KeyRange { return rst.Ranges[i] }) + workers := utils.NewWorkerPool(4, "sub ranges") + eg, cx := errgroup.WithContext(ctx) + collector := NewClusterCollector(ctx, c.env) + collector.setOnSuccessHook(c.cache.InsertRange) + for _, r := range ranges { + r := r + workers.ApplyOnErrorGroup(eg, func() (e error) { + defer c.recordTimeCost("get regions in range", zap.Uint64("checkpoint", rst.TS))() + defer utils.PanicToErr(&e) + return c.GetCheckpointInRange(cx, r.StartKey, r.EndKey, collector) + }) + } + err = eg.Wait() + if err != nil { + return err + } + + result, err := collector.Finish(ctx) + if err != nil { + return err + } + fr := result.FailureSubRanges + if len(fr) != 0 { + log.Debug("failure regions collected", zap.Int("size", len(fr))) + c.cache.InsertRanges(RangesSharesTS{ + TS: rst.TS, + Ranges: fr, + }) + } + return nil +} + +// CalculateGlobalCheckpointLight tries to advance the global checkpoint by the cache. +func (c *CheckpointAdvancer) CalculateGlobalCheckpointLight(ctx context.Context) (uint64, error) { + log.Info("[log backup advancer hint] advancer with cache: current tree", zap.Stringer("ct", c.cache)) + rsts := c.cache.PopRangesWithGapGT(config.DefaultTryAdvanceThreshold) + if len(rsts) == 0 { + return 0, nil + } + samples := rsts + if len(rsts) > 3 { + samples = rsts[:3] + } + for _, sample := range samples { + log.Info("[log backup advancer hint] sample range.", zap.Object("range", sample.Zap()), zap.Int("total-len", len(rsts))) + } + + workers := utils.NewWorkerPool(uint(config.DefaultMaxConcurrencyAdvance), "regions") + eg, cx := errgroup.WithContext(ctx) + for _, rst := range rsts { + rst := rst + workers.ApplyOnErrorGroup(eg, func() (err error) { + return c.tryAdvance(cx, *rst) + }) + } + err := eg.Wait() + if err != nil { + return 0, err + } + ts := c.cache.CheckpointTS() + return ts, nil +} + +// CalculateGlobalCheckpoint calculates the global checkpoint, which won't use the cache. +func (c *CheckpointAdvancer) CalculateGlobalCheckpoint(ctx context.Context) (uint64, error) { + var ( + cp = uint64(math.MaxInt64) + // TODO: Use The task range here. + thisRun []kv.KeyRange = []kv.KeyRange{{}} + nextRun []kv.KeyRange + ) + defer c.recordTimeCost("record all") + for { + coll := NewClusterCollector(ctx, c.env) + coll.setOnSuccessHook(c.cache.InsertRange) + for _, u := range thisRun { + err := c.GetCheckpointInRange(ctx, u.StartKey, u.EndKey, coll) + if err != nil { + return 0, err + } + } + result, err := coll.Finish(ctx) + if err != nil { + return 0, err + } + log.Debug("full: a run finished", zap.Any("checkpoint", result)) + + nextRun = append(nextRun, result.FailureSubRanges...) + if cp > result.Checkpoint { + cp = result.Checkpoint + } + if len(nextRun) == 0 { + return cp, nil + } + thisRun = nextRun + nextRun = nil + log.Debug("backoffing with subranges", zap.Int("subranges", len(thisRun))) + time.Sleep(c.cfg.BackoffTime) + } +} + +// CollapseRanges collapse ranges overlapping or adjacent. +// Example: +// CollapseRanges({[1, 4], [2, 8], [3, 9]}) == {[1, 9]} +// CollapseRanges({[1, 3], [4, 7], [2, 3]}) == {[1, 3], [4, 7]} +func CollapseRanges(length int, getRange func(int) kv.KeyRange) []kv.KeyRange { + frs := make([]kv.KeyRange, 0, length) + for i := 0; i < length; i++ { + frs = append(frs, getRange(i)) + } + + sort.Slice(frs, func(i, j int) bool { + return bytes.Compare(frs[i].StartKey, frs[j].StartKey) < 0 + }) + + result := make([]kv.KeyRange, 0, len(frs)) + i := 0 + for i < len(frs) { + item := frs[i] + for { + i++ + if i >= len(frs) || (len(item.EndKey) != 0 && bytes.Compare(frs[i].StartKey, item.EndKey) > 0) { + break + } + if len(item.EndKey) != 0 && bytes.Compare(item.EndKey, frs[i].EndKey) < 0 || len(frs[i].EndKey) == 0 { + item.EndKey = frs[i].EndKey + } + } + result = append(result, item) + } + return result +} + +func (c *CheckpointAdvancer) consumeAllTask(ctx context.Context, ch <-chan TaskEvent) error { + for { + select { + case e, ok := <-ch: + if !ok { + return nil + } + log.Info("meet task event", zap.Stringer("event", &e)) + if err := c.onTaskEvent(e); err != nil { + if errors.Cause(e.Err) != context.Canceled { + log.Error("listen task meet error, would reopen.", logutil.ShortError(err)) + return err + } + return nil + } + default: + return nil + } + } +} + +// beginListenTaskChange bootstraps the initial task set, +// and returns a channel respecting the change of tasks. +func (c *CheckpointAdvancer) beginListenTaskChange(ctx context.Context) (<-chan TaskEvent, error) { + ch := make(chan TaskEvent, 1024) + if err := c.env.Begin(ctx, ch); err != nil { + return nil, err + } + err := c.consumeAllTask(ctx, ch) + if err != nil { + return nil, err + } + return ch, nil +} + +// StartTaskListener starts the task listener for the advancer. +// When no task detected, advancer would do nothing, please call this before begin the tick loop. +func (c *CheckpointAdvancer) StartTaskListener(ctx context.Context) { + cx, cancel := context.WithCancel(ctx) + var ch <-chan TaskEvent + for { + if cx.Err() != nil { + // make linter happy. + cancel() + return + } + var err error + ch, err = c.beginListenTaskChange(cx) + if err == nil { + break + } + log.Warn("failed to begin listening, retrying...", logutil.ShortError(err)) + time.Sleep(c.cfg.BackoffTime) + } + + go func() { + defer cancel() + for { + select { + case <-ctx.Done(): + return + case e, ok := <-ch: + if !ok { + return + } + log.Info("meet task event", zap.Stringer("event", &e)) + if err := c.onTaskEvent(e); err != nil { + if errors.Cause(e.Err) != context.Canceled { + log.Error("listen task meet error, would reopen.", logutil.ShortError(err)) + time.AfterFunc(c.cfg.BackoffTime, func() { c.StartTaskListener(ctx) }) + } + return + } + } + } + }() +} + +func (c *CheckpointAdvancer) onTaskEvent(e TaskEvent) error { + c.taskMu.Lock() + defer c.taskMu.Unlock() + switch e.Type { + case EventAdd: + c.task = e.Info + case EventDel: + c.task = nil + c.state = &fullScan{} + c.cache.Clear() + case EventErr: + return e.Err + } + return nil +} + +// advanceCheckpointBy advances the checkpoint by a checkpoint getter function. +func (c *CheckpointAdvancer) advanceCheckpointBy(ctx context.Context, getCheckpoint func(context.Context) (uint64, error)) error { + start := time.Now() + cp, err := getCheckpoint(ctx) + if err != nil { + return err + } + log.Info("get checkpoint", zap.Uint64("old", c.lastCheckpoint), zap.Uint64("new", cp)) + if cp < c.lastCheckpoint { + log.Warn("failed to update global checkpoint: stale", zap.Uint64("old", c.lastCheckpoint), zap.Uint64("new", cp)) + } + if cp <= c.lastCheckpoint { + return nil + } + + log.Info("uploading checkpoint for task", + zap.Stringer("checkpoint", oracle.GetTimeFromTS(cp)), + zap.Uint64("checkpoint", cp), + zap.String("task", c.task.Name), + zap.Stringer("take", time.Since(start))) + if err := c.env.UploadV3GlobalCheckpointForTask(ctx, c.task.Name, cp); err != nil { + return errors.Annotate(err, "failed to upload global checkpoint") + } + c.lastCheckpoint = cp + metrics.LastCheckpoint.WithLabelValues(c.task.GetName()).Set(float64(c.lastCheckpoint)) + return nil +} + +// OnTick advances the inner logic clock for the advancer. +// It's synchronous: this would only return after the events triggered by the clock has all been done. +// It's generally panic-free, you may not need to trying recover a panic here. +func (c *CheckpointAdvancer) OnTick(ctx context.Context) (err error) { + defer c.recordTimeCost("tick")() + defer func() { + e := recover() + if e != nil { + log.Error("panic during handing tick", zap.Stack("stack"), logutil.ShortError(err)) + err = errors.Annotatef(berrors.ErrUnknown, "panic during handling tick: %s", e) + } + }() + err = c.tick(ctx) + return +} + +func (c *CheckpointAdvancer) onConsistencyCheckTick(s *updateSmallTree) error { + if s.consistencyCheckTick > 0 { + s.consistencyCheckTick-- + return nil + } + defer c.recordTimeCost("consistency check")() + err := c.cache.ConsistencyCheck() + if err != nil { + log.Error("consistency check failed! log backup may lose data! rolling back to full scan for saving.", logutil.ShortError(err)) + c.state = &fullScan{} + return err + } else { + log.Debug("consistency check passed.") + } + s.consistencyCheckTick = config.DefaultConsistencyCheckTick + return nil +} + +func (c *CheckpointAdvancer) tick(ctx context.Context) error { + c.taskMu.Lock() + defer c.taskMu.Unlock() + + switch s := c.state.(type) { + case *fullScan: + if s.fullScanTick > 0 { + s.fullScanTick-- + break + } + if c.task == nil { + log.Debug("No tasks yet, skipping advancing.") + return nil + } + defer func() { + s.fullScanTick = c.cfg.FullScanTick + }() + err := c.advanceCheckpointBy(ctx, c.CalculateGlobalCheckpoint) + if err != nil { + return err + } + + if c.cfg.AdvancingByCache { + c.state = &updateSmallTree{} + } + case *updateSmallTree: + if err := c.onConsistencyCheckTick(s); err != nil { + return err + } + err := c.advanceCheckpointBy(ctx, c.CalculateGlobalCheckpointLight) + if err != nil { + return err + } + default: + log.Error("Unknown state type, skipping tick", zap.Stringer("type", reflect.TypeOf(c.state))) + } + return nil +} diff --git a/br/pkg/streamhelper/advancer_daemon.go b/br/pkg/streamhelper/advancer_daemon.go new file mode 100644 index 0000000000000..909bdd85df3c6 --- /dev/null +++ b/br/pkg/streamhelper/advancer_daemon.go @@ -0,0 +1,81 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "context" + "time" + + "github.com/google/uuid" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/owner" + clientv3 "go.etcd.io/etcd/client/v3" + "go.uber.org/zap" +) + +const ( + ownerPrompt = "log-backup" + ownerPath = "/tidb/br-stream/owner" +) + +// AdvancerDaemon is a "high-availability" version of advancer. +// It involved the manager for electing a owner and doing things. +// You can embed it into your code by simply call: +// +// ad := NewAdvancerDaemon(adv, mgr) +// loop, err := ad.Begin(ctx) +// if err != nil { +// return err +// } +// loop() +type AdvancerDaemon struct { + adv *CheckpointAdvancer + manager owner.Manager +} + +func NewAdvancerDaemon(adv *CheckpointAdvancer, manager owner.Manager) *AdvancerDaemon { + return &AdvancerDaemon{ + adv: adv, + manager: manager, + } +} + +func OwnerManagerForLogBackup(ctx context.Context, etcdCli *clientv3.Client) owner.Manager { + id := uuid.New() + return owner.NewOwnerManager(ctx, etcdCli, ownerPrompt, id.String(), ownerPath) +} + +// Begin starts the daemon. +// It would do some bootstrap task, and return a closure that would begin the main loop. +func (ad *AdvancerDaemon) Begin(ctx context.Context) (func(), error) { + log.Info("begin advancer daemon", zap.String("id", ad.manager.ID())) + if err := ad.manager.CampaignOwner(); err != nil { + return nil, err + } + + ad.adv.StartTaskListener(ctx) + tick := time.NewTicker(ad.adv.cfg.TickDuration) + loop := func() { + log.Info("begin advancer daemon loop", zap.String("id", ad.manager.ID())) + for { + select { + case <-ctx.Done(): + log.Info("advancer loop exits", zap.String("id", ad.manager.ID())) + return + case <-tick.C: + log.Debug("deamon tick start", zap.Bool("is-owner", ad.manager.IsOwner())) + if ad.manager.IsOwner() { + metrics.AdvancerOwner.Set(1.0) + if err := ad.adv.OnTick(ctx); err != nil { + log.Warn("failed on tick", logutil.ShortError(err)) + } + } else { + metrics.AdvancerOwner.Set(0.0) + } + } + } + } + return loop, nil +} diff --git a/br/pkg/streamhelper/advancer_env.go b/br/pkg/streamhelper/advancer_env.go new file mode 100644 index 0000000000000..21c61ff129ce2 --- /dev/null +++ b/br/pkg/streamhelper/advancer_env.go @@ -0,0 +1,107 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "context" + "time" + + logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/config" + pd "github.com/tikv/pd/client" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/keepalive" +) + +// Env is the interface required by the advancer. +type Env interface { + // The region scanner provides the region information. + RegionScanner + // LogBackupService connects to the TiKV, so we can collect the region checkpoints. + LogBackupService + // StreamMeta connects to the metadata service (normally PD). + StreamMeta +} + +// PDRegionScanner is a simple wrapper over PD +// to adapt the requirement of `RegionScan`. +type PDRegionScanner struct { + pd.Client +} + +// RegionScan gets a list of regions, starts from the region that contains key. +// Limit limits the maximum number of regions returned. +func (c PDRegionScanner) RegionScan(ctx context.Context, key []byte, endKey []byte, limit int) ([]RegionWithLeader, error) { + rs, err := c.Client.ScanRegions(ctx, key, endKey, limit) + if err != nil { + return nil, err + } + rls := make([]RegionWithLeader, 0, len(rs)) + for _, r := range rs { + rls = append(rls, RegionWithLeader{ + Region: r.Meta, + Leader: r.Leader, + }) + } + return rls, nil +} + +// clusterEnv is the environment for running in the real cluster. +type clusterEnv struct { + clis *utils.StoreManager + *TaskEventClient + PDRegionScanner +} + +// GetLogBackupClient gets the log backup client. +func (t clusterEnv) GetLogBackupClient(ctx context.Context, storeID uint64) (logbackup.LogBackupClient, error) { + var cli logbackup.LogBackupClient + err := t.clis.WithConn(ctx, storeID, func(cc *grpc.ClientConn) { + cli = logbackup.NewLogBackupClient(cc) + }) + if err != nil { + return nil, err + } + return cli, nil +} + +// CliEnv creates the Env for CLI usage. +func CliEnv(cli *utils.StoreManager, etcdCli *clientv3.Client) Env { + return clusterEnv{ + clis: cli, + TaskEventClient: &TaskEventClient{MetaDataClient: *NewMetaDataClient(etcdCli)}, + PDRegionScanner: PDRegionScanner{cli.PDClient()}, + } +} + +// TiDBEnv creates the Env by TiDB config. +func TiDBEnv(pdCli pd.Client, etcdCli *clientv3.Client, conf *config.Config) (Env, error) { + tconf, err := conf.GetTiKVConfig().Security.ToTLSConfig() + if err != nil { + return nil, err + } + return clusterEnv{ + clis: utils.NewStoreManager(pdCli, keepalive.ClientParameters{ + Time: time.Duration(conf.TiKVClient.GrpcKeepAliveTime) * time.Second, + Timeout: time.Duration(conf.TiKVClient.GrpcKeepAliveTimeout) * time.Second, + }, tconf), + TaskEventClient: &TaskEventClient{MetaDataClient: *NewMetaDataClient(etcdCli)}, + PDRegionScanner: PDRegionScanner{Client: pdCli}, + }, nil +} + +type LogBackupService interface { + // GetLogBackupClient gets the log backup client. + GetLogBackupClient(ctx context.Context, storeID uint64) (logbackup.LogBackupClient, error) +} + +// StreamMeta connects to the metadata service (normally PD). +// It provides the global checkpoint information. +type StreamMeta interface { + // Begin begins listen the task event change. + Begin(ctx context.Context, ch chan<- TaskEvent) error + // UploadV3GlobalCheckpointForTask uploads the global checkpoint to the meta store. + UploadV3GlobalCheckpointForTask(ctx context.Context, taskName string, checkpoint uint64) error +} diff --git a/br/pkg/streamhelper/advancer_test.go b/br/pkg/streamhelper/advancer_test.go new file mode 100644 index 0000000000000..f32b099069726 --- /dev/null +++ b/br/pkg/streamhelper/advancer_test.go @@ -0,0 +1,185 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper_test + +import ( + "context" + "fmt" + "sync" + "testing" + "time" + + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/br/pkg/streamhelper/config" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func TestBasic(t *testing.T) { + c := createFakeCluster(t, 4, false) + defer func() { + fmt.Println(c) + }() + c.splitAndScatter("01", "02", "022", "023", "033", "04", "043") + ctx := context.Background() + minCheckpoint := c.advanceCheckpoints() + env := &testEnv{fakeCluster: c, testCtx: t} + adv := streamhelper.NewCheckpointAdvancer(env) + coll := streamhelper.NewClusterCollector(ctx, env) + err := adv.GetCheckpointInRange(ctx, []byte{}, []byte{}, coll) + require.NoError(t, err) + r, err := coll.Finish(ctx) + require.NoError(t, err) + require.Len(t, r.FailureSubRanges, 0) + require.Equal(t, r.Checkpoint, minCheckpoint, "%d %d", r.Checkpoint, minCheckpoint) +} + +func TestTick(t *testing.T) { + c := createFakeCluster(t, 4, false) + defer func() { + fmt.Println(c) + }() + c.splitAndScatter("01", "02", "022", "023", "033", "04", "043") + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + env := &testEnv{fakeCluster: c, testCtx: t} + adv := streamhelper.NewCheckpointAdvancer(env) + adv.StartTaskListener(ctx) + adv.UpdateConfigWith(func(cac *config.Config) { + cac.FullScanTick = 0 + }) + require.NoError(t, adv.OnTick(ctx)) + for i := 0; i < 5; i++ { + cp := c.advanceCheckpoints() + require.NoError(t, adv.OnTick(ctx)) + require.Equal(t, env.getCheckpoint(), cp) + } +} + +func TestWithFailure(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + c := createFakeCluster(t, 4, true) + defer func() { + fmt.Println(c) + }() + c.splitAndScatter("01", "02", "022", "023", "033", "04", "043") + c.flushAll() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + env := &testEnv{fakeCluster: c, testCtx: t} + adv := streamhelper.NewCheckpointAdvancer(env) + adv.StartTaskListener(ctx) + adv.UpdateConfigWith(func(cac *config.Config) { + cac.FullScanTick = 0 + }) + require.NoError(t, adv.OnTick(ctx)) + + cp := c.advanceCheckpoints() + for _, v := range c.stores { + v.flush() + break + } + require.NoError(t, adv.OnTick(ctx)) + require.Less(t, env.getCheckpoint(), cp, "%d %d", env.getCheckpoint(), cp) + + for _, v := range c.stores { + v.flush() + } + + require.NoError(t, adv.OnTick(ctx)) + require.Equal(t, env.getCheckpoint(), cp) +} + +func shouldFinishInTime(t *testing.T, d time.Duration, name string, f func()) { + ch := make(chan struct{}) + go func() { + f() + close(ch) + }() + select { + case <-time.After(d): + t.Fatalf("%s should finish in %s, but not", name, d) + case <-ch: + } +} + +func TestCollectorFailure(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + c := createFakeCluster(t, 4, true) + c.onGetClient = func(u uint64) error { + return status.Error(codes.DataLoss, + "Exiled requests from the client, please slow down and listen a story: "+ + "the server has been dropped, we are longing for new nodes, however the goddess(k8s) never allocates new resource. "+ + "May you take the sword named `vim`, refactoring the definition of the nature, in the yaml file hidden at somewhere of the cluster, "+ + "to save all of us and gain the response you desiring?") + } + ctx := context.Background() + splitKeys := make([]string, 0, 10000) + for i := 0; i < 10000; i++ { + splitKeys = append(splitKeys, fmt.Sprintf("%04d", i)) + } + c.splitAndScatter(splitKeys...) + + env := &testEnv{fakeCluster: c, testCtx: t} + adv := streamhelper.NewCheckpointAdvancer(env) + coll := streamhelper.NewClusterCollector(ctx, env) + + shouldFinishInTime(t, 30*time.Second, "scan with always fail", func() { + // At this time, the sending may or may not fail because the sending and batching is doing asynchronously. + _ = adv.GetCheckpointInRange(ctx, []byte{}, []byte{}, coll) + // ...but this must fail, not getting stuck. + _, err := coll.Finish(ctx) + require.Error(t, err) + }) +} + +func oneStoreFailure() func(uint64) error { + victim := uint64(0) + mu := new(sync.Mutex) + return func(u uint64) error { + mu.Lock() + defer mu.Unlock() + if victim == 0 { + victim = u + } + if victim == u { + return status.Error(codes.NotFound, + "The place once lit by the warm lamplight has been swallowed up by the debris now.") + } + return nil + } +} + +func TestOneStoreFailure(t *testing.T) { + log.SetLevel(zapcore.DebugLevel) + c := createFakeCluster(t, 4, true) + ctx := context.Background() + splitKeys := make([]string, 0, 1000) + for i := 0; i < 1000; i++ { + splitKeys = append(splitKeys, fmt.Sprintf("%04d", i)) + } + c.splitAndScatter(splitKeys...) + c.flushAll() + + env := &testEnv{fakeCluster: c, testCtx: t} + adv := streamhelper.NewCheckpointAdvancer(env) + adv.StartTaskListener(ctx) + require.NoError(t, adv.OnTick(ctx)) + c.onGetClient = oneStoreFailure() + + for i := 0; i < 100; i++ { + c.advanceCheckpoints() + c.flushAll() + require.ErrorContains(t, adv.OnTick(ctx), "the warm lamplight") + } + + c.onGetClient = nil + cp := c.advanceCheckpoints() + c.flushAll() + require.NoError(t, adv.OnTick(ctx)) + require.Equal(t, cp, env.checkpoint) +} diff --git a/br/pkg/streamhelper/basic_lib_for_test.go b/br/pkg/streamhelper/basic_lib_for_test.go new file mode 100644 index 0000000000000..14d777f1d24e7 --- /dev/null +++ b/br/pkg/streamhelper/basic_lib_for_test.go @@ -0,0 +1,432 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper_test + +import ( + "bytes" + "context" + "encoding/hex" + "fmt" + "math" + "math/rand" + "sort" + "strings" + "sync" + "testing" + + backup "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/errorpb" + logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/kv" + "google.golang.org/grpc" +) + +type flushSimulator struct { + flushedEpoch uint64 + enabled bool +} + +func (c flushSimulator) makeError(requestedEpoch uint64) *errorpb.Error { + if !c.enabled { + return nil + } + if c.flushedEpoch == 0 { + e := errorpb.Error{ + Message: "not flushed", + } + return &e + } + if c.flushedEpoch != requestedEpoch { + e := errorpb.Error{ + Message: "flushed epoch not match", + } + return &e + } + return nil +} + +func (c flushSimulator) fork() flushSimulator { + return flushSimulator{ + enabled: c.enabled, + } +} + +type region struct { + rng kv.KeyRange + leader uint64 + epoch uint64 + id uint64 + checkpoint uint64 + + fsim flushSimulator +} + +type fakeStore struct { + id uint64 + regions map[uint64]*region +} + +type fakeCluster struct { + mu sync.Mutex + idAlloced uint64 + stores map[uint64]*fakeStore + regions []*region + testCtx *testing.T + + onGetClient func(uint64) error +} + +func overlaps(a, b kv.KeyRange) bool { + if len(b.EndKey) == 0 { + return len(a.EndKey) == 0 || bytes.Compare(a.EndKey, b.StartKey) > 0 + } + if len(a.EndKey) == 0 { + return len(b.EndKey) == 0 || bytes.Compare(b.EndKey, a.StartKey) > 0 + } + return bytes.Compare(a.StartKey, b.EndKey) < 0 && bytes.Compare(b.StartKey, a.EndKey) < 0 +} + +func (f *region) splitAt(newID uint64, k string) *region { + newRegion := ®ion{ + rng: kv.KeyRange{StartKey: []byte(k), EndKey: f.rng.EndKey}, + leader: f.leader, + epoch: f.epoch + 1, + id: newID, + checkpoint: f.checkpoint, + fsim: f.fsim.fork(), + } + f.rng.EndKey = []byte(k) + f.epoch += 1 + f.fsim = f.fsim.fork() + return newRegion +} + +func (f *region) flush() { + f.fsim.flushedEpoch = f.epoch +} + +func (f *fakeStore) GetLastFlushTSOfRegion(ctx context.Context, in *logbackup.GetLastFlushTSOfRegionRequest, opts ...grpc.CallOption) (*logbackup.GetLastFlushTSOfRegionResponse, error) { + resp := &logbackup.GetLastFlushTSOfRegionResponse{ + Checkpoints: []*logbackup.RegionCheckpoint{}, + } + for _, r := range in.Regions { + region, ok := f.regions[r.Id] + if !ok || region.leader != f.id { + resp.Checkpoints = append(resp.Checkpoints, &logbackup.RegionCheckpoint{ + Err: &errorpb.Error{ + Message: "not found", + }, + Region: &logbackup.RegionIdentity{ + Id: region.id, + EpochVersion: region.epoch, + }, + }) + continue + } + if err := region.fsim.makeError(r.EpochVersion); err != nil { + resp.Checkpoints = append(resp.Checkpoints, &logbackup.RegionCheckpoint{ + Err: err, + Region: &logbackup.RegionIdentity{ + Id: region.id, + EpochVersion: region.epoch, + }, + }) + continue + } + if region.epoch != r.EpochVersion { + resp.Checkpoints = append(resp.Checkpoints, &logbackup.RegionCheckpoint{ + Err: &errorpb.Error{ + Message: "epoch not match", + }, + Region: &logbackup.RegionIdentity{ + Id: region.id, + EpochVersion: region.epoch, + }, + }) + continue + } + resp.Checkpoints = append(resp.Checkpoints, &logbackup.RegionCheckpoint{ + Checkpoint: region.checkpoint, + Region: &logbackup.RegionIdentity{ + Id: region.id, + EpochVersion: region.epoch, + }, + }) + } + return resp, nil +} + +// RegionScan gets a list of regions, starts from the region that contains key. +// Limit limits the maximum number of regions returned. +func (f *fakeCluster) RegionScan(ctx context.Context, key []byte, endKey []byte, limit int) ([]streamhelper.RegionWithLeader, error) { + f.mu.Lock() + defer f.mu.Unlock() + sort.Slice(f.regions, func(i, j int) bool { + return bytes.Compare(f.regions[i].rng.StartKey, f.regions[j].rng.StartKey) < 0 + }) + + result := make([]streamhelper.RegionWithLeader, 0, limit) + for _, region := range f.regions { + if overlaps(kv.KeyRange{StartKey: key, EndKey: endKey}, region.rng) && len(result) < limit { + regionInfo := streamhelper.RegionWithLeader{ + Region: &metapb.Region{ + Id: region.id, + StartKey: region.rng.StartKey, + EndKey: region.rng.EndKey, + RegionEpoch: &metapb.RegionEpoch{ + Version: region.epoch, + }, + }, + Leader: &metapb.Peer{ + StoreId: region.leader, + }, + } + result = append(result, regionInfo) + } else if bytes.Compare(region.rng.StartKey, key) > 0 { + break + } + } + return result, nil +} + +func (f *fakeCluster) GetLogBackupClient(ctx context.Context, storeID uint64) (logbackup.LogBackupClient, error) { + if f.onGetClient != nil { + err := f.onGetClient(storeID) + if err != nil { + return nil, err + } + } + cli, ok := f.stores[storeID] + if !ok { + f.testCtx.Fatalf("the store %d doesn't exist", storeID) + } + return cli, nil +} + +func (f *fakeCluster) findRegionById(rid uint64) *region { + for _, r := range f.regions { + if r.id == rid { + return r + } + } + return nil +} + +func (f *fakeCluster) findRegionByKey(key []byte) *region { + for _, r := range f.regions { + if bytes.Compare(key, r.rng.StartKey) >= 0 && (len(r.rng.EndKey) == 0 || bytes.Compare(key, r.rng.EndKey) < 0) { + return r + } + } + panic(fmt.Sprintf("inconsistent key space; key = %X", key)) +} + +func (f *fakeCluster) transferRegionTo(rid uint64, newPeers []uint64) { + r := f.findRegionById(rid) +storeLoop: + for _, store := range f.stores { + for _, pid := range newPeers { + if pid == store.id { + store.regions[rid] = r + continue storeLoop + } + } + delete(store.regions, rid) + } +} + +func (f *fakeCluster) splitAt(key string) { + k := []byte(key) + r := f.findRegionByKey(k) + newRegion := r.splitAt(f.idAlloc(), key) + for _, store := range f.stores { + _, ok := store.regions[r.id] + if ok { + store.regions[newRegion.id] = newRegion + } + } + f.regions = append(f.regions, newRegion) +} + +func (f *fakeCluster) idAlloc() uint64 { + f.idAlloced++ + return f.idAlloced +} + +func (f *fakeCluster) chooseStores(n int) []uint64 { + s := make([]uint64, 0, len(f.stores)) + for id := range f.stores { + s = append(s, id) + } + rand.Shuffle(len(s), func(i, j int) { + s[i], s[j] = s[j], s[i] + }) + return s[:n] +} + +func (f *fakeCluster) findPeers(rid uint64) (result []uint64) { + for _, store := range f.stores { + if _, ok := store.regions[rid]; ok { + result = append(result, store.id) + } + } + return +} + +func (f *fakeCluster) shuffleLeader(rid uint64) { + r := f.findRegionById(rid) + peers := f.findPeers(rid) + rand.Shuffle(len(peers), func(i, j int) { + peers[i], peers[j] = peers[j], peers[i] + }) + + newLeader := peers[0] + r.leader = newLeader +} + +func (f *fakeCluster) splitAndScatter(keys ...string) { + f.mu.Lock() + defer f.mu.Unlock() + for _, key := range keys { + f.splitAt(key) + } + for _, r := range f.regions { + f.transferRegionTo(r.id, f.chooseStores(3)) + f.shuffleLeader(r.id) + } +} + +// a stub once in the future we want to make different stores hold different region instances. +func (f *fakeCluster) updateRegion(rid uint64, mut func(*region)) { + r := f.findRegionById(rid) + mut(r) +} + +func (f *fakeCluster) advanceCheckpoints() uint64 { + minCheckpoint := uint64(math.MaxUint64) + for _, r := range f.regions { + f.updateRegion(r.id, func(r *region) { + r.checkpoint += rand.Uint64() % 256 + if r.checkpoint < minCheckpoint { + minCheckpoint = r.checkpoint + } + r.fsim.flushedEpoch = 0 + }) + } + return minCheckpoint +} + +func createFakeCluster(t *testing.T, n int, simEnabled bool) *fakeCluster { + c := &fakeCluster{ + stores: map[uint64]*fakeStore{}, + regions: []*region{}, + testCtx: t, + } + stores := make([]*fakeStore, 0, n) + for i := 0; i < n; i++ { + s := new(fakeStore) + s.id = c.idAlloc() + s.regions = map[uint64]*region{} + stores = append(stores, s) + } + initialRegion := ®ion{ + rng: kv.KeyRange{}, + leader: stores[0].id, + epoch: 0, + id: c.idAlloc(), + checkpoint: 0, + fsim: flushSimulator{ + enabled: simEnabled, + }, + } + for i := 0; i < 3; i++ { + if i < len(stores) { + stores[i].regions[initialRegion.id] = initialRegion + } + } + for _, s := range stores { + c.stores[s.id] = s + } + c.regions = append(c.regions, initialRegion) + return c +} + +func (r *region) String() string { + return fmt.Sprintf("%d(%d):[%s,%s);%dL%d", r.id, r.epoch, hex.EncodeToString(r.rng.StartKey), hex.EncodeToString(r.rng.EndKey), r.checkpoint, r.leader) +} + +func (s *fakeStore) String() string { + buf := new(strings.Builder) + fmt.Fprintf(buf, "%d: ", s.id) + for _, r := range s.regions { + fmt.Fprintf(buf, "%s ", r) + } + return buf.String() +} + +func (f *fakeCluster) flushAll() { + for _, r := range f.regions { + r.flush() + } +} + +func (s *fakeStore) flush() { + for _, r := range s.regions { + if r.leader == s.id { + r.flush() + } + } +} + +func (f *fakeCluster) String() string { + buf := new(strings.Builder) + fmt.Fprint(buf, ">>> fake cluster <<<\nregions: ") + for _, region := range f.regions { + fmt.Fprint(buf, region, " ") + } + fmt.Fprintln(buf) + for _, store := range f.stores { + fmt.Fprintln(buf, store) + } + return buf.String() +} + +type testEnv struct { + *fakeCluster + checkpoint uint64 + testCtx *testing.T + + mu sync.Mutex +} + +func (t *testEnv) Begin(ctx context.Context, ch chan<- streamhelper.TaskEvent) error { + tsk := streamhelper.TaskEvent{ + Type: streamhelper.EventAdd, + Name: "whole", + Info: &backup.StreamBackupTaskInfo{ + Name: "whole", + }, + } + ch <- tsk + return nil +} + +func (t *testEnv) UploadV3GlobalCheckpointForTask(ctx context.Context, _ string, checkpoint uint64) error { + t.mu.Lock() + defer t.mu.Unlock() + + if checkpoint < t.checkpoint { + t.testCtx.Fatalf("checkpoint rolling back (from %d to %d)", t.checkpoint, checkpoint) + } + t.checkpoint = checkpoint + return nil +} + +func (t *testEnv) getCheckpoint() uint64 { + t.mu.Lock() + defer t.mu.Unlock() + + return t.checkpoint +} diff --git a/br/pkg/stream/client.go b/br/pkg/streamhelper/client.go similarity index 65% rename from br/pkg/stream/client.go rename to br/pkg/streamhelper/client.go index 3ae88605ca7f1..56a87c20d4fd8 100644 --- a/br/pkg/stream/client.go +++ b/br/pkg/streamhelper/client.go @@ -1,5 +1,5 @@ // Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. -package stream +package streamhelper import ( "bytes" @@ -15,10 +15,50 @@ import ( berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/redact" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/mathutil" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" ) +// Checkpoint is the polymorphic checkpoint type. +// The `ID` and `Version` implies the type of this checkpoint: +// When ID == 0 and Version == 0, it is the task start ts. +// When ID != 0 and Version == 0, it is the store level checkpoint. +// When ID != 0 and Version != 0, it is the region level checkpoint. +type Checkpoint struct { + ID uint64 `json:"id,omitempty"` + Version uint64 `json:"epoch_version,omitempty"` + TS uint64 `json:"ts"` + + IsGlobal bool `json:"-"` +} + +type CheckpointType int + +const ( + CheckpointTypeStore CheckpointType = iota + CheckpointTypeRegion + CheckpointTypeTask + CheckpointTypeGlobal + CheckpointTypeInvalid +) + +// Type returns the type(provider) of the checkpoint. +func (cp Checkpoint) Type() CheckpointType { + switch { + case cp.IsGlobal: + return CheckpointTypeGlobal + case cp.ID == 0 && cp.Version == 0: + return CheckpointTypeTask + case cp.ID != 0 && cp.Version == 0: + return CheckpointTypeStore + case cp.ID != 0 && cp.Version != 0: + return CheckpointTypeRegion + default: + return CheckpointTypeInvalid + } +} + // MetaDataClient is the client for operations over metadata. type MetaDataClient struct { *clientv3.Client @@ -28,6 +68,63 @@ func NewMetaDataClient(c *clientv3.Client) *MetaDataClient { return &MetaDataClient{c} } +// ParseCheckpoint parses the checkpoint from a key & value pair. +func ParseCheckpoint(task string, key, value []byte) (Checkpoint, error) { + pfx := []byte(CheckPointsOf(task)) + if !bytes.HasPrefix(key, pfx) { + return Checkpoint{}, errors.Annotatef(berrors.ErrInvalidArgument, "the prefix is wrong for key: %s", key) + } + key = bytes.TrimPrefix(key, pfx) + segs := bytes.Split(key, []byte("/")) + var checkpoint Checkpoint + switch string(segs[0]) { + case checkpointTypeStore: + if len(segs) != 2 { + return checkpoint, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the store checkpoint seg mismatch; segs = %v", segs) + } + id, err := strconv.ParseUint(string(segs[1]), 10, 64) + if err != nil { + return checkpoint, err + } + checkpoint.ID = id + case checkpointTypeGlobal: + checkpoint.IsGlobal = true + case checkpointTypeRegion: + if len(segs) != 3 { + return checkpoint, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the region checkpoint seg mismatch; segs = %v", segs) + } + id, err := strconv.ParseUint(string(segs[1]), 10, 64) + if err != nil { + return checkpoint, err + } + version, err := strconv.ParseUint(string(segs[2]), 10, 64) + if err != nil { + return checkpoint, err + } + checkpoint.ID = id + checkpoint.Version = version + default: + if len(key) != 8 { + return checkpoint, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the store id isn't 64bits (it is %d bytes, value = %s)", + len(key), + redact.Key(key)) + } + id := binary.BigEndian.Uint64(key) + checkpoint.ID = id + } + if len(value) != 8 { + return checkpoint, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the checkpoint value isn't 64bits (it is %d bytes, value = %s)", + len(segs[0]), + redact.Key(segs[0])) + } + checkpoint.TS = binary.BigEndian.Uint64(value) + return checkpoint, nil +} + // PutTask put a task to the metadata storage. func (c *MetaDataClient) PutTask(ctx context.Context, task TaskInfo) error { data, err := task.PBInfo.Marshal() @@ -98,6 +195,17 @@ func (c *MetaDataClient) CleanLastErrorOfTask(ctx context.Context, taskName stri return nil } +func (c *MetaDataClient) UploadV3GlobalCheckpointForTask(ctx context.Context, taskName string, checkpoint uint64) error { + key := GlobalCheckpointOf(taskName) + value := string(encodeUint64(checkpoint)) + _, err := c.KV.Put(ctx, key, value) + + if err != nil { + return err + } + return nil +} + // GetTask get the basic task handle from the metadata storage. func (c *MetaDataClient) GetTask(ctx context.Context, taskName string) (*Task, error) { resp, err := c.Get(ctx, TaskOf(taskName)) @@ -146,25 +254,35 @@ func (c *MetaDataClient) GetTaskWithPauseStatus(ctx context.Context, taskName st return &Task{cli: c, Info: taskInfo}, paused, nil } -// GetAllTasks get all of tasks from metadata storage. -func (c *MetaDataClient) GetAllTasks(ctx context.Context) ([]Task, error) { - scanner := scanEtcdPrefix(c.Client, PrefixOfTask()) - kvs, err := scanner.AllPages(ctx, 1) +func (c *MetaDataClient) TaskByInfo(t backuppb.StreamBackupTaskInfo) *Task { + return &Task{cli: c, Info: t} +} + +func (c *MetaDataClient) GetAllTasksWithRevision(ctx context.Context) ([]Task, int64, error) { + resp, err := c.KV.Get(ctx, PrefixOfTask(), clientv3.WithPrefix()) if err != nil { - return nil, errors.Trace(err) - } else if len(kvs) == 0 { - return nil, nil + return nil, 0, errors.Trace(err) + } + kvs := resp.Kvs + if len(kvs) == 0 { + return nil, resp.Header.GetRevision(), nil } tasks := make([]Task, len(kvs)) for idx, kv := range kvs { err = proto.Unmarshal(kv.Value, &tasks[idx].Info) if err != nil { - return nil, errors.Trace(err) + return nil, 0, errors.Trace(err) } tasks[idx].cli = c } - return tasks, nil + return tasks, resp.Header.GetRevision(), nil +} + +// GetAllTasks get all of tasks from metadata storage. +func (c *MetaDataClient) GetAllTasks(ctx context.Context) ([]Task, error) { + tasks, _, err := c.GetAllTasksWithRevision(ctx) + return tasks, err } // GetTaskCount get the count of tasks from metadata storage. @@ -182,6 +300,13 @@ type Task struct { Info backuppb.StreamBackupTaskInfo } +func NewTask(client *MetaDataClient, info backuppb.StreamBackupTaskInfo) *Task { + return &Task{ + cli: client, + Info: info, + } +} + // Pause is a shorthand for `metaCli.PauseTask`. func (t *Task) Pause(ctx context.Context) error { return t.cli.PauseTask(ctx, t.Info.Name) @@ -217,34 +342,45 @@ func (t *Task) Ranges(ctx context.Context) (Ranges, error) { } // NextBackupTSList lists the backup ts of each store. -func (t *Task) NextBackupTSList(ctx context.Context) (map[uint64]uint64, error) { - result := map[uint64]uint64{} +func (t *Task) NextBackupTSList(ctx context.Context) ([]Checkpoint, error) { + cps := make([]Checkpoint, 0) prefix := CheckPointsOf(t.Info.Name) scanner := scanEtcdPrefix(t.cli.Client, prefix) kvs, err := scanner.AllPages(ctx, 1024) if err != nil { return nil, errors.Annotatef(err, "failed to get checkpoints of %s", t.Info.Name) } + for _, kv := range kvs { + cp, err := ParseCheckpoint(t.Info.Name, kv.Key, kv.Value) + if err != nil { + return cps, err + } + cps = append(cps, cp) + } + return cps, nil +} + +func (t *Task) GetStorageCheckpoint(ctx context.Context) (uint64, error) { + prefix := StorageCheckpointOf(t.Info.Name) + scanner := scanEtcdPrefix(t.cli.Client, prefix) + kvs, err := scanner.AllPages(ctx, 1024) + if err != nil { + return 0, errors.Annotatef(err, "failed to get checkpoints of %s", t.Info.Name) + } + + var storageCheckpoint = t.Info.StartTs for _, kv := range kvs { if len(kv.Value) != 8 { - return nil, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, - "the next backup ts isn't 64bits (it is %d bytes, value = %s)", + return 0, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the value isn't 64bits (it is %d bytes, value = %s)", len(kv.Value), redact.Key(kv.Value)) } - nextBackupTS := binary.BigEndian.Uint64(kv.Value) - - storeIDBinary := bytes.TrimPrefix(kv.Key, []byte(prefix)) - if len(storeIDBinary) != 8 { - return nil, errors.Annotatef(berrors.ErrPiTRMalformedMetadata, - "the store id isn't 64bits (it is %d bytes, value = %s)", - len(storeIDBinary), - redact.Key(storeIDBinary)) - } - storeID := binary.BigEndian.Uint64(storeIDBinary) - result[storeID] = nextBackupTS + ts := binary.BigEndian.Uint64(kv.Value) + storageCheckpoint = mathutil.Max(storageCheckpoint, ts) } - return result, nil + + return storageCheckpoint, nil } // MinNextBackupTS query the all next backup ts of a store, returning the minimal next backup ts of the store. @@ -278,10 +414,10 @@ func (t *Task) GetGlobalCheckPointTS(ctx context.Context) (uint64, error) { initialized := false checkpoint := t.Info.StartTs - for _, ts := range checkPointMap { - if !initialized || ts < checkpoint { + for _, cp := range checkPointMap { + if !initialized || cp.TS < checkpoint { initialized = true - checkpoint = ts + checkpoint = cp.TS } } @@ -298,6 +434,14 @@ func (t *Task) Step(ctx context.Context, store uint64, ts uint64) error { return nil } +func (t *Task) UploadGlobalCheckpoint(ctx context.Context, ts uint64) error { + _, err := t.cli.KV.Put(ctx, GlobalCheckpointOf(t.Info.Name), string(encodeUint64(ts))) + if err != nil { + return err + } + return nil +} + func (t *Task) LastError(ctx context.Context) (map[uint64]backuppb.StreamBackupError, error) { storeToError := map[uint64]backuppb.StreamBackupError{} prefix := LastErrorPrefixOf(t.Info.Name) diff --git a/br/pkg/streamhelper/collector.go b/br/pkg/streamhelper/collector.go new file mode 100644 index 0000000000000..d7c42adbfdda0 --- /dev/null +++ b/br/pkg/streamhelper/collector.go @@ -0,0 +1,323 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "context" + "fmt" + "strconv" + "strings" + "sync" + "sync/atomic" + + "github.com/pingcap/errors" + logbackup "github.com/pingcap/kvproto/pkg/logbackuppb" + "github.com/pingcap/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" + "go.uber.org/zap" +) + +const ( + defaultBatchSize = 1024 +) + +type onSuccessHook = func(uint64, kv.KeyRange) + +// storeCollector collects the region checkpoints from some store. +// it receives requests from the input channel, batching the requests, and send them to the store. +// because the server supports batching, the range of request regions can be discrete. +// note this is a temporary struct, its lifetime is shorter that the tick of advancer. +type storeCollector struct { + storeID uint64 + batchSize int + + service LogBackupService + + input chan RegionWithLeader + // the oneshot error reporter. + err *atomic.Value + // whether the recv and send loop has exited. + doneMessenger chan struct{} + onSuccess onSuccessHook + + // concurrency safety: + // those fields should only be write on the goroutine running `recvLoop`. + // Once it exits, we can read those fields. + currentRequest logbackup.GetLastFlushTSOfRegionRequest + checkpoint uint64 + inconsistent []kv.KeyRange + regionMap map[uint64]kv.KeyRange +} + +func newStoreCollector(storeID uint64, srv LogBackupService) *storeCollector { + return &storeCollector{ + storeID: storeID, + batchSize: defaultBatchSize, + service: srv, + input: make(chan RegionWithLeader, defaultBatchSize), + err: new(atomic.Value), + doneMessenger: make(chan struct{}), + regionMap: make(map[uint64]kv.KeyRange), + } +} + +func (c *storeCollector) reportErr(err error) { + if oldErr := c.Err(); 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 +} + +func (c *storeCollector) begin(ctx context.Context) { + err := c.recvLoop(ctx) + if err != nil { + log.Warn("collector loop meet error", logutil.ShortError(err)) + c.reportErr(err) + } + close(c.doneMessenger) +} + +func (c *storeCollector) recvLoop(ctx context.Context) (err error) { + defer utils.PanicToErr(&err) + for { + select { + case <-ctx.Done(): + return ctx.Err() + case r, ok := <-c.input: + if !ok { + return c.sendPendingRequests(ctx) + } + + if r.Leader.StoreId != c.storeID { + log.Warn("trying to request to store which isn't the leader of region.", + zap.Uint64("region", r.Region.Id), + zap.Uint64("target-store", c.storeID), + zap.Uint64("leader", r.Leader.StoreId), + ) + } + c.appendRegionMap(r) + c.currentRequest.Regions = append(c.currentRequest.Regions, &logbackup.RegionIdentity{ + Id: r.Region.GetId(), + EpochVersion: r.Region.GetRegionEpoch().GetVersion(), + }) + if len(c.currentRequest.Regions) >= c.batchSize { + err := c.sendPendingRequests(ctx) + if err != nil { + return err + } + } + } + } +} + +func (c *storeCollector) appendRegionMap(r RegionWithLeader) { + c.regionMap[r.Region.GetId()] = kv.KeyRange{StartKey: r.Region.StartKey, EndKey: r.Region.EndKey} +} + +type StoreCheckpoints struct { + HasCheckpoint bool + Checkpoint uint64 + FailureSubRanges []kv.KeyRange +} + +func (s *StoreCheckpoints) merge(other StoreCheckpoints) { + if other.HasCheckpoint && (other.Checkpoint < s.Checkpoint || !s.HasCheckpoint) { + s.Checkpoint = other.Checkpoint + s.HasCheckpoint = true + } + s.FailureSubRanges = append(s.FailureSubRanges, other.FailureSubRanges...) +} + +func (s *StoreCheckpoints) String() string { + sb := new(strings.Builder) + sb.WriteString("StoreCheckpoints:") + if s.HasCheckpoint { + sb.WriteString(strconv.Itoa(int(s.Checkpoint))) + } else { + sb.WriteString("none") + } + fmt.Fprintf(sb, ":(remaining %d ranges)", len(s.FailureSubRanges)) + return sb.String() +} + +func (c *storeCollector) spawn(ctx context.Context) func(context.Context) (StoreCheckpoints, error) { + go c.begin(ctx) + return func(cx context.Context) (StoreCheckpoints, error) { + close(c.input) + select { + case <-cx.Done(): + return StoreCheckpoints{}, cx.Err() + case <-c.doneMessenger: + } + if err := c.Err(); err != nil { + return StoreCheckpoints{}, err + } + sc := StoreCheckpoints{ + HasCheckpoint: c.checkpoint != 0, + Checkpoint: c.checkpoint, + FailureSubRanges: c.inconsistent, + } + return sc, nil + } +} + +func (c *storeCollector) sendPendingRequests(ctx context.Context) error { + log.Debug("sending batch", zap.Int("size", len(c.currentRequest.Regions)), zap.Uint64("store", c.storeID)) + cli, err := c.service.GetLogBackupClient(ctx, c.storeID) + if err != nil { + return err + } + cps, err := cli.GetLastFlushTSOfRegion(ctx, &c.currentRequest) + if err != nil { + return err + } + metrics.GetCheckpointBatchSize.WithLabelValues("checkpoint").Observe(float64(len(c.currentRequest.GetRegions()))) + c.currentRequest = logbackup.GetLastFlushTSOfRegionRequest{} + for _, checkpoint := range cps.Checkpoints { + if checkpoint.Err != nil { + log.Debug("failed to get region checkpoint", zap.Stringer("err", checkpoint.Err)) + if checkpoint.Err.EpochNotMatch != nil { + metrics.RegionCheckpointFailure.WithLabelValues("epoch-not-match").Inc() + } + if checkpoint.Err.NotLeader != nil { + metrics.RegionCheckpointFailure.WithLabelValues("not-leader").Inc() + } + metrics.RegionCheckpointRequest.WithLabelValues("fail").Inc() + c.inconsistent = append(c.inconsistent, c.regionMap[checkpoint.Region.Id]) + } else { + metrics.RegionCheckpointRequest.WithLabelValues("success").Inc() + if c.onSuccess != nil { + c.onSuccess(checkpoint.Checkpoint, c.regionMap[checkpoint.Region.Id]) + } + // assuming the checkpoint would never be zero, use it as the placeholder. (1970 is so far away...) + if checkpoint.Checkpoint < c.checkpoint || c.checkpoint == 0 { + c.checkpoint = checkpoint.Checkpoint + } + } + } + return nil +} + +type runningStoreCollector struct { + collector *storeCollector + wait func(context.Context) (StoreCheckpoints, error) +} + +// clusterCollector is the controller for collecting region checkpoints for the cluster. +// It creates multi store collectors. +// ┌──────────────────────┐ Requesting ┌────────────┐ +// ┌─►│ StoreCollector[id=1] ├─────────────►│ TiKV[id=1] │ +// │ └──────────────────────┘ └────────────┘ +// │ +// │Owns +// ┌──────────────────┐ │ ┌──────────────────────┐ Requesting ┌────────────┐ +// │ ClusterCollector ├─────┼─►│ StoreCollector[id=4] ├─────────────►│ TiKV[id=4] │ +// └──────────────────┘ │ └──────────────────────┘ └────────────┘ +// │ +// │ +// │ ┌──────────────────────┐ Requesting ┌────────────┐ +// └─►│ StoreCollector[id=5] ├─────────────►│ TiKV[id=5] │ +// └──────────────────────┘ └────────────┘ +type clusterCollector struct { + mu sync.Mutex + collectors map[uint64]runningStoreCollector + noLeaders []kv.KeyRange + onSuccess onSuccessHook + + // The context for spawning sub collectors. + // Because the collectors are running lazily, + // keep the initial context for all subsequent goroutines, + // so we can make sure we can cancel all subtasks. + masterCtx context.Context + cancel context.CancelFunc + srv LogBackupService +} + +// NewClusterCollector creates a new cluster collector. +// collectors are the structure transform region information to checkpoint information, +// by requesting the checkpoint of regions in the store. +func NewClusterCollector(ctx context.Context, srv LogBackupService) *clusterCollector { + cx, cancel := context.WithCancel(ctx) + return &clusterCollector{ + collectors: map[uint64]runningStoreCollector{}, + masterCtx: cx, + cancel: cancel, + srv: srv, + } +} + +// setOnSuccessHook sets the hook when getting checkpoint of some region. +func (c *clusterCollector) setOnSuccessHook(hook onSuccessHook) { + c.onSuccess = hook +} + +// collectRegion adds a region to the collector. +func (c *clusterCollector) collectRegion(r RegionWithLeader) error { + c.mu.Lock() + defer c.mu.Unlock() + if c.masterCtx.Err() != nil { + return nil + } + + if r.Leader.GetStoreId() == 0 { + log.Warn("there are regions without leader", zap.Uint64("region", r.Region.GetId())) + c.noLeaders = append(c.noLeaders, kv.KeyRange{StartKey: r.Region.StartKey, EndKey: r.Region.EndKey}) + return nil + } + leader := r.Leader.StoreId + _, ok := c.collectors[leader] + if !ok { + coll := newStoreCollector(leader, c.srv) + if c.onSuccess != nil { + coll.setOnSuccessHook(c.onSuccess) + } + c.collectors[leader] = runningStoreCollector{ + collector: coll, + wait: coll.spawn(c.masterCtx), + } + } + + sc := c.collectors[leader].collector + select { + case sc.input <- r: + return nil + case <-sc.doneMessenger: + err := sc.Err() + if err != nil { + c.cancel() + } + return err + } +} + +// Finish finishes collecting the region checkpoints, wait and returning the final result. +// Note this takes the ownership of this collector, you may create a new collector for next use. +func (c *clusterCollector) Finish(ctx context.Context) (StoreCheckpoints, error) { + defer c.cancel() + result := StoreCheckpoints{FailureSubRanges: c.noLeaders} + for id, coll := range c.collectors { + r, err := coll.wait(ctx) + if err != nil { + return StoreCheckpoints{}, errors.Annotatef(err, "store %d", id) + } + result.merge(r) + log.Debug("get checkpoint", zap.Stringer("checkpoint", &r), zap.Stringer("merged", &result)) + } + return result, nil +} diff --git a/br/pkg/streamhelper/config/BUILD.bazel b/br/pkg/streamhelper/config/BUILD.bazel new file mode 100644 index 0000000000000..1911b1ac82605 --- /dev/null +++ b/br/pkg/streamhelper/config/BUILD.bazel @@ -0,0 +1,9 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "config", + srcs = ["advancer_conf.go"], + importpath = "github.com/pingcap/tidb/br/pkg/streamhelper/config", + visibility = ["//visibility:public"], + deps = ["@com_github_spf13_pflag//:pflag"], +) diff --git a/br/pkg/streamhelper/config/advancer_conf.go b/br/pkg/streamhelper/config/advancer_conf.go new file mode 100644 index 0000000000000..9539753c683b8 --- /dev/null +++ b/br/pkg/streamhelper/config/advancer_conf.go @@ -0,0 +1,77 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package config + +import ( + "time" + + "github.com/spf13/pflag" +) + +const ( + flagBackoffTime = "backoff-time" + flagTickInterval = "tick-interval" + flagFullScanDiffTick = "full-scan-tick" + flagAdvancingByCache = "advancing-by-cache" + + DefaultConsistencyCheckTick = 5 + DefaultTryAdvanceThreshold = 3 * time.Minute + DefaultBackOffTime = 5 * time.Second + DefaultTickInterval = 12 * time.Second + DefaultFullScanTick = 4 + DefaultAdvanceByCache = true +) + +var ( + DefaultMaxConcurrencyAdvance = 8 +) + +type Config struct { + // The gap between two retries. + BackoffTime time.Duration `toml:"backoff-time" json:"backoff-time"` + // The gap between calculating checkpoints. + TickDuration time.Duration `toml:"tick-interval" json:"tick-interval"` + // The backoff time of full scan. + FullScanTick int `toml:"full-scan-tick" json:"full-scan-tick"` + + // Whether enable the optimization -- use a cached heap to advancing the global checkpoint. + // This may reduce the gap of checkpoint but may cost more CPU. + AdvancingByCache bool `toml:"advancing-by-cache" json:"advancing-by-cache"` +} + +func DefineFlagsForCheckpointAdvancerConfig(f *pflag.FlagSet) { + f.Duration(flagBackoffTime, DefaultBackOffTime, "The gap between two retries.") + f.Duration(flagTickInterval, DefaultTickInterval, "From how long we trigger the tick (advancing the checkpoint).") + f.Bool(flagAdvancingByCache, DefaultAdvanceByCache, "Whether enable the optimization -- use a cached heap to advancing the global checkpoint.") + f.Int(flagFullScanDiffTick, DefaultFullScanTick, "The backoff of full scan.") +} + +func Default() Config { + return Config{ + BackoffTime: DefaultBackOffTime, + TickDuration: DefaultTickInterval, + FullScanTick: DefaultFullScanTick, + AdvancingByCache: DefaultAdvanceByCache, + } +} + +func (conf *Config) GetFromFlags(f *pflag.FlagSet) error { + var err error + conf.BackoffTime, err = f.GetDuration(flagBackoffTime) + if err != nil { + return err + } + conf.TickDuration, err = f.GetDuration(flagTickInterval) + if err != nil { + return err + } + conf.FullScanTick, err = f.GetInt(flagFullScanDiffTick) + if err != nil { + return err + } + conf.AdvancingByCache, err = f.GetBool(flagAdvancingByCache) + if err != nil { + return err + } + return nil +} diff --git a/br/pkg/stream/integration_test.go b/br/pkg/streamhelper/integration_test.go similarity index 62% rename from br/pkg/stream/integration_test.go rename to br/pkg/streamhelper/integration_test.go index 92a465172afec..b8817061de79d 100644 --- a/br/pkg/stream/integration_test.go +++ b/br/pkg/streamhelper/integration_test.go @@ -1,13 +1,15 @@ // Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. // This package tests the login in MetaClient with a embed etcd. -package stream_test +package streamhelper_test import ( "context" + "encoding/binary" "fmt" "net" "net/url" + "path" "testing" "github.com/pingcap/errors" @@ -15,7 +17,7 @@ import ( berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/br/pkg/stream" + "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/pingcap/tidb/tablecodec" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/kv" @@ -63,11 +65,11 @@ func runEtcd(t *testing.T) (*embed.Etcd, *clientv3.Client) { return etcd, cli } -func simpleRanges(tableCount int) stream.Ranges { - ranges := stream.Ranges{} +func simpleRanges(tableCount int) streamhelper.Ranges { + ranges := streamhelper.Ranges{} for i := 0; i < tableCount; i++ { base := int64(i*2 + 1) - ranges = append(ranges, stream.Range{ + ranges = append(ranges, streamhelper.Range{ StartKey: tablecodec.EncodeTablePrefix(base), EndKey: tablecodec.EncodeTablePrefix(base + 1), }) @@ -75,9 +77,9 @@ func simpleRanges(tableCount int) stream.Ranges { return ranges } -func simpleTask(name string, tableCount int) stream.TaskInfo { +func simpleTask(name string, tableCount int) streamhelper.TaskInfo { backend, _ := storage.ParseBackend("noop://", nil) - task, err := stream.NewTask(name). + task, err := streamhelper.NewTaskInfo(name). FromTS(1). UntilTS(1000). WithRanges(simpleRanges(tableCount)...). @@ -110,7 +112,7 @@ func keyNotExists(t *testing.T, key []byte, etcd *embed.Etcd) { require.Len(t, r.KVs, 0) } -func rangeMatches(t *testing.T, ranges stream.Ranges, etcd *embed.Etcd) { +func rangeMatches(t *testing.T, ranges streamhelper.Ranges, etcd *embed.Etcd) { r, err := etcd.Server.KV().Range(context.TODO(), ranges[0].StartKey, ranges[len(ranges)-1].EndKey, mvcc.RangeOptions{}) require.NoError(t, err) if len(r.KVs) != len(ranges) { @@ -133,33 +135,35 @@ func rangeIsEmpty(t *testing.T, prefix []byte, etcd *embed.Etcd) { func TestIntegration(t *testing.T) { etcd, cli := runEtcd(t) defer etcd.Server.Stop() - metaCli := stream.MetaDataClient{Client: cli} + metaCli := streamhelper.MetaDataClient{Client: cli} t.Run("TestBasic", func(t *testing.T) { testBasic(t, metaCli, etcd) }) t.Run("TestForwardProgress", func(t *testing.T) { testForwardProgress(t, metaCli, etcd) }) + t.Run("testGetStorageCheckpoint", func(t *testing.T) { testGetStorageCheckpoint(t, metaCli, etcd) }) + t.Run("TestStreamListening", func(t *testing.T) { testStreamListening(t, streamhelper.TaskEventClient{MetaDataClient: metaCli}) }) } func TestChecking(t *testing.T) { noop, _ := storage.ParseBackend("noop://", nil) // The name must not contains slash. - _, err := stream.NewTask("/root"). + _, err := streamhelper.NewTaskInfo("/root"). WithRange([]byte("1"), []byte("2")). WithTableFilter("*.*"). ToStorage(noop). Check() require.ErrorIs(t, errors.Cause(err), berrors.ErrPiTRInvalidTaskInfo) // Must specify the external storage. - _, err = stream.NewTask("root"). + _, err = streamhelper.NewTaskInfo("root"). WithRange([]byte("1"), []byte("2")). WithTableFilter("*.*"). Check() require.ErrorIs(t, errors.Cause(err), berrors.ErrPiTRInvalidTaskInfo) // Must specift the table filter and range? - _, err = stream.NewTask("root"). + _, err = streamhelper.NewTaskInfo("root"). ToStorage(noop). Check() require.ErrorIs(t, errors.Cause(err), berrors.ErrPiTRInvalidTaskInfo) // Happy path. - _, err = stream.NewTask("root"). + _, err = streamhelper.NewTaskInfo("root"). WithRange([]byte("1"), []byte("2")). WithTableFilter("*.*"). ToStorage(noop). @@ -167,43 +171,43 @@ func TestChecking(t *testing.T) { require.NoError(t, err) } -func testBasic(t *testing.T, metaCli stream.MetaDataClient, etcd *embed.Etcd) { +func testBasic(t *testing.T, metaCli streamhelper.MetaDataClient, etcd *embed.Etcd) { ctx := context.Background() taskName := "two_tables" task := simpleTask(taskName, 2) taskData, err := task.PBInfo.Marshal() require.NoError(t, err) require.NoError(t, metaCli.PutTask(ctx, task)) - keyIs(t, []byte(stream.TaskOf(taskName)), taskData, etcd) - keyNotExists(t, []byte(stream.Pause(taskName)), etcd) - rangeMatches(t, []stream.Range{ - {StartKey: []byte(stream.RangeKeyOf(taskName, tablecodec.EncodeTablePrefix(1))), EndKey: tablecodec.EncodeTablePrefix(2)}, - {StartKey: []byte(stream.RangeKeyOf(taskName, tablecodec.EncodeTablePrefix(3))), EndKey: tablecodec.EncodeTablePrefix(4)}, + keyIs(t, []byte(streamhelper.TaskOf(taskName)), taskData, etcd) + keyNotExists(t, []byte(streamhelper.Pause(taskName)), etcd) + rangeMatches(t, []streamhelper.Range{ + {StartKey: []byte(streamhelper.RangeKeyOf(taskName, tablecodec.EncodeTablePrefix(1))), EndKey: tablecodec.EncodeTablePrefix(2)}, + {StartKey: []byte(streamhelper.RangeKeyOf(taskName, tablecodec.EncodeTablePrefix(3))), EndKey: tablecodec.EncodeTablePrefix(4)}, }, etcd) remoteTask, err := metaCli.GetTask(ctx, taskName) require.NoError(t, err) require.NoError(t, remoteTask.Pause(ctx)) - keyExists(t, []byte(stream.Pause(taskName)), etcd) + keyExists(t, []byte(streamhelper.Pause(taskName)), etcd) require.NoError(t, metaCli.PauseTask(ctx, taskName)) - keyExists(t, []byte(stream.Pause(taskName)), etcd) + keyExists(t, []byte(streamhelper.Pause(taskName)), etcd) paused, err := remoteTask.IsPaused(ctx) require.NoError(t, err) require.True(t, paused) require.NoError(t, metaCli.ResumeTask(ctx, taskName)) - keyNotExists(t, []byte(stream.Pause(taskName)), etcd) + keyNotExists(t, []byte(streamhelper.Pause(taskName)), etcd) require.NoError(t, metaCli.ResumeTask(ctx, taskName)) - keyNotExists(t, []byte(stream.Pause(taskName)), etcd) + keyNotExists(t, []byte(streamhelper.Pause(taskName)), etcd) paused, err = remoteTask.IsPaused(ctx) require.NoError(t, err) require.False(t, paused) require.NoError(t, metaCli.DeleteTask(ctx, taskName)) - keyNotExists(t, []byte(stream.TaskOf(taskName)), etcd) - rangeIsEmpty(t, []byte(stream.RangesOf(taskName)), etcd) + keyNotExists(t, []byte(streamhelper.TaskOf(taskName)), etcd) + rangeIsEmpty(t, []byte(streamhelper.RangesOf(taskName)), etcd) } -func testForwardProgress(t *testing.T, metaCli stream.MetaDataClient, etcd *embed.Etcd) { +func testForwardProgress(t *testing.T, metaCli streamhelper.MetaDataClient, etcd *embed.Etcd) { ctx := context.Background() taskName := "many_tables" taskInfo := simpleTask(taskName, 65) @@ -227,3 +231,67 @@ func testForwardProgress(t *testing.T, metaCli stream.MetaDataClient, etcd *embe require.NoError(t, err) require.Equal(t, store2Checkpoint, uint64(40)) } + +func testGetStorageCheckpoint(t *testing.T, metaCli streamhelper.MetaDataClient, etcd *embed.Etcd) { + var ( + taskName = "my_task" + ctx = context.Background() + value = make([]byte, 8) + ) + + cases := []struct { + storeID string + storageCheckPoint uint64 + }{ + { + "1", + 10001, + }, { + "2", + 10002, + }, + } + for _, c := range cases { + key := path.Join(streamhelper.StorageCheckpointOf(taskName), c.storeID) + binary.BigEndian.PutUint64(value, c.storageCheckPoint) + _, err := metaCli.Put(ctx, key, string(value)) + require.NoError(t, err) + } + + taskInfo := simpleTask(taskName, 1) + task := streamhelper.NewTask(&metaCli, taskInfo.PBInfo) + ts, err := task.GetStorageCheckpoint(ctx) + require.NoError(t, err) + require.Equal(t, uint64(10002), ts) +} + +func testStreamListening(t *testing.T, metaCli streamhelper.TaskEventClient) { + ctx, cancel := context.WithCancel(context.Background()) + taskName := "simple" + taskInfo := simpleTask(taskName, 4) + + require.NoError(t, metaCli.PutTask(ctx, taskInfo)) + ch := make(chan streamhelper.TaskEvent, 1024) + require.NoError(t, metaCli.Begin(ctx, ch)) + require.NoError(t, metaCli.DeleteTask(ctx, taskName)) + + taskName2 := "simple2" + taskInfo2 := simpleTask(taskName2, 4) + require.NoError(t, metaCli.PutTask(ctx, taskInfo2)) + require.NoError(t, metaCli.DeleteTask(ctx, taskName2)) + first := <-ch + require.Equal(t, first.Type, streamhelper.EventAdd) + require.Equal(t, first.Name, taskName) + second := <-ch + require.Equal(t, second.Type, streamhelper.EventDel) + require.Equal(t, second.Name, taskName) + third := <-ch + require.Equal(t, third.Type, streamhelper.EventAdd) + require.Equal(t, third.Name, taskName2) + forth := <-ch + require.Equal(t, forth.Type, streamhelper.EventDel) + require.Equal(t, forth.Name, taskName2) + cancel() + _, ok := <-ch + require.False(t, ok) +} diff --git a/br/pkg/stream/models.go b/br/pkg/streamhelper/models.go similarity index 87% rename from br/pkg/stream/models.go rename to br/pkg/streamhelper/models.go index 7aee22de0c239..8aebfbaaf5aa9 100644 --- a/br/pkg/stream/models.go +++ b/br/pkg/streamhelper/models.go @@ -1,5 +1,5 @@ // Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. -package stream +package streamhelper import ( "bytes" @@ -21,10 +21,14 @@ const ( streamKeyPrefix = "/tidb/br-stream" taskInfoPath = "/info" // nolint:deadcode,varcheck - taskCheckpointPath = "/checkpoint" - taskRangesPath = "/ranges" - taskPausePath = "/pause" - taskLastErrorPath = "/last-error" + taskCheckpointPath = "/checkpoint" + storageCheckPoint = "/storage-checkpoint" + taskRangesPath = "/ranges" + taskPausePath = "/pause" + taskLastErrorPath = "/last-error" + checkpointTypeGlobal = "central_global" + checkpointTypeRegion = "region" + checkpointTypeStore = "store" ) var ( @@ -78,6 +82,16 @@ func CheckPointsOf(task string) string { return buf.String() } +// GlobalCheckpointOf returns the path to the "global" checkpoint of some task. +func GlobalCheckpointOf(task string) string { + return path.Join(streamKeyPrefix, taskCheckpointPath, task, checkpointTypeGlobal) +} + +// StorageCheckpointOf get the prefix path of the `storage checkpoint status` of a task. +func StorageCheckpointOf(task string) string { + return path.Join(streamKeyPrefix, storageCheckPoint, task) +} + // CheckpointOf returns the checkpoint prefix of some store. // Normally it would be /checkpoint//. func CheckPointOf(task string, store uint64) string { @@ -111,7 +125,7 @@ type TaskInfo struct { } // NewTask creates a new task with the name. -func NewTask(name string) *TaskInfo { +func NewTaskInfo(name string) *TaskInfo { return &TaskInfo{ PBInfo: backuppb.StreamBackupTaskInfo{ Name: name, diff --git a/br/pkg/stream/prefix_scanner.go b/br/pkg/streamhelper/prefix_scanner.go similarity index 99% rename from br/pkg/stream/prefix_scanner.go rename to br/pkg/streamhelper/prefix_scanner.go index 4700b26c5acd2..c06b3b9a26867 100644 --- a/br/pkg/stream/prefix_scanner.go +++ b/br/pkg/streamhelper/prefix_scanner.go @@ -1,5 +1,5 @@ // Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. -package stream +package streamhelper import ( "context" diff --git a/br/pkg/streamhelper/regioniter.go b/br/pkg/streamhelper/regioniter.go new file mode 100644 index 0000000000000..9f71ebf38b472 --- /dev/null +++ b/br/pkg/streamhelper/regioniter.go @@ -0,0 +1,146 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "bytes" + "context" + "fmt" + "time" + + "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/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/redact" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" +) + +const ( + defaultPageSize = 2048 +) + +type RegionWithLeader struct { + Region *metapb.Region + Leader *metapb.Peer +} + +type RegionScanner interface { + // RegionScan gets a list of regions, starts from the region that contains key. + // Limit limits the maximum number of regions returned. + RegionScan(ctx context.Context, key, endKey []byte, limit int) ([]RegionWithLeader, error) +} + +type RegionIter struct { + cli RegionScanner + startKey, endKey []byte + currentStartKey []byte + // When the endKey become "", we cannot check whether the scan is done by + // comparing currentStartKey and endKey (because "" has different meaning in start key and end key). + // So set this to `ture` when endKey == "" and the scan is done. + infScanFinished bool + + // The max slice size returned by `Next`. + // This can be changed before calling `Next` each time, + // however no thread safety provided. + PageSize int +} + +func (r *RegionIter) String() string { + return fmt.Sprintf("RegionIter:%s;%v;from=%s", + logutil.StringifyKeys([]kv.KeyRange{{StartKey: r.currentStartKey, EndKey: r.endKey}}), + r.infScanFinished, + redact.Key(r.startKey)) +} + +// IterateRegion creates an iterater over the region range. +func IterateRegion(cli RegionScanner, startKey, endKey []byte) *RegionIter { + return &RegionIter{ + cli: cli, + startKey: startKey, + endKey: endKey, + currentStartKey: startKey, + PageSize: defaultPageSize, + } +} + +func CheckRegionConsistency(startKey, endKey []byte, regions []RegionWithLeader) error { + // current pd can't guarantee the consistency of returned regions + if len(regions) == 0 { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "scan region return empty result, startKey: %s, endKey: %s", + redact.Key(startKey), redact.Key(endKey)) + } + + if bytes.Compare(regions[0].Region.StartKey, startKey) > 0 { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "first region's startKey > startKey, startKey: %s, regionStartKey: %s", + redact.Key(startKey), redact.Key(regions[0].Region.StartKey)) + } else if len(regions[len(regions)-1].Region.EndKey) != 0 && bytes.Compare(regions[len(regions)-1].Region.EndKey, endKey) < 0 { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "last region's endKey < endKey, endKey: %s, regionEndKey: %s", + redact.Key(endKey), redact.Key(regions[len(regions)-1].Region.EndKey)) + } + + cur := regions[0] + for _, r := range regions[1:] { + if !bytes.Equal(cur.Region.EndKey, r.Region.StartKey) { + return errors.Annotatef(berrors.ErrPDBatchScanRegion, "region endKey not equal to next region startKey, endKey: %s, startKey: %s", + redact.Key(cur.Region.EndKey), redact.Key(r.Region.StartKey)) + } + cur = r + } + + return nil +} + +// Next get the next page of regions. +func (r *RegionIter) Next(ctx context.Context) ([]RegionWithLeader, error) { + var rs []RegionWithLeader + state := utils.InitialRetryState(8, 500*time.Millisecond, 500*time.Millisecond) + err := utils.WithRetry(ctx, func() (retErr error) { + defer func() { + if retErr != nil { + log.Warn("failed with trying to scan regions", logutil.ShortError(retErr), + logutil.Key("start", r.currentStartKey), + logutil.Key("end", r.endKey), + ) + } + metrics.RegionCheckpointFailure.WithLabelValues("retryable-scan-region").Inc() + }() + regions, err := r.cli.RegionScan(ctx, r.currentStartKey, r.endKey, r.PageSize) + if err != nil { + return err + } + if len(regions) > 0 { + endKey := regions[len(regions)-1].Region.GetEndKey() + if err := CheckRegionConsistency(r.currentStartKey, endKey, regions); err != nil { + return err + } + rs = regions + return nil + } + return CheckRegionConsistency(r.currentStartKey, r.endKey, regions) + }, &state) + if err != nil { + return nil, err + } + endKey := rs[len(rs)-1].Region.EndKey + // We have meet the last region. + if len(endKey) == 0 { + r.infScanFinished = true + } + r.currentStartKey = endKey + return rs, nil +} + +// Done checks whether the iteration is done. +func (r *RegionIter) Done() bool { + // special case: we want to scan to the end of key space. + // at this time, comparing currentStartKey and endKey may be misleading when + // they are both "". + if len(r.endKey) == 0 { + return r.infScanFinished + } + return r.infScanFinished || bytes.Compare(r.currentStartKey, r.endKey) >= 0 +} diff --git a/br/pkg/streamhelper/regioniter_test.go b/br/pkg/streamhelper/regioniter_test.go new file mode 100644 index 0000000000000..42d4445f70679 --- /dev/null +++ b/br/pkg/streamhelper/regioniter_test.go @@ -0,0 +1,184 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper_test + +import ( + "bytes" + "context" + "fmt" + "strings" + "testing" + + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/redact" + "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/kv" + "github.com/stretchr/testify/require" +) + +type constantRegions []streamhelper.RegionWithLeader + +func regionToRange(region streamhelper.RegionWithLeader) kv.KeyRange { + return kv.KeyRange{ + StartKey: region.Region.StartKey, + EndKey: region.Region.EndKey, + } +} + +func (c constantRegions) EqualsTo(other []streamhelper.RegionWithLeader) bool { + if len(c) != len(other) { + return false + } + for i := 0; i < len(c); i++ { + r1 := regionToRange(c[i]) + r2 := regionToRange(other[i]) + + equals := bytes.Equal(r1.StartKey, r2.StartKey) && bytes.Equal(r1.EndKey, r2.EndKey) + if !equals { + return false + } + } + return true +} + +func (c constantRegions) String() string { + segs := make([]string, 0, len(c)) + for _, region := range c { + segs = append(segs, fmt.Sprintf("%d%s", region.Region.Id, logutil.StringifyRange(regionToRange(region)))) + } + return strings.Join(segs, ";") +} + +// RegionScan gets a list of regions, starts from the region that contains key. +// Limit limits the maximum number of regions returned. +func (c constantRegions) RegionScan(ctx context.Context, key []byte, endKey []byte, limit int) ([]streamhelper.RegionWithLeader, error) { + result := make([]streamhelper.RegionWithLeader, 0, limit) + for _, region := range c { + if overlaps(kv.KeyRange{StartKey: key, EndKey: endKey}, kv.KeyRange{StartKey: region.Region.StartKey, EndKey: region.Region.EndKey}) && len(result) < limit { + result = append(result, region) + } else if bytes.Compare(region.Region.StartKey, key) > 0 { + break + } + } + fmt.Printf("all = %s\n", c) + fmt.Printf("start = %s, end = %s, result = %s\n", redact.Key(key), redact.Key(endKey), constantRegions(result)) + return result, nil +} + +func makeSubrangeRegions(keys ...string) constantRegions { + if len(keys) == 0 { + return nil + } + id := uint64(1) + regions := make([]streamhelper.RegionWithLeader, 0, len(keys)+1) + start := keys[0] + for _, key := range keys[1:] { + region := streamhelper.RegionWithLeader{ + Region: &metapb.Region{ + Id: id, + StartKey: []byte(start), + EndKey: []byte(key), + }, + } + id++ + start = key + regions = append(regions, region) + } + return constantRegions(regions) + +} + +func useRegions(keys ...string) constantRegions { + ks := []string{""} + ks = append(ks, keys...) + ks = append(ks, "") + return makeSubrangeRegions(ks...) +} + +func manyRegions(from, to int) []string { + regions := []string{} + for i := from; i < to; i++ { + regions = append(regions, fmt.Sprintf("%06d", i)) + } + return regions +} + +func appendInitial(a []string) []string { + return append([]string{""}, a...) +} + +func appendFinal(a []string) []string { + return append(a, "") +} + +func TestRegionIterator(t *testing.T) { + type Case struct { + // boundary of regions, doesn't include the initial key (implicitly "") + // or the final key (implicitly +inf) + // Example: + // ["0001", "0002"] => [Region("", "0001"), Region("0001", "0002"), Region("0002", "")] + RegionBoundary []string + StartKey string + EndKey string + // border of required regions, include the initial key and the final key. + // Example: + // ["0001", "0002", ""] => [Region("0001", "0002"), Region("0002", "")] + RequiredRegionBoundary []string + } + + run := func(t *testing.T, c Case) { + req := require.New(t) + regions := useRegions(c.RegionBoundary...) + requiredRegions := makeSubrangeRegions(c.RequiredRegionBoundary...) + ctx := context.Background() + + collected := make([]streamhelper.RegionWithLeader, 0, len(c.RequiredRegionBoundary)) + iter := streamhelper.IterateRegion(regions, []byte(c.StartKey), []byte(c.EndKey)) + for !iter.Done() { + regions, err := iter.Next(ctx) + req.NoError(err) + collected = append(collected, regions...) + } + req.True(requiredRegions.EqualsTo(collected), "%s :: %s", requiredRegions, collected) + } + + cases := []Case{ + { + RegionBoundary: []string{"0001", "0003", "0008", "0078"}, + StartKey: "0077", + EndKey: "0079", + RequiredRegionBoundary: []string{"0008", "0078", ""}, + }, + { + RegionBoundary: []string{"0001", "0005", "0008", "0097"}, + StartKey: "0000", + EndKey: "0008", + RequiredRegionBoundary: []string{"", "0001", "0005", "0008"}, + }, + { + RegionBoundary: manyRegions(0, 10000), + StartKey: "000001", + EndKey: "005000", + RequiredRegionBoundary: manyRegions(1, 5001), + }, + { + RegionBoundary: manyRegions(0, 10000), + StartKey: "000100", + EndKey: "", + RequiredRegionBoundary: appendFinal(manyRegions(100, 10000)), + }, + { + RegionBoundary: manyRegions(0, 10000), + StartKey: "", + EndKey: "003000", + RequiredRegionBoundary: appendInitial(manyRegions(0, 3001)), + }, + } + + for i, c := range cases { + t.Run(fmt.Sprintf("case#%d", i), func(t *testing.T) { + run(t, c) + }) + } +} diff --git a/br/pkg/streamhelper/stream_listener.go b/br/pkg/streamhelper/stream_listener.go new file mode 100644 index 0000000000000..e48064613efdb --- /dev/null +++ b/br/pkg/streamhelper/stream_listener.go @@ -0,0 +1,170 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "bytes" + "context" + "fmt" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + berrors "github.com/pingcap/tidb/br/pkg/errors" + clientv3 "go.etcd.io/etcd/client/v3" +) + +type EventType int + +const ( + EventAdd EventType = iota + EventDel + EventErr +) + +func (t EventType) String() string { + switch t { + case EventAdd: + return "Add" + case EventDel: + return "Del" + case EventErr: + return "Err" + } + return "Unknown" +} + +type TaskEvent struct { + Type EventType + Name string + Info *backuppb.StreamBackupTaskInfo + Err error +} + +func (t *TaskEvent) String() string { + if t.Err != nil { + return fmt.Sprintf("%s(%s, err = %s)", t.Type, t.Name, t.Err) + } + return fmt.Sprintf("%s(%s)", t.Type, t.Name) +} + +type TaskEventClient struct { + MetaDataClient +} + +func errorEvent(err error) TaskEvent { + return TaskEvent{ + Type: EventErr, + Err: err, + } +} + +func toTaskEvent(event *clientv3.Event) (TaskEvent, error) { + if !bytes.HasPrefix(event.Kv.Key, []byte(PrefixOfTask())) { + return TaskEvent{}, errors.Annotatef(berrors.ErrInvalidArgument, "the path isn't a task path (%s)", string(event.Kv.Key)) + } + + te := TaskEvent{} + te.Name = strings.TrimPrefix(string(event.Kv.Key), PrefixOfTask()) + if event.Type == clientv3.EventTypeDelete { + te.Type = EventDel + } else if event.Type == clientv3.EventTypePut { + te.Type = EventAdd + } else { + return TaskEvent{}, errors.Annotatef(berrors.ErrInvalidArgument, "event type is wrong (%s)", event.Type) + } + te.Info = new(backuppb.StreamBackupTaskInfo) + if err := proto.Unmarshal(event.Kv.Value, te.Info); err != nil { + return TaskEvent{}, err + } + return te, nil +} + +func eventFromWatch(resp clientv3.WatchResponse) ([]TaskEvent, error) { + result := make([]TaskEvent, 0, len(resp.Events)) + for _, event := range resp.Events { + te, err := toTaskEvent(event) + if err != nil { + te.Type = EventErr + te.Err = err + } + result = append(result, te) + } + return result, nil +} + +func (t TaskEventClient) startListen(ctx context.Context, rev int64, ch chan<- TaskEvent) { + c := t.Client.Watcher.Watch(ctx, PrefixOfTask(), clientv3.WithPrefix(), clientv3.WithRev(rev)) + handleResponse := func(resp clientv3.WatchResponse) bool { + events, err := eventFromWatch(resp) + if err != nil { + ch <- errorEvent(err) + return false + } + for _, event := range events { + ch <- event + } + return true + } + + go func() { + defer close(ch) + for { + select { + case resp, ok := <-c: + if !ok { + return + } + if !handleResponse(resp) { + return + } + case <-ctx.Done(): + // drain the remain event from channel. + for { + select { + case resp, ok := <-c: + if !ok { + return + } + if !handleResponse(resp) { + return + } + default: + return + } + } + } + } + }() +} + +func (t TaskEventClient) getFullTasksAsEvent(ctx context.Context) ([]TaskEvent, int64, error) { + tasks, rev, err := t.GetAllTasksWithRevision(ctx) + if err != nil { + return nil, 0, err + } + events := make([]TaskEvent, 0, len(tasks)) + for _, task := range tasks { + te := TaskEvent{ + Type: EventAdd, + Name: task.Info.Name, + Info: &task.Info, + } + events = append(events, te) + } + return events, rev, nil +} + +func (t TaskEventClient) Begin(ctx context.Context, ch chan<- TaskEvent) error { + initialTasks, rev, err := t.getFullTasksAsEvent(ctx) + if err != nil { + return err + } + // Note: maybe `go` here so we won't block? + for _, task := range initialTasks { + ch <- task + } + t.startListen(ctx, rev+1, ch) + return nil +} diff --git a/br/pkg/streamhelper/tsheap.go b/br/pkg/streamhelper/tsheap.go new file mode 100644 index 0000000000000..75d674c56b18e --- /dev/null +++ b/br/pkg/streamhelper/tsheap.go @@ -0,0 +1,239 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package streamhelper + +import ( + "encoding/hex" + "fmt" + "strings" + "sync" + "time" + + "github.com/google/btree" + "github.com/pingcap/errors" + berrors "github.com/pingcap/tidb/br/pkg/errors" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/redact" + "github.com/pingcap/tidb/kv" + "github.com/tikv/client-go/v2/oracle" + "go.uber.org/zap/zapcore" +) + +// CheckpointsCache is the heap-like cache for checkpoints. +// +// "Checkpoint" is the "Resolved TS" of some range. +// A resolved ts is a "watermark" for the system, which: +// - implies there won't be any transactions (in some range) commit with `commit_ts` smaller than this TS. +// - is monotonic increasing. +// A "checkpoint" is a "safe" Resolved TS, which: +// - is a TS *less than* the real resolved ts of now. +// - is based on range (it only promises there won't be new committed txns in the range). +// - the checkpoint of union of ranges is the minimal checkpoint of all ranges. +// As an example: +// +----------------------------------+ +// ^-----------^ (Checkpoint = 42) +// ^---------------^ (Checkpoint = 76) +// ^-----------------------^ (Checkpoint = min(42, 76) = 42) +// +// For calculating the global checkpoint, we can make a heap-like structure: +// Checkpoint Ranges +// 42 -> {[0, 8], [16, 100]} +// 1002 -> {[8, 16]} +// 1082 -> {[100, inf]} +// For now, the checkpoint of range [8, 16] and [100, inf] won't affect the global checkpoint +// directly, so we can try to advance only the ranges of {[0, 8], [16, 100]} (which's checkpoint is steal). +// Once them get advance, the global checkpoint would be advanced then, +// and we don't need to update all ranges (because some new ranges don't need to be advanced so quickly.) +type CheckpointsCache interface { + fmt.Stringer + // InsertRange inserts a range with specified TS to the cache. + InsertRange(ts uint64, rng kv.KeyRange) + // InsertRanges inserts a set of ranges that sharing checkpoint to the cache. + InsertRanges(rst RangesSharesTS) + // CheckpointTS returns the now global (union of all ranges) checkpoint of the cache. + CheckpointTS() uint64 + // PopRangesWithGapGT pops the ranges which's checkpoint is + PopRangesWithGapGT(d time.Duration) []*RangesSharesTS + // Check whether the ranges in the cache is integrate. + ConsistencyCheck() error + // Clear the cache. + Clear() +} + +// NoOPCheckpointCache is used when cache disabled. +type NoOPCheckpointCache struct{} + +func (NoOPCheckpointCache) InsertRange(ts uint64, rng kv.KeyRange) {} + +func (NoOPCheckpointCache) InsertRanges(rst RangesSharesTS) {} + +func (NoOPCheckpointCache) Clear() {} + +func (NoOPCheckpointCache) String() string { + return "NoOPCheckpointCache" +} + +func (NoOPCheckpointCache) CheckpointTS() uint64 { + panic("invalid state: NoOPCheckpointCache should never be used in advancing!") +} + +func (NoOPCheckpointCache) PopRangesWithGapGT(d time.Duration) []*RangesSharesTS { + panic("invalid state: NoOPCheckpointCache should never be used in advancing!") +} + +func (NoOPCheckpointCache) ConsistencyCheck() error { + return errors.Annotatef(berrors.ErrUnsupportedOperation, "invalid state: NoOPCheckpointCache should never be used in advancing!") +} + +// RangesSharesTS is a set of ranges shares the same timestamp. +type RangesSharesTS struct { + TS uint64 + Ranges []kv.KeyRange +} + +func (rst *RangesSharesTS) Zap() zapcore.ObjectMarshaler { + return zapcore.ObjectMarshalerFunc(func(oe zapcore.ObjectEncoder) error { + rngs := rst.Ranges + if len(rst.Ranges) > 3 { + rngs = rst.Ranges[:3] + } + + oe.AddUint64("checkpoint", rst.TS) + return oe.AddArray("items", zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error { + return ae.AppendObject(zapcore.ObjectMarshalerFunc(func(oe1 zapcore.ObjectEncoder) error { + for _, rng := range rngs { + oe1.AddString("start-key", redact.String(hex.EncodeToString(rng.StartKey))) + oe1.AddString("end-key", redact.String(hex.EncodeToString(rng.EndKey))) + } + return nil + })) + })) + }) +} + +func (rst *RangesSharesTS) String() string { + // Make a more friendly string. + return fmt.Sprintf("@%sR%d", oracle.GetTimeFromTS(rst.TS).Format("0405"), len(rst.Ranges)) +} + +func (rst *RangesSharesTS) Less(other btree.Item) bool { + return rst.TS < other.(*RangesSharesTS).TS +} + +// Checkpoints is a heap that collects all checkpoints of +// regions, it supports query the latest checkpoint fast. +// This structure is thread safe. +type Checkpoints struct { + tree *btree.BTree + + mu sync.Mutex +} + +func NewCheckpoints() *Checkpoints { + return &Checkpoints{ + tree: btree.New(32), + } +} + +// String formats the slowest 5 ranges sharing TS to string. +func (h *Checkpoints) String() string { + h.mu.Lock() + defer h.mu.Unlock() + + b := new(strings.Builder) + count := 0 + total := h.tree.Len() + h.tree.Ascend(func(i btree.Item) bool { + rst := i.(*RangesSharesTS) + b.WriteString(rst.String()) + b.WriteString(";") + count++ + return count < 5 + }) + if total-count > 0 { + fmt.Fprintf(b, "O%d", total-count) + } + return b.String() +} + +// InsertRanges insert a RangesSharesTS directly to the tree. +func (h *Checkpoints) InsertRanges(r RangesSharesTS) { + h.mu.Lock() + defer h.mu.Unlock() + if items := h.tree.Get(&r); items != nil { + i := items.(*RangesSharesTS) + i.Ranges = append(i.Ranges, r.Ranges...) + } else { + h.tree.ReplaceOrInsert(&r) + } +} + +// InsertRange inserts the region and its TS into the region tree. +func (h *Checkpoints) InsertRange(ts uint64, rng kv.KeyRange) { + h.mu.Lock() + defer h.mu.Unlock() + r := h.tree.Get(&RangesSharesTS{TS: ts}) + if r == nil { + r = &RangesSharesTS{TS: ts} + h.tree.ReplaceOrInsert(r) + } + rr := r.(*RangesSharesTS) + rr.Ranges = append(rr.Ranges, rng) +} + +// Clear removes all records in the checkpoint cache. +func (h *Checkpoints) Clear() { + h.mu.Lock() + defer h.mu.Unlock() + h.tree.Clear(false) +} + +// PopRangesWithGapGT pops ranges with gap greater than the specified duration. +// NOTE: maybe make something like `DrainIterator` for better composing? +func (h *Checkpoints) PopRangesWithGapGT(d time.Duration) []*RangesSharesTS { + h.mu.Lock() + defer h.mu.Unlock() + result := []*RangesSharesTS{} + for { + item, ok := h.tree.Min().(*RangesSharesTS) + if !ok { + return result + } + if time.Since(oracle.GetTimeFromTS(item.TS)) >= d { + result = append(result, item) + h.tree.DeleteMin() + } else { + return result + } + } +} + +// CheckpointTS returns the cached checkpoint TS by the current state of the cache. +func (h *Checkpoints) CheckpointTS() uint64 { + h.mu.Lock() + defer h.mu.Unlock() + item, ok := h.tree.Min().(*RangesSharesTS) + if !ok { + return 0 + } + return item.TS +} + +// ConsistencyCheck checks whether the tree contains the full range of key space. +// TODO: add argument to it and check a sub range. +func (h *Checkpoints) ConsistencyCheck() error { + h.mu.Lock() + ranges := make([]kv.KeyRange, 0, 1024) + h.tree.Ascend(func(i btree.Item) bool { + ranges = append(ranges, i.(*RangesSharesTS).Ranges...) + return true + }) + h.mu.Unlock() + + r := CollapseRanges(len(ranges), func(i int) kv.KeyRange { return ranges[i] }) + if len(r) != 1 || len(r[0].StartKey) != 0 || len(r[0].EndKey) != 0 { + return errors.Annotatef(berrors.ErrPiTRMalformedMetadata, + "the region tree cannot cover the key space, collapsed: %s", logutil.StringifyKeys(r)) + } + return nil +} diff --git a/br/pkg/streamhelper/tsheap_test.go b/br/pkg/streamhelper/tsheap_test.go new file mode 100644 index 0000000000000..6453ee36a60ab --- /dev/null +++ b/br/pkg/streamhelper/tsheap_test.go @@ -0,0 +1,165 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. +package streamhelper_test + +import ( + "math" + "testing" + + "github.com/pingcap/tidb/br/pkg/streamhelper" + "github.com/pingcap/tidb/kv" + "github.com/stretchr/testify/require" +) + +func TestInsert(t *testing.T) { + cases := []func(func(ts uint64, a, b string)){ + func(insert func(ts uint64, a, b string)) { + insert(1, "", "01") + insert(1, "01", "02") + insert(2, "02", "022") + insert(4, "022", "") + }, + func(insert func(ts uint64, a, b string)) { + insert(1, "", "01") + insert(2, "", "01") + insert(2, "011", "02") + insert(1, "", "") + insert(65, "03", "04") + }, + } + + for _, c := range cases { + cps := streamhelper.NewCheckpoints() + expected := map[uint64]*streamhelper.RangesSharesTS{} + checkpoint := uint64(math.MaxUint64) + insert := func(ts uint64, a, b string) { + cps.InsertRange(ts, kv.KeyRange{ + StartKey: []byte(a), + EndKey: []byte(b), + }) + i, ok := expected[ts] + if !ok { + expected[ts] = &streamhelper.RangesSharesTS{TS: ts, Ranges: []kv.KeyRange{{StartKey: []byte(a), EndKey: []byte(b)}}} + } else { + i.Ranges = append(i.Ranges, kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)}) + } + if ts < checkpoint { + checkpoint = ts + } + } + c(insert) + require.Equal(t, checkpoint, cps.CheckpointTS()) + rngs := cps.PopRangesWithGapGT(0) + for _, rng := range rngs { + other := expected[rng.TS] + require.Equal(t, other, rng) + } + } +} + +func TestMergeRanges(t *testing.T) { + r := func(a, b string) kv.KeyRange { + return kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)} + } + type Case struct { + expected []kv.KeyRange + parameter []kv.KeyRange + } + cases := []Case{ + { + parameter: []kv.KeyRange{r("01", "01111"), r("0111", "0112")}, + expected: []kv.KeyRange{r("01", "0112")}, + }, + { + parameter: []kv.KeyRange{r("01", "03"), r("02", "04")}, + expected: []kv.KeyRange{r("01", "04")}, + }, + { + parameter: []kv.KeyRange{r("04", "08"), r("09", "10")}, + expected: []kv.KeyRange{r("04", "08"), r("09", "10")}, + }, + { + parameter: []kv.KeyRange{r("01", "03"), r("02", "04"), r("05", "07"), r("08", "09")}, + expected: []kv.KeyRange{r("01", "04"), r("05", "07"), r("08", "09")}, + }, + { + parameter: []kv.KeyRange{r("01", "02"), r("012", "")}, + expected: []kv.KeyRange{r("01", "")}, + }, + { + parameter: []kv.KeyRange{r("", "01"), r("02", "03"), r("021", "")}, + expected: []kv.KeyRange{r("", "01"), r("02", "")}, + }, + { + parameter: []kv.KeyRange{r("", "01"), r("001", "")}, + expected: []kv.KeyRange{r("", "")}, + }, + { + parameter: []kv.KeyRange{r("", "01"), r("", ""), r("", "02")}, + expected: []kv.KeyRange{r("", "")}, + }, + { + parameter: []kv.KeyRange{r("", "01"), r("01", ""), r("", "02"), r("", "03"), r("01", "02")}, + expected: []kv.KeyRange{r("", "")}, + }, + { + parameter: []kv.KeyRange{r("", ""), r("", "01"), r("01", ""), r("01", "02")}, + expected: []kv.KeyRange{r("", "")}, + }, + } + + for i, c := range cases { + result := streamhelper.CollapseRanges(len(c.parameter), func(i int) kv.KeyRange { + return c.parameter[i] + }) + require.Equal(t, c.expected, result, "case = %d", i) + } + +} + +func TestInsertRanges(t *testing.T) { + r := func(a, b string) kv.KeyRange { + return kv.KeyRange{StartKey: []byte(a), EndKey: []byte(b)} + } + rs := func(ts uint64, ranges ...kv.KeyRange) streamhelper.RangesSharesTS { + return streamhelper.RangesSharesTS{TS: ts, Ranges: ranges} + } + + type Case struct { + Expected []streamhelper.RangesSharesTS + Parameters []streamhelper.RangesSharesTS + } + + cases := []Case{ + { + Parameters: []streamhelper.RangesSharesTS{ + rs(1, r("0", "1"), r("1", "2")), + rs(1, r("2", "3"), r("3", "4")), + }, + Expected: []streamhelper.RangesSharesTS{ + rs(1, r("0", "1"), r("1", "2"), r("2", "3"), r("3", "4")), + }, + }, + { + Parameters: []streamhelper.RangesSharesTS{ + rs(1, r("0", "1")), + rs(2, r("2", "3")), + rs(1, r("4", "5"), r("6", "7")), + }, + Expected: []streamhelper.RangesSharesTS{ + rs(1, r("0", "1"), r("4", "5"), r("6", "7")), + rs(2, r("2", "3")), + }, + }, + } + + for _, c := range cases { + theTree := streamhelper.NewCheckpoints() + for _, p := range c.Parameters { + theTree.InsertRanges(p) + } + ranges := theTree.PopRangesWithGapGT(0) + for i, rs := range ranges { + require.ElementsMatch(t, c.Expected[i].Ranges, rs.Ranges, "case = %#v", c) + } + } +} diff --git a/br/pkg/summary/collector.go b/br/pkg/summary/collector.go index 2ba603619f759..705c26df3e4ac 100644 --- a/br/pkg/summary/collector.go +++ b/br/pkg/summary/collector.go @@ -92,7 +92,7 @@ type logCollector struct { } // NewLogCollector returns a new LogCollector. -func NewLogCollector(log logFunc) LogCollector { +func NewLogCollector(logf logFunc) LogCollector { return &logCollector{ successUnitCount: 0, failureUnitCount: 0, @@ -102,7 +102,7 @@ func NewLogCollector(log logFunc) LogCollector { durations: make(map[string]time.Duration), ints: make(map[string]int), uints: make(map[string]uint64), - log: log, + log: logf, startTime: time.Now(), } } diff --git a/br/pkg/summary/summary.go b/br/pkg/summary/summary.go index b8595350b86d2..7ae488785760e 100644 --- a/br/pkg/summary/summary.go +++ b/br/pkg/summary/summary.go @@ -48,6 +48,7 @@ func Summary(name string) { collector.Summary(name) } +// Log outputs log. func Log(msg string, fields ...zap.Field) { collector.Log(msg, fields...) } diff --git a/br/pkg/task/BUILD.bazel b/br/pkg/task/BUILD.bazel index 9cdc23114f2be..8d1c738baedca 100644 --- a/br/pkg/task/BUILD.bazel +++ b/br/pkg/task/BUILD.bazel @@ -26,17 +26,21 @@ go_library( "//br/pkg/rtree", "//br/pkg/storage", "//br/pkg/stream", + "//br/pkg/streamhelper", + "//br/pkg/streamhelper/config", "//br/pkg/summary", "//br/pkg/utils", "//br/pkg/version", "//config", "//kv", "//parser/mysql", + "//sessionctx", "//sessionctx/stmtctx", "//sessionctx/variable", "//statistics/handle", "//types", "//util/mathutil", + "//util/sqlexec", "//util/table-filter", "@com_github_docker_go_units//:go-units", "@com_github_fatih_color//:color", @@ -76,9 +80,9 @@ go_test( deps = [ "//br/pkg/conn", "//br/pkg/metautil", - "//br/pkg/pdutil", "//br/pkg/restore", "//br/pkg/storage", + "//br/pkg/stream", "//br/pkg/utils", "//config", "//parser/model", diff --git a/br/pkg/task/backup.go b/br/pkg/task/backup.go index 311f57e9de020..8aaf0c8d6f0c8 100644 --- a/br/pkg/task/backup.go +++ b/br/pkg/task/backup.go @@ -18,6 +18,7 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/backup" "github.com/pingcap/tidb/br/pkg/checksum" + "github.com/pingcap/tidb/br/pkg/conn" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/glue" "github.com/pingcap/tidb/br/pkg/logutil" @@ -26,6 +27,7 @@ import ( "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/types" @@ -252,7 +254,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig // Domain loads all table info into memory. By skipping Domain, we save // lots of memory (about 500MB for 40K 40 fields YCSB tables). needDomain := !skipStats - mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain) + mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain, conn.NormalVersionChecker) if err != nil { return errors.Trace(err) } @@ -398,7 +400,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig } metawriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) - err = backup.WriteBackupDDLJobs(metawriter, mgr.GetStorage(), cfg.LastBackupTS, backupTS) + err = backup.WriteBackupDDLJobs(metawriter, se.(sessionctx.Context), mgr.GetStorage(), cfg.LastBackupTS, backupTS) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/task/backup_raw.go b/br/pkg/task/backup_raw.go index 7fe34dfb5243e..6bb5aba79c3b1 100644 --- a/br/pkg/task/backup_raw.go +++ b/br/pkg/task/backup_raw.go @@ -11,6 +11,7 @@ import ( backuppb "github.com/pingcap/kvproto/pkg/brpb" "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/backup" + "github.com/pingcap/tidb/br/pkg/conn" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/glue" "github.com/pingcap/tidb/br/pkg/metautil" @@ -137,7 +138,7 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf } // Backup raw does not need domain. needDomain := false - mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain) + mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain, conn.NormalVersionChecker) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/task/common.go b/br/pkg/task/common.go index 7deada25bd562..d4cf94c1a0f69 100644 --- a/br/pkg/task/common.go +++ b/br/pkg/task/common.go @@ -208,6 +208,9 @@ type Config struct { GRPCKeepaliveTimeout time.Duration `json:"grpc-keepalive-timeout" toml:"grpc-keepalive-timeout"` CipherInfo backuppb.CipherInfo `json:"-" toml:"-"` + + // whether there's explicit filter + ExplicitFilter bool `json:"-" toml:"-"` } // DefineCommonFlags defines the flags common to all BRIE commands. @@ -467,6 +470,7 @@ func (cfg *Config) ParseFromFlags(flags *pflag.FlagSet) error { cfg.Tables = make(map[string]struct{}) var caseSensitive bool if filterFlag := flags.Lookup(flagFilter); filterFlag != nil { + cfg.ExplicitFilter = flags.Changed(flagFilter) cfg.FilterStr = filterFlag.Value.(pflag.SliceValue).GetSlice() cfg.TableFilter, err = filter.Parse(cfg.FilterStr) if err != nil { @@ -562,6 +566,7 @@ func NewMgr(ctx context.Context, keepalive keepalive.ClientParameters, checkRequirements bool, needDomain bool, + versionCheckerType conn.VersionCheckerType, ) (*conn.Mgr, error) { var ( tlsConf *tls.Config @@ -586,7 +591,7 @@ func NewMgr(ctx context.Context, // Is it necessary to remove `StoreBehavior`? return conn.NewMgr( ctx, g, pdAddress, tlsConf, securityOption, keepalive, conn.SkipTiFlash, - checkRequirements, needDomain, + checkRequirements, needDomain, versionCheckerType, ) } diff --git a/br/pkg/task/restore.go b/br/pkg/task/restore.go index 3c7095bc1df4e..798bd1420b40d 100644 --- a/br/pkg/task/restore.go +++ b/br/pkg/task/restore.go @@ -57,7 +57,7 @@ const ( FlagStreamFullBackupStorage = "full-backup-storage" defaultRestoreConcurrency = 128 - defaultRestoreStreamConcurrency = 64 + defaultRestoreStreamConcurrency = 16 maxRestoreBatchSizeLimit = 10240 defaultPDConcurrency = 1 defaultBatchFlushInterval = 16 * time.Second @@ -266,8 +266,9 @@ func (cfg *RestoreConfig) adjustRestoreConfig() { } func (cfg *RestoreConfig) adjustRestoreConfigForStreamRestore() { - if cfg.Config.Concurrency == 0 { - cfg.Config.Concurrency = 16 + if cfg.Config.Concurrency == 0 || cfg.Config.Concurrency > defaultRestoreStreamConcurrency { + log.Info("set restore kv files concurrency", zap.Int("concurrency", defaultRestoreStreamConcurrency)) + cfg.Config.Concurrency = defaultRestoreStreamConcurrency } } @@ -383,7 +384,6 @@ func IsStreamRestore(cmdName string) bool { // RunRestore starts a restore task inside the current goroutine. func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConfig) error { if IsStreamRestore(cmdName) { - cfg.adjustRestoreConfigForStreamRestore() return RunStreamRestore(c, g, cmdName, cfg) } @@ -401,7 +401,7 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf // Restore needs domain to do DDL. needDomain := true keepaliveCfg := GetKeepalive(&cfg.Config) - mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, keepaliveCfg, cfg.CheckRequirements, needDomain) + mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, keepaliveCfg, cfg.CheckRequirements, needDomain, conn.NormalVersionChecker) if err != nil { return errors.Trace(err) } @@ -471,6 +471,22 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf return errors.Trace(err) } + // todo: move this check into InitFullClusterRestore, we should move restore config into a separate package + // to avoid import cycle problem which we won't do it in this pr, then refactor this + // + // if it's point restore and reached here, then cmdName=FullRestoreCmd and len(cfg.FullBackupStorage) > 0 + if cmdName == FullRestoreCmd { + client.InitFullClusterRestore(cfg.ExplicitFilter) + } + if client.IsFullClusterRestore() && client.HasBackedUpSysDB() { + if err = client.CheckTargetClusterFresh(ctx); err != nil { + return errors.Trace(err) + } + if err = client.CheckSysTableCompatibility(mgr.GetDomain(), tables); err != nil { + return errors.Trace(err) + } + } + sp := utils.BRServiceSafePoint{ BackupTS: restoreTS, TTL: utils.DefaultBRGCSafePointTTL, diff --git a/br/pkg/task/restore_raw.go b/br/pkg/task/restore_raw.go index 452cccfad8c42..6c15cd9989512 100644 --- a/br/pkg/task/restore_raw.go +++ b/br/pkg/task/restore_raw.go @@ -67,7 +67,7 @@ func RunRestoreRaw(c context.Context, g glue.Glue, cmdName string, cfg *RestoreR // Restore raw does not need domain. needDomain := false - mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain) + mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain, conn.NormalVersionChecker) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/task/stream.go b/br/pkg/task/stream.go index 3683854dc2169..ac791a34043f3 100644 --- a/br/pkg/task/stream.go +++ b/br/pkg/task/stream.go @@ -17,12 +17,14 @@ package task import ( "bytes" "context" - "encoding/json" + "encoding/binary" "fmt" "net/http" "strings" + "sync" "time" + "github.com/docker/go-units" "github.com/fatih/color" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" @@ -38,10 +40,13 @@ 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/br/pkg/streamhelper" + advancercfg "github.com/pingcap/tidb/br/pkg/streamhelper/config" "github.com/pingcap/tidb/br/pkg/summary" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/sqlexec" "github.com/spf13/pflag" "github.com/tikv/client-go/v2/config" "github.com/tikv/client-go/v2/oracle" @@ -69,6 +74,7 @@ var ( StreamStatus = "log status" StreamTruncate = "log truncate" StreamMetadata = "log metadata" + StreamCtl = "log ctl" skipSummaryCommandList = map[string]struct{}{ StreamStatus: {}, @@ -89,6 +95,7 @@ var StreamCommandMap = map[string]func(c context.Context, g glue.Glue, cmdName s StreamStatus: RunStreamStatus, StreamTruncate: RunStreamTruncate, StreamMetadata: RunStreamMetadata, + StreamCtl: RunStreamAdvancer, } // StreamConfig specifies the configure about backup stream @@ -110,6 +117,9 @@ type StreamConfig struct { // Spec for the command `status`. JSONOutput bool `json:"json-output" toml:"json-output"` + + // Spec for the command `advancer`. + AdvancerCfg advancercfg.Config `json:"advancer-config" toml:"advancer-config"` } func (cfg *StreamConfig) makeStorage(ctx context.Context) (storage.ExternalStorage, error) { @@ -135,7 +145,8 @@ func DefineStreamStartFlags(flags *pflag.FlagSet) { flags.String(flagStreamStartTS, "", "usually equals last full backupTS, used for backup log. Default value is current ts.\n"+ "support TSO or datetime, e.g. '400036290571534337' or '2018-05-11 01:42:23'.") - flags.String(flagStreamEndTS, "2035-1-1 00:00:00", "end ts, indicate stopping observe after endTS"+ + // 999999999999999999 means 2090-11-18 22:07:45 + flags.String(flagStreamEndTS, "999999999999999999", "end ts, indicate stopping observe after endTS"+ "support TSO or datetime") _ = flags.MarkHidden(flagStreamEndTS) flags.Int64(flagGCSafePointTTS, utils.DefaultStreamStartSafePointTTL, @@ -277,7 +288,7 @@ type streamMgr struct { func NewStreamMgr(ctx context.Context, cfg *StreamConfig, g glue.Glue, isStreamStart bool) (*streamMgr, error) { mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), - cfg.CheckRequirements, true) + cfg.CheckRequirements, true, conn.StreamVersionChecker) if err != nil { return nil, errors.Trace(err) } @@ -297,10 +308,6 @@ func NewStreamMgr(ctx context.Context, cfg *StreamConfig, g glue.Glue, isStreamS if err != nil { return nil, errors.Trace(err) } - if backend.GetS3() == nil { - return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, - "Only support s3 storage currently.") - } opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, @@ -393,33 +400,6 @@ func (s *streamMgr) buildObserveRanges(ctx context.Context) ([]kv.KeyRange, erro return rs, nil } -// checkRequirements will check some requirements before stream starts. -func (s *streamMgr) checkRequirements(ctx context.Context) (bool, error) { - type backupStream struct { - EnableStreaming bool `json:"enable"` - } - type config struct { - BackupStream backupStream `json:"log-backup"` - } - - supportBackupStream := true - hasTiKV := false - err := s.mgr.GetConfigFromTiKV(ctx, s.httpCli, func(resp *http.Response) error { - hasTiKV = true - c := &config{} - e := json.NewDecoder(resp.Body).Decode(c) - if e != nil { - return e - } - supportBackupStream = supportBackupStream && c.BackupStream.EnableStreaming - return nil - }) - if err != nil { - return false, errors.Trace(err) - } - return hasTiKV && supportBackupStream, err -} - func (s *streamMgr) backupFullSchemas(ctx context.Context, g glue.Glue) error { metaWriter := metautil.NewMetaWriter(s.bc.GetStorage(), metautil.MetaFileSize, false, metautil.MetaFile, nil) metaWriter.Update(func(m *backuppb.BackupMeta) { @@ -495,7 +475,12 @@ func RunStreamStart( } defer streamMgr.close() - supportStream, err := streamMgr.checkRequirements(ctx) + se, err := g.CreateSession(streamMgr.mgr.GetStorage()) + if err != nil { + return errors.Trace(err) + } + execCtx := se.GetSessionCtx().(sqlexec.RestrictedSQLExecutor) + supportStream, err := utils.IsLogBackupEnabled(execCtx) if err != nil { return errors.Trace(err) } @@ -519,7 +504,7 @@ func RunStreamStart( return errors.Trace(err) } - cli := stream.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) + cli := streamhelper.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) // It supports single stream log task currently. if count, err := cli.GetTaskCount(ctx); err != nil { return errors.Trace(err) @@ -546,7 +531,7 @@ func RunStreamStart( return errors.Annotate(berrors.ErrInvalidArgument, "nothing need to observe") } - ti := stream.TaskInfo{ + ti := streamhelper.TaskInfo{ PBInfo: backuppb.StreamBackupTaskInfo{ Storage: streamMgr.bc.GetStorageBackend(), StartTs: cfg.StartTS, @@ -621,7 +606,7 @@ func RunStreamStop( } defer streamMgr.close() - cli := stream.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) + cli := streamhelper.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) // to add backoff ti, err := cli.GetTask(ctx, cfg.TaskName) if err != nil { @@ -671,7 +656,7 @@ func RunStreamPause( } defer streamMgr.close() - cli := stream.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) + cli := streamhelper.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) // to add backoff ti, isPaused, err := cli.GetTaskWithPauseStatus(ctx, cfg.TaskName) if err != nil { @@ -689,7 +674,7 @@ func RunStreamPause( utils.BRServiceSafePoint{ ID: buildPauseSafePointName(ti.Info.Name), TTL: cfg.SafePointTTL, - BackupTS: globalCheckPointTS, + BackupTS: globalCheckPointTS - 1, }, ); err != nil { return errors.Trace(err) @@ -729,7 +714,7 @@ func RunStreamResume( } defer streamMgr.close() - cli := stream.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) + cli := streamhelper.NewMetaDataClient(streamMgr.mgr.GetDomain().GetEtcdClient()) // to add backoff ti, isPaused, err := cli.GetTaskWithPauseStatus(ctx, cfg.TaskName) if err != nil { @@ -774,6 +759,31 @@ func RunStreamResume( return nil } +func RunStreamAdvancer(c context.Context, g glue.Glue, cmdName string, cfg *StreamConfig) error { + ctx, cancel := context.WithCancel(c) + defer cancel() + mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), + cfg.CheckRequirements, false, conn.StreamVersionChecker) + if err != nil { + return err + } + + etcdCLI, err := dialEtcdWithCfg(ctx, cfg.Config) + if err != nil { + return err + } + env := streamhelper.CliEnv(mgr.StoreManager, etcdCLI) + advancer := streamhelper.NewCheckpointAdvancer(env) + advancer.UpdateConfig(cfg.AdvancerCfg) + daemon := streamhelper.NewAdvancerDaemon(advancer, streamhelper.OwnerManagerForLogBackup(ctx, etcdCLI)) + loop, err := daemon.Begin(ctx) + if err != nil { + return err + } + loop() + return nil +} + func checkConfigForStatus(cfg *StreamConfig) error { if len(cfg.PD) == 0 { return errors.Annotatef(berrors.ErrInvalidArgument, @@ -791,7 +801,7 @@ func makeStatusController(ctx context.Context, cfg *StreamConfig, g glue.Glue) ( if err != nil { return nil, err } - cli := stream.NewMetaDataClient(etcdCLI) + cli := streamhelper.NewMetaDataClient(etcdCLI) var printer stream.TaskPrinter if !cfg.JSONOutput { printer = stream.PrintTaskByTable(console) @@ -799,7 +809,7 @@ func makeStatusController(ctx context.Context, cfg *StreamConfig, g glue.Glue) ( printer = stream.PrintTaskWithJSON(console) } mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), - cfg.CheckRequirements, false) + cfg.CheckRequirements, false, conn.StreamVersionChecker) if err != nil { return nil, err } @@ -839,7 +849,6 @@ func RunStreamStatus( func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *StreamConfig) error { console := glue.GetConsole(g) em := color.New(color.Bold).SprintFunc() - done := color.New(color.FgGreen).SprintFunc() warn := color.New(color.Bold, color.FgHiRed).SprintFunc() formatTS := func(ts uint64) string { return oracle.GetTimeFromTS(ts).Format("2006-01-02 15:04:05.0000") @@ -873,7 +882,7 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre return err } } - + readMetaDone := console.ShowTask("Reading Metadata... ", glue.WithTimeCost()) metas := restore.StreamMetadataSet{ BeforeDoWriteBack: func(path string, last, current *backuppb.Metadata) (skip bool) { log.Info("Updating metadata.", zap.String("file", path), @@ -885,20 +894,24 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre if err := metas.LoadFrom(ctx, storage); err != nil { return err } + readMetaDone() + + var ( + fileCount uint64 = 0 + kvCount int64 = 0 + totalSize uint64 = 0 + shiftUntilTS = metas.CalculateShiftTS(cfg.Until) + ) - fileCount := 0 - minTS := oracle.GoTimeToTS(time.Now()) - shiftUntilTS := ShiftTS(cfg.Until) metas.IterateFilesFullyBefore(shiftUntilTS, func(d *backuppb.DataFileInfo) (shouldBreak bool) { - if d.MaxTs < minTS { - minTS = d.MaxTs - } fileCount++ + totalSize += d.Length + kvCount += d.NumberOfEntries return }) console.Printf("We are going to remove %s files, until %s.\n", em(fileCount), - em(formatTS(minTS)), + em(formatTS(cfg.Until)), ) if !cfg.SkipPrompt && !console.PromptBool(warn("Sure? ")) { return nil @@ -906,23 +919,37 @@ func RunStreamTruncate(c context.Context, g glue.Glue, cmdName string, cfg *Stre removed := metas.RemoveDataBefore(shiftUntilTS) - console.Print("Removing metadata... ") + // remove metadata + removeMetaDone := console.ShowTask("Removing metadata... ", glue.WithTimeCost()) if !cfg.DryRun { if err := metas.DoWriteBack(ctx, storage); err != nil { return err } } - console.Println(done("DONE")) - console.Print("Clearing data files... ") + removeMetaDone() + + // remove log + clearDataFileDone := console.ShowTask( + "Clearing data files... ", glue.WithTimeCost(), + glue.WithConstExtraField("kv-count", kvCount), + glue.WithConstExtraField("kv-size", fmt.Sprintf("%d(%s)", totalSize, units.HumanSize(float64(totalSize)))), + ) + worker := utils.NewWorkerPool(128, "delete files") + wg := new(sync.WaitGroup) for _, f := range removed { if !cfg.DryRun { - if err := storage.DeleteFile(ctx, f.Path); err != nil { - log.Warn("File not deleted.", zap.String("path", f.Path), logutil.ShortError(err)) - console.Print("\n"+em(f.Path), "not deleted, you may clear it manually:", warn(err)) - } + wg.Add(1) + worker.Apply(func() { + defer wg.Done() + if err := storage.DeleteFile(ctx, f.Path); err != nil { + log.Warn("File not deleted.", zap.String("path", f.Path), logutil.ShortError(err)) + console.Print("\n"+em(f.Path), "not deleted, you may clear it manually:", warn(err)) + } + }) } } - console.Println(done("DONE")) + wg.Wait() + clearDataFileDone() return nil } @@ -933,16 +960,6 @@ func RunStreamRestore( cmdName string, cfg *RestoreConfig, ) (err error) { - startTime := time.Now() - defer func() { - dur := time.Since(startTime) - if err != nil { - summary.Log(cmdName+" failed summary", zap.Error(err)) - } else { - summary.Log(cmdName+" success summary", zap.Duration("total-take", dur), - zap.Uint64("restore-from", cfg.StartTS), zap.Uint64("restore-to", cfg.RestoreTS)) - } - }() ctx, cancelFn := context.WithCancel(c) defer cancelFn() @@ -981,6 +998,9 @@ func RunStreamRestore( // restore full snapshot. if len(cfg.FullBackupStorage) > 0 { + if err := checkPiTRRequirements(ctx, g, cfg); err != nil { + return errors.Trace(err) + } logStorage := cfg.Config.Storage cfg.Config.Storage = cfg.FullBackupStorage // TiFlash replica is restored to down-stream on 'pitr' currently. @@ -991,6 +1011,7 @@ func RunStreamRestore( cfg.Config.Storage = logStorage } // restore log. + cfg.adjustRestoreConfigForStreamRestore() if err := restoreStream(ctx, g, cfg, logMinTS, logMaxTS); err != nil { return errors.Trace(err) } @@ -1003,7 +1024,23 @@ func restoreStream( g glue.Glue, cfg *RestoreConfig, logMinTS, logMaxTS uint64, -) error { +) (err error) { + var ( + totalKVCount uint64 + totalSize uint64 + mu sync.Mutex + startTime = time.Now() + ) + defer func() { + if err != nil { + summary.Log("restore log failed summary", zap.Error(err)) + } else { + summary.Log("restore log success summary", zap.Duration("total-take", time.Since(startTime)), + zap.Uint64("restore-from", cfg.StartTS), zap.Uint64("restore-to", cfg.RestoreTS), + zap.Uint64("total-kv-count", totalKVCount), zap.Uint64("total-size", totalSize)) + } + }() + ctx, cancelFn := context.WithCancel(c) defer cancelFn() @@ -1017,7 +1054,7 @@ func restoreStream( } mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), - cfg.CheckRequirements, true) + cfg.CheckRequirements, true, conn.StreamVersionChecker) if err != nil { return errors.Trace(err) } @@ -1033,7 +1070,6 @@ func restoreStream( if err != nil { return errors.Trace(err) } - client.SetRestoreRangeTS(cfg.StartTS, cfg.RestoreTS, ShiftTS(cfg.StartTS)) client.SetCurrentTS(currentTS) restoreSchedulers, err := restorePreWork(ctx, client, mgr, false) @@ -1054,6 +1090,12 @@ func restoreStream( return nil } + shiftStartTS, exist := restore.CalculateShiftTS(metas, cfg.StartTS, cfg.RestoreTS) + if !exist { + shiftStartTS = cfg.StartTS + } + client.SetRestoreRangeTS(cfg.StartTS, cfg.RestoreTS, shiftStartTS) + // read data file by given ts. dmlFiles, ddlFiles, err := client.ReadStreamDataFiles(ctx, metas) if err != nil { @@ -1072,9 +1114,16 @@ func restoreStream( return errors.Trace(err) } + updateStats := func(kvCount uint64, size uint64) { + mu.Lock() + defer mu.Unlock() + totalKVCount += kvCount + totalSize += size + } pm := g.StartProgress(ctx, "Restore Meta Files", int64(len(ddlFiles)), !cfg.LogProgress) if err = withProgress(pm, func(p glue.Progress) error { - return client.RestoreMetaKVFiles(ctx, ddlFiles, schemasReplace, p.Inc) + client.RunGCRowsLoader(ctx) + return client.RestoreMetaKVFiles(ctx, ddlFiles, schemasReplace, updateStats, p.Inc) }); err != nil { return errors.Annotate(err, "failed to restore meta files") } @@ -1087,12 +1136,8 @@ func restoreStream( updateRewriteRules(rewriteRules, schemasReplace) pd := g.StartProgress(ctx, "Restore KV Files", int64(len(dmlFiles)), !cfg.LogProgress) - if cfg.Concurrency > defaultRestoreStreamConcurrency { - log.Info("set restore kv files concurrency", zap.Int("concurrency", defaultRestoreStreamConcurrency)) - client.SetConcurrency(defaultRestoreConcurrency) - } err = withProgress(pd, func(p glue.Progress) error { - return client.RestoreKVFiles(ctx, rewriteRules, dmlFiles, p.Inc) + return client.RestoreKVFiles(ctx, rewriteRules, dmlFiles, updateStats, p.Inc) }) if err != nil { return errors.Annotate(err, "failed to restore kv files") @@ -1105,6 +1150,11 @@ func restoreStream( if err = client.SaveSchemas(ctx, schemasReplace, logMinTS, cfg.RestoreTS); err != nil { return errors.Trace(err) } + + if err = client.InsertGCRows(ctx); err != nil { + return errors.Annotate(err, "failed to insert rows into gc_delete_range") + } + return nil } @@ -1215,7 +1265,7 @@ func getLogRange( logMinTS := mathutil.Max(logStartTS, truncateTS) // get max global resolved ts from metas. - logMaxTS, err := getGlobalResolvedTS(ctx, s) + logMaxTS, err := getGlobalCheckpointFromStorage(ctx, s) if err != nil { return 0, 0, errors.Trace(err) } @@ -1224,6 +1274,25 @@ func getLogRange( return logMinTS, logMaxTS, nil } +func getGlobalCheckpointFromStorage(ctx context.Context, s storage.ExternalStorage) (uint64, error) { + var globalCheckPointTS uint64 = 0 + opt := storage.WalkOption{SubDir: stream.GetStreamBackupGlobalCheckpointPrefix()} + err := s.WalkDir(ctx, &opt, func(path string, size int64) error { + if !strings.HasSuffix(path, ".ts") { + return nil + } + + buff, err := s.ReadFile(ctx, path) + if err != nil { + return errors.Trace(err) + } + ts := binary.LittleEndian.Uint64(buff) + globalCheckPointTS = mathutil.Max(ts, globalCheckPointTS) + return nil + }) + return globalCheckPointTS, errors.Trace(err) +} + // getFullBackupTS gets the snapshot-ts of full bakcup func getFullBackupTS( ctx context.Context, @@ -1251,38 +1320,31 @@ func getGlobalResolvedTS( ctx context.Context, s storage.ExternalStorage, ) (uint64, error) { - storeMap := make(map[int64]uint64) - - opt := &storage.WalkOption{SubDir: restore.GetStreamBackupMetaPrefix()} - err := s.WalkDir(ctx, opt, func(path string, size int64) error { - if strings.Contains(path, restore.GetStreamBackupMetaPrefix()) { - m := &backuppb.Metadata{} - b, err := s.ReadFile(ctx, path) - if err != nil { - return errors.Trace(err) - } - err = m.Unmarshal(b) - if err != nil { - return errors.Trace(err) - } - - if resolveTS, exist := storeMap[m.StoreId]; !exist || resolveTS < m.ResolvedTs { - storeMap[m.StoreId] = m.ResolvedTs - } + storeMap := struct { + sync.Mutex + resolvedTSMap map[int64]uint64 + }{} + storeMap.resolvedTSMap = make(map[int64]uint64) + err := stream.FastUnmarshalMetaData(ctx, s, func(path string, m *backuppb.Metadata) error { + storeMap.Lock() + if resolveTS, exist := storeMap.resolvedTSMap[m.StoreId]; !exist || resolveTS < m.ResolvedTs { + storeMap.resolvedTSMap[m.StoreId] = m.ResolvedTs } + storeMap.Unlock() return nil }) if err != nil { return 0, errors.Trace(err) } - var globalCheckpointTS uint64 = 0 - for _, resolveTS := range storeMap { - if resolveTS < globalCheckpointTS || globalCheckpointTS == 0 { + // If V3 global-checkpoint advance, the maximum value in storeMap.resolvedTSMap as global-checkpoint-ts. + // If v2 global-checkpoint advance, it need the minimal value in storeMap.resolvedTSMap as global-checkpoint-ts. + // Because each of store maintains own checkpoint-ts only. + for _, resolveTS := range storeMap.resolvedTSMap { + if globalCheckpointTS < resolveTS { globalCheckpointTS = resolveTS } } - return globalCheckpointTS, nil } @@ -1465,3 +1527,25 @@ func ShiftTS(startTS uint64) uint64 { func buildPauseSafePointName(taskName string) string { return fmt.Sprintf("%s_pause_safepoint", taskName) } + +func checkPiTRRequirements(ctx context.Context, g glue.Glue, cfg *RestoreConfig) error { + mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), + cfg.CheckRequirements, true, conn.StreamVersionChecker) + if err != nil { + return errors.Trace(err) + } + defer mgr.Close() + + userDBs := restore.GetExistedUserDBs(mgr.GetDomain()) + if len(userDBs) > 0 { + userDBNames := make([]string, 0, len(userDBs)) + for _, db := range userDBs { + userDBNames = append(userDBNames, db.Name.O) + } + return errors.Annotatef(berrors.ErrDatabasesAlreadyExisted, + "databases %s existed in restored cluster, please drop them before execute PiTR", + strings.Join(userDBNames, ",")) + } + + return nil +} diff --git a/br/pkg/task/stream_test.go b/br/pkg/task/stream_test.go index 3313351132585..d129eeaf5b2c2 100644 --- a/br/pkg/task/stream_test.go +++ b/br/pkg/task/stream_test.go @@ -16,135 +16,19 @@ package task import ( "context" + "encoding/binary" "fmt" - "net/http" - "net/http/httptest" "path/filepath" - "strings" "testing" "github.com/pingcap/errors" backuppb "github.com/pingcap/kvproto/pkg/brpb" - "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/br/pkg/conn" - "github.com/pingcap/tidb/br/pkg/pdutil" - "github.com/pingcap/tidb/br/pkg/restore" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/stream" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" - pd "github.com/tikv/pd/client" ) -func newMockStreamMgr(pdCli pd.Client, httpCli *http.Client) *streamMgr { - pdController := &pdutil.PdController{} - pdController.SetPDClient(pdCli) - mgr := &conn.Mgr{PdController: pdController} - return &streamMgr{mgr: mgr, httpCli: httpCli} -} - -func TestStreamStartChecks(t *testing.T) { - cases := []struct { - stores []*metapb.Store - content []string - supportStream bool - }{ - { - stores: []*metapb.Store{ - { - Id: 1, - State: metapb.StoreState_Up, - Labels: []*metapb.StoreLabel{ - { - Key: "engine", - Value: "tiflash", - }, - }, - }, - }, - content: []string{""}, - // no tikv detected in this case, so support is false. - supportStream: false, - }, - { - stores: []*metapb.Store{ - { - Id: 1, - State: metapb.StoreState_Up, - Labels: []*metapb.StoreLabel{ - { - Key: "engine", - Value: "tikv", - }, - }, - }, - }, - content: []string{ - "{\"log-level\": \"debug\", \"log-backup\": {\"enable\": true}}", - }, - // one tikv detected in this case and `enable-streaming` is true. - supportStream: true, - }, - { - stores: []*metapb.Store{ - { - Id: 1, - State: metapb.StoreState_Up, - Labels: []*metapb.StoreLabel{ - { - Key: "engine", - Value: "tikv", - }, - }, - }, - { - Id: 2, - State: metapb.StoreState_Up, - Labels: []*metapb.StoreLabel{ - { - Key: "engine", - Value: "tikv", - }, - }, - }, - }, - content: []string{ - "{\"log-level\": \"debug\", \"log-backup\": {\"enable\": true}}", - "{\"log-level\": \"debug\", \"log-backup\": {\"enable\": false}}", - }, - // two tikv detected in this case and one of them's `enable-streaming` is false. - supportStream: false, - }, - } - - ctx := context.Background() - for _, ca := range cases { - pdCli := utils.FakePDClient{Stores: ca.stores} - require.Equal(t, len(ca.content), len(ca.stores)) - count := 0 - mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch strings.TrimSpace(r.URL.Path) { - case "/config": - _, _ = fmt.Fprint(w, ca.content[count]) - default: - http.NotFoundHandler().ServeHTTP(w, r) - } - count++ - })) - - for _, s := range ca.stores { - s.StatusAddress = mockServer.URL - } - - httpCli := mockServer.Client() - sMgr := newMockStreamMgr(pdCli, httpCli) - support, err := sMgr.checkRequirements(ctx) - require.NoError(t, err) - require.Equal(t, ca.supportStream, support) - mockServer.Close() - } -} - func TestShiftTS(t *testing.T) { var startTS uint64 = 433155751280640000 shiftTS := ShiftTS(startTS) @@ -229,7 +113,7 @@ type fakeResolvedInfo struct { } func fakeMetaFiles(ctx context.Context, tempDir string, infos []fakeResolvedInfo) error { - backupMetaDir := filepath.Join(tempDir, restore.GetStreamBackupMetaPrefix()) + backupMetaDir := filepath.Join(tempDir, stream.GetStreamBackupMetaPrefix()) s, err := storage.NewLocalStorage(backupMetaDir) if err != nil { return errors.Trace(err) @@ -277,7 +161,7 @@ func TestGetGlobalResolvedTS(t *testing.T) { require.Nil(t, err) globalResolvedTS, err := getGlobalResolvedTS(ctx, s) require.Nil(t, err) - require.Equal(t, uint64(100), globalResolvedTS) + require.Equal(t, uint64(101), globalResolvedTS) } func TestGetGlobalResolvedTS2(t *testing.T) { @@ -309,5 +193,69 @@ func TestGetGlobalResolvedTS2(t *testing.T) { require.Nil(t, err) globalResolvedTS, err := getGlobalResolvedTS(ctx, s) require.Nil(t, err) - require.Equal(t, uint64(98), globalResolvedTS) + require.Equal(t, uint64(99), globalResolvedTS) +} + +func fakeCheckpointFiles( + ctx context.Context, + tmpDir string, + infos []fakeGlobalCheckPoint, +) error { + cpDir := filepath.Join(tmpDir, stream.GetStreamBackupGlobalCheckpointPrefix()) + s, err := storage.NewLocalStorage(cpDir) + if err != nil { + return errors.Trace(err) + } + + // create normal files belong to global-checkpoint files + for _, info := range infos { + filename := fmt.Sprintf("%v.ts", info.storeID) + buff := make([]byte, 8) + binary.LittleEndian.PutUint64(buff, info.global_checkpoint) + if _, err := s.Create(ctx, filename); err != nil { + return errors.Trace(err) + } + if err := s.WriteFile(ctx, filename, buff); err != nil { + return errors.Trace(err) + } + } + + // create a file not belonging to global-checkpoint-ts files + filename := fmt.Sprintf("%v.tst", 1) + err = s.WriteFile(ctx, filename, []byte("ping")) + return errors.AddStack(err) +} + +type fakeGlobalCheckPoint struct { + storeID int64 + global_checkpoint uint64 +} + +func TestGetGlobalCheckpointFromStorage(t *testing.T) { + ctx := context.Background() + tmpdir := t.TempDir() + s, err := storage.NewLocalStorage(tmpdir) + require.Nil(t, err) + + infos := []fakeGlobalCheckPoint{ + { + storeID: 1, + global_checkpoint: 98, + }, + { + storeID: 2, + global_checkpoint: 90, + }, + { + storeID: 2, + global_checkpoint: 99, + }, + } + + err = fakeCheckpointFiles(ctx, tmpdir, infos) + require.Nil(t, err) + + ts, err := getGlobalCheckpointFromStorage(ctx, s) + require.Nil(t, err) + require.Equal(t, ts, uint64(99)) } diff --git a/br/pkg/utils/BUILD.bazel b/br/pkg/utils/BUILD.bazel index a000479c29696..631e0e7603ab6 100644 --- a/br/pkg/utils/BUILD.bazel +++ b/br/pkg/utils/BUILD.bazel @@ -11,24 +11,31 @@ go_library( "json.go", "key.go", "math.go", + "misc.go", "permission.go", "pprof.go", "progress.go", "retry.go", "safe_point.go", "schema.go", + "store_manager.go", "worker.go", ], importpath = "github.com/pingcap/tidb/br/pkg/utils", visibility = ["//visibility:public"], deps = [ "//br/pkg/errors", + "//br/pkg/logutil", "//br/pkg/metautil", "//errno", + "//kv", "//parser/model", "//parser/mysql", "//parser/terror", + "//parser/types", + "//sessionctx", "//util", + "//util/sqlexec", "@com_github_cheggaaa_pb_v3//:pb", "@com_github_google_uuid//:uuid", "@com_github_pingcap_errors//:errors", @@ -38,7 +45,11 @@ go_library( "@com_github_pingcap_log//:log", "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_pd_client//:client", + "@org_golang_google_grpc//:grpc", + "@org_golang_google_grpc//backoff", "@org_golang_google_grpc//codes", + "@org_golang_google_grpc//credentials", + "@org_golang_google_grpc//keepalive", "@org_golang_google_grpc//status", "@org_golang_x_net//http/httpproxy", "@org_golang_x_sync//errgroup", @@ -52,11 +63,13 @@ go_test( name = "utils_test", srcs = [ "backoff_test.go", + "db_test.go", "env_test.go", "json_test.go", "key_test.go", "main_test.go", "math_test.go", + "misc_test.go", "progress_test.go", "safe_point_test.go", "schema_test.go", @@ -66,11 +79,18 @@ go_test( "//br/pkg/errors", "//br/pkg/metautil", "//br/pkg/storage", + "//parser/ast", "//parser/model", + "//parser/mysql", + "//parser/types", "//statistics/handle", "//tablecodec", "//testkit/testsetup", + "//types", + "//util/chunk", + "//util/sqlexec", "@com_github_golang_protobuf//proto", + "@com_github_pingcap_errors//:errors", "@com_github_pingcap_kvproto//pkg/brpb", "@com_github_pingcap_kvproto//pkg/encryptionpb", "@com_github_stretchr_testify//require", diff --git a/br/pkg/utils/db.go b/br/pkg/utils/db.go index 346aca6157dbb..d689d7101ed64 100644 --- a/br/pkg/utils/db.go +++ b/br/pkg/utils/db.go @@ -5,6 +5,13 @@ package utils import ( "context" "database/sql" + "strings" + + "github.com/pingcap/log" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" ) var ( @@ -30,3 +37,55 @@ type DBExecutor interface { StmtExecutor BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) } + +// CheckLogBackupEnabled checks if LogBackup is enabled in cluster. +// this mainly used in three places. +// 1. GC worker resolve locks to scan more locks after safepoint. (every minute) +// 2. Add index skipping use lightning.(every add index ddl) +// 3. Telemetry of log backup feature usage (every 6 hours). +// NOTE: this result shouldn't be cached by caller. because it may change every time in one cluster. +func CheckLogBackupEnabled(ctx sessionctx.Context) bool { + executor, ok := ctx.(sqlexec.RestrictedSQLExecutor) + if !ok { + // shouldn't happen + log.Error("[backup] unable to translate executor from sessionctx") + return false + } + enabled, err := IsLogBackupEnabled(executor) + if err != nil { + // if it failed by any reason. we can simply return true this time. + // for GC worker it will scan more locks in one tick. + // for Add index it will skip using lightning this time. + // for Telemetry it will get a false positive usage count. + log.Warn("[backup] check log backup config failed, ignore it", zap.Error(err)) + return true + } + return enabled +} + +// IsLogBackupEnabled is used for br to check whether tikv has enabled log backup. +// we use `sqlexec.RestrictedSQLExecutor` as parameter because it's easy to mock. +// it should return error. +func IsLogBackupEnabled(ctx sqlexec.RestrictedSQLExecutor) (bool, error) { + valStr := "show config where name = 'log-backup.enable'" + internalCtx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBR) + rows, fields, errSQL := ctx.ExecRestrictedSQL(internalCtx, nil, valStr) + if errSQL != nil { + return false, errSQL + } + if len(rows) == 0 { + // no rows mean not support log backup. + return false, nil + } + for _, row := range rows { + d := row.GetDatum(3, &fields[3].Column.FieldType) + value, errField := d.ToString() + if errField != nil { + return false, errField + } + if strings.ToLower(value) == "false" { + return false, nil + } + } + return true, nil +} diff --git a/br/pkg/utils/db_test.go b/br/pkg/utils/db_test.go new file mode 100644 index 0000000000000..a28799932f02a --- /dev/null +++ b/br/pkg/utils/db_test.go @@ -0,0 +1,109 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package utils_test + +import ( + "context" + "testing" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" + "github.com/stretchr/testify/require" +) + +type mockRestrictedSQLExecutor struct { + rows []chunk.Row + fields []*ast.ResultField + errHappen bool +} + +func (m *mockRestrictedSQLExecutor) ParseWithParams(ctx context.Context, sql string, args ...interface{}) (ast.StmtNode, error) { + return nil, nil +} + +func (m *mockRestrictedSQLExecutor) ExecRestrictedStmt(ctx context.Context, stmt ast.StmtNode, opts ...sqlexec.OptionFuncAlias) ([]chunk.Row, []*ast.ResultField, error) { + return nil, nil, nil +} + +func (m *mockRestrictedSQLExecutor) ExecRestrictedSQL(ctx context.Context, opts []sqlexec.OptionFuncAlias, sql string, args ...interface{}) ([]chunk.Row, []*ast.ResultField, error) { + if m.errHappen { + return nil, nil, errors.New("injected error") + } + return m.rows, m.fields, nil +} + +func TestIsLogBackupEnabled(t *testing.T) { + // config format: + // MySQL [(none)]> show config where name="log-backup.enable"; + // +------+-----------------+-------------------+-------+ + // | Type | Instance | Name | Value | + // +------+-----------------+-------------------+-------+ + // | tikv | 127.0.0.1:20161 | log-backup.enable | false | + // | tikv | 127.0.0.1:20162 | log-backup.enable | false | + // | tikv | 127.0.0.1:20160 | log-backup.enable | false | + // +------+-----------------+-------------------+-------+ + fields := make([]*ast.ResultField, 4) + tps := []*types.FieldType{ + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + types.NewFieldType(mysql.TypeString), + } + for i := 0; i < len(tps); i++ { + rf := new(ast.ResultField) + rf.Column = new(model.ColumnInfo) + rf.Column.FieldType = *tps[i] + fields[i] = rf + } + rows := make([]chunk.Row, 0, 1) + + // case 1: non of tikvs enabled log-backup expected false + // tikv | 127.0.0.1:20161 | log-backup.enable | false | + row := chunk.MutRowFromValues("tikv", " 127.0.0.1:20161", "log-backup.enable", "false").ToRow() + rows = append(rows, row) + s := &mockRestrictedSQLExecutor{rows: rows, fields: fields} + enabled, err := utils.IsLogBackupEnabled(s) + require.NoError(t, err) + require.False(t, enabled) + + // case 2: one of tikvs enabled log-backup expected false + // tikv | 127.0.0.1:20161 | log-backup.enable | false | + // tikv | 127.0.0.1:20162 | log-backup.enable | true | + rows = nil + row = chunk.MutRowFromValues("tikv", " 127.0.0.1:20161", "log-backup.enable", "false").ToRow() + rows = append(rows, row) + row = chunk.MutRowFromValues("tikv", " 127.0.0.1:20162", "log-backup.enable", "true").ToRow() + rows = append(rows, row) + s = &mockRestrictedSQLExecutor{rows: rows, fields: fields} + enabled, err = utils.IsLogBackupEnabled(s) + require.NoError(t, err) + require.False(t, enabled) + + // case 3: all of tikvs enabled log-backup expected true + // tikv | 127.0.0.1:20161 | log-backup.enable | true | + // tikv | 127.0.0.1:20162 | log-backup.enable | true | + // tikv | 127.0.0.1:20163 | log-backup.enable | true | + rows = nil + row = chunk.MutRowFromValues("tikv", " 127.0.0.1:20161", "log-backup.enable", "true").ToRow() + rows = append(rows, row) + row = chunk.MutRowFromValues("tikv", " 127.0.0.1:20162", "log-backup.enable", "true").ToRow() + rows = append(rows, row) + row = chunk.MutRowFromValues("tikv", " 127.0.0.1:20163", "log-backup.enable", "true").ToRow() + rows = append(rows, row) + s = &mockRestrictedSQLExecutor{rows: rows, fields: fields} + enabled, err = utils.IsLogBackupEnabled(s) + require.NoError(t, err) + require.True(t, enabled) + + // case 4: met error and expected false. + s = &mockRestrictedSQLExecutor{errHappen: true} + enabled, err = utils.IsLogBackupEnabled(s) + require.Error(t, err) + require.False(t, enabled) +} diff --git a/br/pkg/utils/misc.go b/br/pkg/utils/misc.go new file mode 100644 index 0000000000000..43efb4755a26b --- /dev/null +++ b/br/pkg/utils/misc.go @@ -0,0 +1,77 @@ +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/types" +) + +// IsTypeCompatible checks whether type target is compatible with type src +// they're compatible if +// - same null/not null and unsigned flag(maybe we can allow src not null flag, target null flag later) +// - have same evaluation type +// - target's flen and decimal should be bigger or equals to src's +// - elements in target is superset of elements in src if they're enum or set type +// - same charset and collate if they're string types +func IsTypeCompatible(src types.FieldType, target types.FieldType) bool { + if mysql.HasNotNullFlag(src.GetFlag()) != mysql.HasNotNullFlag(target.GetFlag()) { + return false + } + if mysql.HasUnsignedFlag(src.GetFlag()) != mysql.HasUnsignedFlag(target.GetFlag()) { + return false + } + srcEType, dstEType := src.EvalType(), target.EvalType() + if srcEType != dstEType { + return false + } + + getFLenAndDecimal := func(tp types.FieldType) (int, int) { + // ref FieldType.CompactStr + defaultFlen, defaultDecimal := mysql.GetDefaultFieldLengthAndDecimal(tp.GetType()) + flen, decimal := tp.GetFlen(), tp.GetDecimal() + if flen == types.UnspecifiedLength { + flen = defaultFlen + } + if decimal == types.UnspecifiedLength { + decimal = defaultDecimal + } + return flen, decimal + } + srcFLen, srcDecimal := getFLenAndDecimal(src) + targetFLen, targetDecimal := getFLenAndDecimal(target) + if srcFLen > targetFLen || srcDecimal > targetDecimal { + return false + } + + // if they're not enum or set type, elems will be empty + // and if they're not string types, charset and collate will be empty, + // so we check them anyway. + srcElems := src.GetElems() + targetElems := target.GetElems() + if len(srcElems) > len(targetElems) { + return false + } + targetElemSet := make(map[string]struct{}) + for _, item := range targetElems { + targetElemSet[item] = struct{}{} + } + for _, item := range srcElems { + if _, ok := targetElemSet[item]; !ok { + return false + } + } + return src.GetCharset() == target.GetCharset() && + src.GetCollate() == target.GetCollate() +} diff --git a/br/pkg/utils/misc_test.go b/br/pkg/utils/misc_test.go new file mode 100644 index 0000000000000..6e6afd0eae074 --- /dev/null +++ b/br/pkg/utils/misc_test.go @@ -0,0 +1,138 @@ +// 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package utils + +import ( + "testing" + + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/types" + "github.com/stretchr/testify/require" +) + +func TestIsTypeCompatible(t *testing.T) { + { + // different unsigned flag + src := types.NewFieldType(mysql.TypeInt24) + src.AddFlag(mysql.UnsignedFlag) + target := types.NewFieldType(mysql.TypeInt24) + require.False(t, IsTypeCompatible(*src, *target)) + + src.DelFlag(mysql.UnsignedFlag) + target.AddFlag(mysql.UnsignedFlag) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // different not null flag + src := types.NewFieldType(mysql.TypeInt24) + src.AddFlag(mysql.NotNullFlag) + target := types.NewFieldType(mysql.TypeInt24) + require.False(t, IsTypeCompatible(*src, *target)) + + src.DelFlag(mysql.NotNullFlag) + target.AddFlag(mysql.NotNullFlag) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // different evaluation type + src := types.NewFieldType(mysql.TypeInt24) + target := types.NewFieldType(mysql.TypeFloat) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // src flen > target + src := types.NewFieldType(mysql.TypeInt24) + target := types.NewFieldType(mysql.TypeTiny) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // src flen > target + src := types.NewFieldType(mysql.TypeVarchar) + src.SetFlen(100) + target := types.NewFieldType(mysql.TypeVarchar) + target.SetFlag(99) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // src decimal > target + src := types.NewFieldType(mysql.TypeNewDecimal) + src.SetDecimal(5) + target := types.NewFieldType(mysql.TypeNewDecimal) + target.SetDecimal(4) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // src has more elements + src := types.NewFieldType(mysql.TypeEnum) + src.SetElems([]string{"a", "b"}) + target := types.NewFieldType(mysql.TypeEnum) + target.SetElems([]string{"a"}) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // incompatible enum + src := types.NewFieldType(mysql.TypeEnum) + src.SetElems([]string{"a", "b"}) + target := types.NewFieldType(mysql.TypeEnum) + target.SetElems([]string{"a", "c", "d"}) + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // incompatible charset + src := types.NewFieldType(mysql.TypeVarchar) + src.SetCharset("gbk") + target := types.NewFieldType(mysql.TypeVarchar) + target.SetCharset("utf8") + require.False(t, IsTypeCompatible(*src, *target)) + } + { + // incompatible collation + src := types.NewFieldType(mysql.TypeVarchar) + src.SetCharset("utf8") + src.SetCollate("utf8_bin") + target := types.NewFieldType(mysql.TypeVarchar) + target.SetCharset("utf8") + target.SetCollate("utf8_general_ci") + require.False(t, IsTypeCompatible(*src, *target)) + } + { + src := types.NewFieldType(mysql.TypeVarchar) + src.SetFlen(10) + src.SetCharset("utf8") + src.SetCollate("utf8_bin") + target := types.NewFieldType(mysql.TypeVarchar) + target.SetFlen(11) + target.SetCharset("utf8") + target.SetCollate("utf8_bin") + require.True(t, IsTypeCompatible(*src, *target)) + } + { + src := types.NewFieldType(mysql.TypeBlob) + target := types.NewFieldType(mysql.TypeLongBlob) + require.True(t, IsTypeCompatible(*src, *target)) + } + { + src := types.NewFieldType(mysql.TypeEnum) + src.SetElems([]string{"a", "b"}) + target := types.NewFieldType(mysql.TypeEnum) + target.SetElems([]string{"a", "b", "c"}) + require.True(t, IsTypeCompatible(*src, *target)) + } + { + src := types.NewFieldType(mysql.TypeTimestamp) + target := types.NewFieldType(mysql.TypeTimestamp) + target.SetDecimal(3) + require.True(t, IsTypeCompatible(*src, *target)) + } +} diff --git a/br/pkg/utils/sensitive.go b/br/pkg/utils/sensitive.go new file mode 100644 index 0000000000000..fcc31ee30b78d --- /dev/null +++ b/br/pkg/utils/sensitive.go @@ -0,0 +1,23 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package utils + +import ( + "regexp" +) + +var ( + passwordPatterns = `(password[\s]*=[\s]*(\\")?)(.*?)((\\")?\\n)` + + passwordRegexp *regexp.Regexp +) + +func init() { + passwordRegexp = regexp.MustCompile(passwordPatterns) +} + +// HideSensitive replace password with ******. +func HideSensitive(input string) string { + output := passwordRegexp.ReplaceAllString(input, "$1******$4") + return output +} diff --git a/br/pkg/utils/sensitive_test.go b/br/pkg/utils/sensitive_test.go new file mode 100644 index 0000000000000..a14ce0619eb85 --- /dev/null +++ b/br/pkg/utils/sensitive_test.go @@ -0,0 +1,41 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package utils + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestHideSensitive(t *testing.T) { + strs := []struct { + old string + new string + }{ + { + `host = "127.0.0.1"\n user = "root"\n password = "/Q7B9DizNLLTTfiZHv9WoEAKamfpIUs="\n port = 3306\n`, + `host = "127.0.0.1"\n user = "root"\n password = ******\n port = 3306\n`, + }, + { + `host = "127.0.0.1"\n user = "root"\n password = ""\n port = 3306\n`, + `host = "127.0.0.1"\n user = "root"\n password = ******\n port = 3306\n`, + }, + { + `host = "127.0.0.1"\n user = "root"\n password= "/Q7B9DizNLLTTfiZHv9WoEAKamfpIUs="\n port = 3306\n`, + `host = "127.0.0.1"\n user = "root"\n password= ******\n port = 3306\n`, + }, + { + `host = "127.0.0.1"\n user = "root"\n password =""\n port = 3306\n`, + `host = "127.0.0.1"\n user = "root"\n password =******\n port = 3306\n`, + }, + { + `host = "127.0.0.1"\n user = "root"\n password=""\n port = 3306\n`, + `host = "127.0.0.1"\n user = "root"\n password=******\n port = 3306\n`, + }, + } + for i, str := range strs { + t.Logf("case #%d\n", i) + require.Equal(t, str.new, HideSensitive(str.old)) + } +} diff --git a/br/pkg/utils/store_manager.go b/br/pkg/utils/store_manager.go new file mode 100644 index 0000000000000..db7381842e6b1 --- /dev/null +++ b/br/pkg/utils/store_manager.go @@ -0,0 +1,244 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package utils + +import ( + "context" + "crypto/tls" + "os" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + 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" + pd "github.com/tikv/pd/client" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/keepalive" +) + +const ( + dialTimeout = 30 * time.Second + resetRetryTimes = 3 +) + +// Pool is a lazy pool of gRPC channels. +// When `Get` called, it lazily allocates new connection if connection not full. +// If it's full, then it will return allocated channels round-robin. +type Pool struct { + mu sync.Mutex + + conns []*grpc.ClientConn + next int + cap int + newConn func(ctx context.Context) (*grpc.ClientConn, error) +} + +func (p *Pool) takeConns() (conns []*grpc.ClientConn) { + p.mu.Lock() + defer p.mu.Unlock() + p.conns, conns = nil, p.conns + p.next = 0 + return conns +} + +// Close closes the conn pool. +func (p *Pool) Close() { + for _, c := range p.takeConns() { + if err := c.Close(); err != nil { + log.Warn("failed to close clientConn", zap.String("target", c.Target()), zap.Error(err)) + } + } +} + +// Get tries to get an existing connection from the pool, or make a new one if the pool not full. +func (p *Pool) Get(ctx context.Context) (*grpc.ClientConn, error) { + p.mu.Lock() + defer p.mu.Unlock() + if len(p.conns) < p.cap { + c, err := p.newConn(ctx) + if err != nil { + return nil, err + } + p.conns = append(p.conns, c) + return c, nil + } + + conn := p.conns[p.next] + p.next = (p.next + 1) % p.cap + return conn, nil +} + +// NewConnPool creates a new Pool by the specified conn factory function and capacity. +func NewConnPool(capacity int, newConn func(ctx context.Context) (*grpc.ClientConn, error)) *Pool { + return &Pool{ + cap: capacity, + conns: make([]*grpc.ClientConn, 0, capacity), + newConn: newConn, + + mu: sync.Mutex{}, + } +} + +type StoreManager struct { + pdClient pd.Client + grpcClis struct { + mu sync.Mutex + clis map[uint64]*grpc.ClientConn + } + keepalive keepalive.ClientParameters + tlsConf *tls.Config +} + +// NewStoreManager create a new manager for gRPC connections to stores. +func NewStoreManager(pdCli pd.Client, kl keepalive.ClientParameters, tlsConf *tls.Config) *StoreManager { + return &StoreManager{ + pdClient: pdCli, + grpcClis: struct { + mu sync.Mutex + clis map[uint64]*grpc.ClientConn + }{clis: make(map[uint64]*grpc.ClientConn)}, + keepalive: kl, + tlsConf: tlsConf, + } +} + +func (mgr *StoreManager) PDClient() pd.Client { + return mgr.pdClient +} + +func (mgr *StoreManager) getGrpcConnLocked(ctx context.Context, storeID uint64) (*grpc.ClientConn, error) { + failpoint.Inject("hint-get-backup-client", func(v failpoint.Value) { + log.Info("failpoint hint-get-backup-client injected, "+ + "process will notify the shell.", zap.Uint64("store", storeID)) + if sigFile, ok := v.(string); ok { + file, err := os.Create(sigFile) + if err != nil { + log.Warn("failed to create file for notifying, skipping notify", zap.Error(err)) + } + if file != nil { + file.Close() + } + } + time.Sleep(3 * time.Second) + }) + store, err := mgr.pdClient.GetStore(ctx, storeID) + if err != nil { + return nil, errors.Trace(err) + } + opt := grpc.WithInsecure() + if mgr.tlsConf != nil { + opt = grpc.WithTransportCredentials(credentials.NewTLS(mgr.tlsConf)) + } + ctx, cancel := context.WithTimeout(ctx, dialTimeout) + bfConf := backoff.DefaultConfig + bfConf.MaxDelay = time.Second * 3 + addr := store.GetPeerAddress() + if addr == "" { + addr = store.GetAddress() + } + conn, err := grpc.DialContext( + ctx, + addr, + opt, + grpc.WithBlock(), + grpc.WithConnectParams(grpc.ConnectParams{Backoff: bfConf}), + grpc.WithKeepaliveParams(mgr.keepalive), + ) + cancel() + if err != nil { + return nil, berrors.ErrFailedToConnect.Wrap(err).GenWithStack("failed to make connection to store %d", storeID) + } + return conn, nil +} + +func (mgr *StoreManager) WithConn(ctx context.Context, storeID uint64, f func(*grpc.ClientConn)) error { + if ctx.Err() != nil { + return errors.Trace(ctx.Err()) + } + + mgr.grpcClis.mu.Lock() + defer mgr.grpcClis.mu.Unlock() + + if conn, ok := mgr.grpcClis.clis[storeID]; ok { + // Find a cached backup client. + f(conn) + return nil + } + + conn, err := mgr.getGrpcConnLocked(ctx, storeID) + if err != nil { + return errors.Trace(err) + } + // Cache the conn. + mgr.grpcClis.clis[storeID] = conn + f(conn) + return nil +} + +// ResetBackupClient reset the connection for backup client. +func (mgr *StoreManager) ResetBackupClient(ctx context.Context, storeID uint64) (backuppb.BackupClient, error) { + if ctx.Err() != nil { + return nil, errors.Trace(ctx.Err()) + } + + mgr.grpcClis.mu.Lock() + defer mgr.grpcClis.mu.Unlock() + + if conn, ok := mgr.grpcClis.clis[storeID]; ok { + // Find a cached backup client. + log.Info("Reset backup client", zap.Uint64("storeID", storeID)) + err := conn.Close() + if err != nil { + log.Warn("close backup connection failed, ignore it", zap.Uint64("storeID", storeID)) + } + delete(mgr.grpcClis.clis, storeID) + } + var ( + conn *grpc.ClientConn + err error + ) + for retry := 0; retry < resetRetryTimes; retry++ { + conn, err = mgr.getGrpcConnLocked(ctx, storeID) + if err != nil { + log.Warn("failed to reset grpc connection, retry it", + zap.Int("retry time", retry), logutil.ShortError(err)) + time.Sleep(time.Duration(retry+3) * time.Second) + continue + } + mgr.grpcClis.clis[storeID] = conn + break + } + if err != nil { + return nil, errors.Trace(err) + } + return backuppb.NewBackupClient(conn), nil +} + +// Close closes all client in Mgr. +func (mgr *StoreManager) Close() { + if mgr == nil { + return + } + mgr.grpcClis.mu.Lock() + for _, cli := range mgr.grpcClis.clis { + err := cli.Close() + if err != nil { + log.Error("fail to close Mgr", zap.Error(err)) + } + } + mgr.grpcClis.mu.Unlock() +} + +func (mgr *StoreManager) TLSConfig() *tls.Config { + if mgr == nil { + return nil + } + return mgr.tlsConf +} diff --git a/br/pkg/utils/worker.go b/br/pkg/utils/worker.go index 773cfd41a64da..cf80770d0ae67 100644 --- a/br/pkg/utils/worker.go +++ b/br/pkg/utils/worker.go @@ -3,7 +3,10 @@ package utils import ( + "github.com/pingcap/errors" "github.com/pingcap/log" + berrors "github.com/pingcap/tidb/br/pkg/errors" + "github.com/pingcap/tidb/br/pkg/logutil" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) @@ -107,3 +110,23 @@ func (pool *WorkerPool) RecycleWorker(worker *Worker) { func (pool *WorkerPool) HasWorker() bool { return pool.IdleCount() > 0 } + +// PanicToErr recovers when the execution get panicked, and set the error provided by the arg. +// generally, this would be used with named return value and `defer`, like: +// +// func foo() (err error) { +// defer utils.PanicToErr(&err) +// return maybePanic() +// } +// +// Before using this, there are some hints for reducing resource leakage or bugs: +// - If any of clean work (by `defer`) relies on the error (say, when error happens, rollback some operations.), please +// place `defer this` AFTER that. +// - All resources allocated should be freed by the `defer` syntax, or when panicking, they may not be recycled. +func PanicToErr(err *error) { + item := recover() + if item != nil { + *err = errors.Annotatef(berrors.ErrUnknown, "panicked when executing, message: %v", item) + log.Warn("checkpoint advancer panicked, recovering", zap.StackSkip("stack", 1), logutil.ShortError(*err)) + } +} diff --git a/br/pkg/version/build/info_test.go b/br/pkg/version/build/info_test.go index a891c8c65e3ca..1487b9de6cec9 100644 --- a/br/pkg/version/build/info_test.go +++ b/br/pkg/version/build/info_test.go @@ -19,7 +19,7 @@ func TestInfo(t *testing.T) { require.Regexp(t, "^UTC Build Time", lines[4]) } -func TestLogInfo(t *testing.T) { +func TestLogInfo(*testing.T) { LogInfo(BR) LogInfo(Lightning) } diff --git a/br/pkg/version/version.go b/br/pkg/version/version.go index 17d8bc6728296..c790125fd26fa 100644 --- a/br/pkg/version/version.go +++ b/br/pkg/version/version.go @@ -129,6 +129,37 @@ 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 { + 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) + } + + // tikvVersion should at least 6.1.0 + if tikvVersion.Major < 6 || (tikvVersion.Major == 6 && tikvVersion.Minor == 0) { + return errors.Annotatef(berrors.ErrVersionMismatch, "TiKV node %s version %s is too low when use PiTR, please update tikv's version to at least v6.1.0(v6.2.0+ recommanded)", + s.Address, tikvVersion) + } + + // The versions of BR and TiKV should be the same when use BR 6.1.0 + if BRVersion.Major == 6 && BRVersion.Minor == 1 { + if tikvVersion.Major != 6 || tikvVersion.Minor != 1 { + return errors.Annotatef(berrors.ErrVersionMismatch, "TiKV node %s version %s and BR %s version mismatch when use PiTR v6.1.0, please use the same version of BR", + s.Address, tikvVersion, build.ReleaseVersion) + } + } else { + // If BRVersion > v6.1.0, the version of TiKV should be at least v6.2.0 + if tikvVersion.Major == 6 && tikvVersion.Minor <= 1 { + return errors.Annotatef(berrors.ErrVersionMismatch, "TiKV node %s version %s and BR %s version mismatch when use PiTR v6.2.0+, please use the tikv with version v6.2.0+", + s.Address, tikvVersion, build.ReleaseVersion) + } + } + + return nil +} + // CheckVersionForBR checks whether version of the cluster and BR itself is compatible. func CheckVersionForBR(s *metapb.Store, tikvVersion *semver.Version) error { BRVersion, err := semver.NewVersion(removeVAndHash(build.ReleaseVersion)) diff --git a/br/pkg/version/version_test.go b/br/pkg/version/version_test.go index 84ffd74849aaa..008e8a10d1ccd 100644 --- a/br/pkg/version/version_test.go +++ b/br/pkg/version/version_test.go @@ -45,6 +45,74 @@ func TestCheckClusterVersion(t *testing.T) { Client: nil, } + { + build.ReleaseVersion = "v6.2.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v5.4.2`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.Error(t, err) + require.Regexp(t, `^TiKV .* is too low when use PiTR, please `, err.Error()) + } + + { + build.ReleaseVersion = "v6.2.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.0.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.Error(t, err) + require.Regexp(t, `^TiKV .* is too low when use PiTR, please `, err.Error()) + } + + { + build.ReleaseVersion = "v6.2.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.1.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.Error(t, err) + require.Regexp(t, `^TiKV .* version mismatch when use PiTR v6.2.0\+, please `, err.Error()) + } + + { + build.ReleaseVersion = "v6.2.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.2.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.NoError(t, err) + } + + { + build.ReleaseVersion = "v6.1.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v5.4.2`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.Error(t, err) + require.Regexp(t, `^TiKV .* is too low when use PiTR, please `, err.Error()) + } + + { + build.ReleaseVersion = "v6.1.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.1.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.NoError(t, err) + } + + { + build.ReleaseVersion = "v6.1.0" + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: `v6.2.0`}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBRPiTR) + require.Error(t, err) + require.Regexp(t, `^TiKV .* version mismatch when use PiTR v6.1.0, please `, err.Error()) + } + { build.ReleaseVersion = "v4.0.5" mock.getAllStores = func() []*metapb.Store { diff --git a/br/tests/_utils/br_tikv_outage_util b/br/tests/_utils/br_tikv_outage_util index 7386425aff8d4..cd3283a27ff08 100644 --- a/br/tests/_utils/br_tikv_outage_util +++ b/br/tests/_utils/br_tikv_outage_util @@ -41,7 +41,7 @@ load() { check() { run_sql 'drop database if exists '$TEST_NAME';' - run_br restore full -s local://"$backup_dir" + run_br restore full --filter '*.*' --filter '!mysql.*' -s local://"$backup_dir" count=$(run_sql 'select count(*) from '$TEST_NAME'.usertable;' | tail -n 1 | awk '{print $2}') [ "$count" -eq 20000 ] } \ No newline at end of file diff --git a/br/tests/_utils/run_services b/br/tests/_utils/run_services index a0fbe006fd189..a7449cb229bf2 100644 --- a/br/tests/_utils/run_services +++ b/br/tests/_utils/run_services @@ -44,6 +44,11 @@ stop() { killall -v -9 "$svc" &>/dev/null || return 0 } +restart_services() { + stop_services + start_services +} + stop_services() { for svc in "br" "tidb-server" "tiflash" "TiFlashMain" "tikv-server" "pd-server" "cdc" "minio"; do stop $svc & diff --git a/br/tests/_utils/run_sql_file b/br/tests/_utils/run_sql_file new file mode 100755 index 0000000000000..59942940c076a --- /dev/null +++ b/br/tests/_utils/run_sql_file @@ -0,0 +1,28 @@ +#!/bin/bash +# +# 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. + +set -euo pipefail + +SQL_FILE="$1" +shift + +echo "[$(date)] Executing SQL_FILE: $SQL_FILE" > "$TEST_DIR/sql_res.$TEST_NAME.txt" +cat $SQL_FILE | mysql -uroot -h127.0.0.1 -P4000 \ + --ssl-ca="$TEST_DIR/certs/ca.pem" \ + --ssl-cert="$TEST_DIR/certs/curl.pem" \ + --ssl-key="$TEST_DIR/certs/curl.key" \ + "$@" \ + --default-character-set utf8 -E | tee -a "$TEST_DIR/sql_res.$TEST_NAME.txt" diff --git a/br/tests/br_azblob/_run.sh b/br/tests/br_azblob/_run.sh index 5cc12b6a492cf..30d08cc00343e 100644 --- a/br/tests/br_azblob/_run.sh +++ b/br/tests/br_azblob/_run.sh @@ -52,7 +52,7 @@ done # new version restore full echo "restore start..." -run_br restore full \ +run_br restore full --filter '*.*' --filter '!mysql.*' \ -s "azure://$CONTAINER/$DB?" \ --pd $PD_ADDR --azblob.endpoint="$AZBLOB_ENDPOINT" \ --azblob.account-name="$ACCOUNT_NAME" \ diff --git a/br/tests/br_backup_empty/run.sh b/br/tests/br_backup_empty/run.sh index 41ca818139ba4..e55dd25245414 100644 --- a/br/tests/br_backup_empty/run.sh +++ b/br/tests/br_backup_empty/run.sh @@ -28,7 +28,7 @@ fi # restore empty. echo "restore empty cluster start..." -run_br restore full -s "local://$TEST_DIR/empty_cluster" --pd $PD_ADDR --ratelimit 1024 +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/empty_cluster" --pd $PD_ADDR --ratelimit 1024 if [ $? -ne 0 ]; then echo "TEST: [$TEST_NAME] failed on restore empty cluster!" exit 1 @@ -55,7 +55,7 @@ done # restore empty. echo "restore empty db start..." -run_br restore full -s "local://$TEST_DIR/empty_db" --pd $PD_ADDR --ratelimit 1024 +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/empty_db" --pd $PD_ADDR --ratelimit 1024 if [ $? -ne 0 ]; then echo "TEST: [$TEST_NAME] failed on restore empty cluster!" exit 1 @@ -76,7 +76,7 @@ while [ $i -le $DB_COUNT ]; do done echo "restore empty table start..." -run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/empty_table" +run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/empty_table" # insert one row to make sure table is restored. run_sql "INSERT INTO ${DB}1.usertable1 VALUES (\"a\", \"b\");" diff --git a/br/tests/br_crypter/run.sh b/br/tests/br_crypter/run.sh index 11cef56b334e5..6dae71360b8fc 100755 --- a/br/tests/br_crypter/run.sh +++ b/br/tests/br_crypter/run.sh @@ -59,7 +59,7 @@ function test_crypter_plaintext(){ drop_db echo "restore with crypter method of plaintext" - run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/plaintext" --crypter.method "PLAINTEXT" + run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/plaintext" --crypter.method "PLAINTEXT" check_db_row } @@ -79,7 +79,7 @@ function test_crypter(){ echo "restore crypter method of $CRYPTER_METHOD with wrong key of $CRYPTER_WRONG_KEY" restore_fail=0 - run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ + run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ --crypter.method $CRYPTER_METHOD --crypter.key $CRYPTER_WRONG_KEY || restore_fail=1 if [ $restore_fail -ne 1 ]; then echo "TEST: [$TEST_NAME] test restore crypter with wrong key failed!" @@ -87,7 +87,7 @@ function test_crypter(){ fi echo "restore crypter method of $CRYPTER_METHOD with the key of $CRYPTER_KEY" - run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ + run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ --crypter.method $CRYPTER_METHOD --crypter.key $CRYPTER_KEY check_db_row @@ -103,7 +103,7 @@ function test_crypter(){ echo "backup crypter method of $CRYPTER_METHOD with the wrong key-file of $CRYPTER_WRONG_KEY_FILE" restore_fail=0 - run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ + run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ --crypter.method $CRYPTER_METHOD --crypter.key-file $CRYPTER_WRONG_KEY_FILE || restore_fail=1 if [ $restore_fail -ne 1 ]; then echo "TEST: [$TEST_NAME] test restore with wrong key-file failed!" @@ -111,7 +111,7 @@ function test_crypter(){ fi echo "restore crypter method of $CRYPTER_METHOD with the key-file of $CRYPTER_KEY_FILE" - run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ + run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ --crypter.method $CRYPTER_METHOD --crypter.key-file $CRYPTER_KEY_FILE check_db_row diff --git a/br/tests/br_crypter2/run.sh b/br/tests/br_crypter2/run.sh index 91de74376ebce..5f6bff262358b 100755 --- a/br/tests/br_crypter2/run.sh +++ b/br/tests/br_crypter2/run.sh @@ -70,7 +70,7 @@ run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_fil drop_db -run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ +run_br --pd $PD_ADDR restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ --check-requirements=false --crypter.method $CRYPTER_METHOD --crypter.key $CRYPTER_KEY check_db_row diff --git a/br/tests/br_full/run.sh b/br/tests/br_full/run.sh index 8d754dbd28af1..6c5c039069bd9 100755 --- a/br/tests/br_full/run.sh +++ b/br/tests/br_full/run.sh @@ -81,7 +81,7 @@ for ct in limit lz4 zstd; do 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 + run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB-$ct" --pd $PD_ADDR --ratelimit 1024 export GO_FAILPOINTS="" for i in $(seq $DB_COUNT); do diff --git a/br/tests/br_full_cluster_restore/full_data.sql b/br/tests/br_full_cluster_restore/full_data.sql new file mode 100644 index 0000000000000..77429bff2e657 --- /dev/null +++ b/br/tests/br_full_cluster_restore/full_data.sql @@ -0,0 +1,28 @@ +create database db1; +create table db1.t1(id int, val varchar(100)); +insert into db1.t1 values(1, 'a'), (2, 'b'); +create table db1.t2(id int, val varchar(100)); +insert into db1.t2 values(1, 'a'), (2, 'b'); +create database db2; +create table db2.t1(id int, val varchar(100)); +insert into db2.t1 values(1, 'a'), (2, 'b'); +create table db2.t2(id int, val varchar(100)); +insert into db2.t2 values(1, 'a'), (2, 'b'); + +-- user1 can select on db1 and select on db2.t1 and db2.t2 +create user user1 identified by '123456'; +grant select on db1.* to user1; -- mysql.db +grant select on db2.t1 to user1; -- mysql.tables_priv +grant select, update(val) on db2.t2 to user1; -- mysql.tables_priv mysql.columns_priv + +-- user2 default role is role1 which can do select on db1 +create role role1; +grant select on db1.* to role1; +create user user2 identified by '123456'; +grant role1 to user2; -- mysql.role_edges +set default role all to user2; -- mysql.default_roles +grant ROLE_ADMIN on *.* to user2; -- mysql.global_grants + +-- user3 can only login with ssl and select db1.t1 +create user user3 identified by '123456' require ssl; +grant select on db1.t1 to user3; diff --git a/br/tests/br_full_cluster_restore/run.sh b/br/tests/br_full_cluster_restore/run.sh new file mode 100644 index 0000000000000..7587bd2b9775a --- /dev/null +++ b/br/tests/br_full_cluster_restore/run.sh @@ -0,0 +1,94 @@ +#! /bin/bash + +set -eu + +# we need to keep backup data after restart service +backup_dir=$TEST_DIR/keep_${TEST_NAME} +incr_backup_dir=${backup_dir}_inc +res_file="$TEST_DIR/sql_res.$TEST_NAME.txt" +br_log_file=$TEST_DIR/br.log +source tests/_utils/run_services + +function run_sql_as() { + user=$1 + shift + SQL="$1" + shift + echo "[$(date)] Executing SQL with user $user: $SQL" + mysql -u$user -p123456 -h127.0.0.1 -P4000 \ + "$@" \ + --default-character-set utf8 -E -e "$SQL" > "$TEST_DIR/sql_res.$TEST_NAME.txt" 2>&1 +} + +restart_services + +unset BR_LOG_TO_TERM +run_sql_file tests/${TEST_NAME}/full_data.sql +run_br backup full --log-file $br_log_file -s "local://$backup_dir" + +# br.test will add coverage output, so we use head here +LAST_BACKUP_TS=$(run_br validate decode --log-file $br_log_file --field="end-version" -s "local://$backup_dir" 2>/dev/null | head -n1) +run_sql "insert into db2.t1 values(3, 'c'), (4, 'd'), (5, 'e');" +run_br backup full --log-file $br_log_file --lastbackupts $LAST_BACKUP_TS -s "local://$incr_backup_dir" + +run_sql "drop database db2" + +echo "--> cluster is not fresh" +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 --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 --log-file $br_log_file --filter '*.*' --filter '!mysql.*' -s "local://$backup_dir" +run_sql "select count(*) from db2.t1" +check_contains "count(*): 2" + +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 --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: less column on target cluster" +restart_services +# mock incompatible manually +run_sql "alter table mysql.user drop column Reload_priv" +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 --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 "--> full cluster restore" +restart_services +run_br restore full --log-file $br_log_file -s "local://$backup_dir" +run_sql_as user1 "select count(*) from db1.t1" +check_contains "count(*): 2" +run_sql_as user1 "select count(*) from db2.t1" +check_contains "count(*): 2" +# user2 can select on db1 but not db2 +run_sql_as user2 "select count(*) from db1.t1" +check_contains "count(*): 2" +run_sql_as user2 "select count(*) from db2.t1" || true +check_contains "SELECT command denied to user" +# user3 can only query db1.t1 using ssl +# ci env uses mariadb client, ssl flag is different with mysql client +run_sql_as user3 "select count(*) from db1.t1" || true +check_contains "Access denied for user" +run_sql_as user3 "select count(*) from db1.t1" --ssl +check_contains "count(*): 2" +run_sql_as user3 "select count(*) from db1.t2" --ssl || true +check_contains "SELECT command denied to user" + +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 9ae563c6b0aef..1433c1f71e9a6 100755 --- a/br/tests/br_full_ddl/run.sh +++ b/br/tests/br_full_ddl/run.sh @@ -97,7 +97,7 @@ if [[ "${cluster_index_before_backup}" != "${cluster_index_before_restore}" ]]; fi echo "restore full without stats..." -run_br restore full -s "local://$TEST_DIR/${DB}_disable_stats" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/${DB}_disable_stats" --pd $PD_ADDR curl $TIDB_IP:10080/stats/dump/$DB/$TABLE | jq '.columns.field0 | del(.last_update_version, .fm_sketch, .correlation)' > $RESOTRE_STAT # stats should not be equal because we disable stats by default. @@ -114,7 +114,7 @@ run_sql "DROP DATABASE $DB;" # restore full echo "restore start..." export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/restore/restore-createtables-error=return(true)" -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --log-file $RESTORE_LOG --ddl-batch-size=128 || { cat $RESTORE_LOG; } +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --log-file $RESTORE_LOG --ddl-batch-size=128 || { cat $RESTORE_LOG; } export GO_FAILPOINTS="" panic_count=$(cat $RESTORE_LOG | grep "panic"| wc -l) @@ -128,7 +128,7 @@ run_sql "DROP DATABASE $DB;" # restore full echo "restore start..." export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/pdutil/PDEnabledPauseConfig=return(true)" -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --log-file $LOG || { cat $LOG; exit 1; } +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --log-file $LOG || { cat $LOG; exit 1; } export GO_FAILPOINTS="" pause_count=$(cat $LOG | grep "pause configs successful"| wc -l | xargs) diff --git a/br/tests/br_full_index/run.sh b/br/tests/br_full_index/run.sh index be43a423e6549..030d2416c3822 100755 --- a/br/tests/br_full_index/run.sh +++ b/br/tests/br_full_index/run.sh @@ -57,7 +57,7 @@ done # restore full echo "restore start..." -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR for i in $(seq $DB_COUNT); do row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') diff --git a/br/tests/br_gcs/run.sh b/br/tests/br_gcs/run.sh index 058191864ad71..103db54c2ed74 100755 --- a/br/tests/br_gcs/run.sh +++ b/br/tests/br_gcs/run.sh @@ -98,7 +98,7 @@ done # new version restore full echo "restore start..." -run_br restore full -s "gcs://$BUCKET/$DB?" --pd $PD_ADDR --gcs.endpoint="http://$GCS_HOST:$GCS_PORT/storage/v1/" --check-requirements=false +run_br restore full --filter '*.*' --filter '!mysql.*' -s "gcs://$BUCKET/$DB?" --pd $PD_ADDR --gcs.endpoint="http://$GCS_HOST:$GCS_PORT/storage/v1/" --check-requirements=false for i in $(seq $DB_COUNT); do row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') @@ -126,7 +126,7 @@ for i in $(seq $DB_COUNT); do done echo "v4.0.8 version restore start..." -run_br restore full -s "gcs://$BUCKET/${DB}_old" --pd $PD_ADDR --gcs.endpoint="http://$GCS_HOST:$GCS_PORT/storage/v1/" --check-requirements=false +run_br restore full --filter '*.*' --filter '!mysql.*' -s "gcs://$BUCKET/${DB}_old" --pd $PD_ADDR --gcs.endpoint="http://$GCS_HOST:$GCS_PORT/storage/v1/" --check-requirements=false for i in $(seq $DB_COUNT); do row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') diff --git a/br/tests/br_history/run.sh b/br/tests/br_history/run.sh index 161b01f8c8ba5..728583265adc4 100755 --- a/br/tests/br_history/run.sh +++ b/br/tests/br_history/run.sh @@ -43,7 +43,7 @@ run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/$DB" --timeago "10s" # restore full echo "restore start..." -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR for i in $(seq $DB_COUNT); do row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') diff --git a/br/tests/br_incremental_same_table/run.sh b/br/tests/br_incremental_same_table/run.sh index 67b502ae819d1..021f6b020f460 100755 --- a/br/tests/br_incremental_same_table/run.sh +++ b/br/tests/br_incremental_same_table/run.sh @@ -62,7 +62,7 @@ done # full restore echo "full restore start..." -run_br restore full -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR row_count_full=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE;" | awk '/COUNT/{print $2}') # check full restore if [ "${row_count_full}" != "${ROW_COUNT}" ];then diff --git a/br/tests/br_insert_after_restore/run.sh b/br/tests/br_insert_after_restore/run.sh index 5d8aa947b43a4..a6a9872cc0003 100755 --- a/br/tests/br_insert_after_restore/run.sh +++ b/br/tests/br_insert_after_restore/run.sh @@ -48,7 +48,7 @@ run_sql "DROP DATABASE $DB;" # restore full echo "restore start..." -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR row_count_new=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE;" | awk '/COUNT/{print $2}') diff --git a/br/tests/br_rawkv/client.go b/br/tests/br_rawkv/client.go index 8c63178abb4b6..a751891e1b306 100644 --- a/br/tests/br_rawkv/client.go +++ b/br/tests/br_rawkv/client.go @@ -141,7 +141,6 @@ func randGen(client *rawkv.Client, startKey, endKey []byte, maxLen int, concurre errCh <- errors.Trace(err) } } - } }() } diff --git a/br/tests/br_restore_TDE_enable/run.sh b/br/tests/br_restore_TDE_enable/run.sh index 793a390951a6e..4b10f8d86744d 100755 --- a/br/tests/br_restore_TDE_enable/run.sh +++ b/br/tests/br_restore_TDE_enable/run.sh @@ -119,7 +119,7 @@ bin/tikv-ctl --config=tests/config/tikv.toml encryption-meta dump-file | grep "A RESTORE_LOG="restore.log" rm -f $RESTORE_LOG unset BR_LOG_TO_TERM - run_br restore full -s "s3://mybucket/$DB?$S3_KEY" --pd $PD_ADDR --s3.endpoint="http://$S3_ENDPOINT" \ + run_br restore full --filter '*.*' --filter '!mysql.*' -s "s3://mybucket/$DB?$S3_KEY" --pd $PD_ADDR --s3.endpoint="http://$S3_ENDPOINT" \ --log-file $RESTORE_LOG for i in $(seq $DB_COUNT); do diff --git a/br/tests/br_s3/run.sh b/br/tests/br_s3/run.sh index df06051358ae5..30474f44e7b88 100755 --- a/br/tests/br_s3/run.sh +++ b/br/tests/br_s3/run.sh @@ -118,7 +118,7 @@ for p in $(seq 2); do RESTORE_LOG="restore.log" rm -f $RESTORE_LOG unset BR_LOG_TO_TERM - ( run_br restore full -s "s3://mybucket/$DB?$S3_KEY" --pd $PD_ADDR --s3.endpoint="http://$S3_ENDPOINT" \ + ( run_br restore full --filter '*.*' --filter '!mysql.*' -s "s3://mybucket/$DB?$S3_KEY" --pd $PD_ADDR --s3.endpoint="http://$S3_ENDPOINT" \ --ratelimit 1 \ --log-file $RESTORE_LOG || \ ( cat $RESTORE_LOG && BR_LOG_TO_TERM=1 && exit 1 ) ) & diff --git a/br/tests/br_skip_checksum/run.sh b/br/tests/br_skip_checksum/run.sh index fc7e7c7ed3535..35c49d05a3fa9 100755 --- a/br/tests/br_skip_checksum/run.sh +++ b/br/tests/br_skip_checksum/run.sh @@ -38,7 +38,7 @@ done # restore full, skipping genreate checksum. echo "restore start..." -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --ratelimit 1024 --checksum=false +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --ratelimit 1024 --checksum=false for i in $(seq $DB_COUNT); do row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') @@ -63,7 +63,7 @@ for i in $(seq $DB_COUNT); do run_sql "DROP DATABASE $DB${i};" done echo "restore(with checksum) start..." -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --ratelimit 1024 +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --ratelimit 1024 for i in $(seq $DB_COUNT); do row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') diff --git a/br/tests/br_small_batch_size/run.sh b/br/tests/br_small_batch_size/run.sh index bb91a3f9ad3c3..645c65141e46f 100755 --- a/br/tests/br_small_batch_size/run.sh +++ b/br/tests/br_small_batch_size/run.sh @@ -69,7 +69,7 @@ run_sql "drop database $DB" echo "restore start..." GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/task/small-batch-size=return(2)" \ -run_br restore full -s "local://$backup_dir" --pd $PD_ADDR --ratelimit 1024 +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$backup_dir" --pd $PD_ADDR --ratelimit 1024 for i in $record_counts; do check_size "t$i" $i diff --git a/br/tests/br_split_region_fail/run.sh b/br/tests/br_split_region_fail/run.sh index 13b511313ebfa..6e8d93fdf646a 100644 --- a/br/tests/br_split_region_fail/run.sh +++ b/br/tests/br_split_region_fail/run.sh @@ -47,7 +47,7 @@ echo "restore start..." unset BR_LOG_TO_TERM GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/restore/not-leader-error=1*return(true)->1*return(false);\ github.com/pingcap/tidb/br/pkg/restore/somewhat-retryable-error=3*return(true)" \ -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --ratelimit 1024 --log-file $LOG || true +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --ratelimit 1024 --log-file $LOG || true BR_LOG_TO_TERM=1 grep "a error occurs on split region" $LOG && \ diff --git a/br/tests/br_table_filter/run.sh b/br/tests/br_table_filter/run.sh index 272e1fce25c5c..ee90fcc4639c9 100755 --- a/br/tests/br_table_filter/run.sh +++ b/br/tests/br_table_filter/run.sh @@ -39,7 +39,7 @@ echo 'Simple check' run_br backup full -f "$DB.*" -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR run_sql "drop schema $DB;" -run_br restore full -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR run_sql "select c from $DB.one;" run_sql "select c from $DB.two;" @@ -53,7 +53,7 @@ echo 'Filtered backup check' run_br backup full -f "$DB.t*" -s "local://$TEST_DIR/$DB/t" --pd $PD_ADDR run_sql "drop schema $DB;" -run_br restore full -s "local://$TEST_DIR/$DB/t" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB/t" --pd $PD_ADDR ! run_sql "select c from $DB.one;" run_sql "select c from $DB.two;" @@ -105,10 +105,10 @@ run_sql 'select c from '"$DB"'.`the,special,table`;' echo 'Case sensitive backup check' run_sql "drop schema $DB;" -run_br restore full --case-sensitive -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' --case-sensitive -s "local://$TEST_DIR/$DB/full" --pd $PD_ADDR run_br backup full --case-sensitive -f "$DB.[oF]*" -s "local://$TEST_DIR/$DB/of" --pd $PD_ADDR run_sql "drop schema $DB;" -run_br restore full --case-sensitive -s "local://$TEST_DIR/$DB/of" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' --case-sensitive -s "local://$TEST_DIR/$DB/of" --pd $PD_ADDR run_sql "select c from $DB.one;" ! run_sql "select c from $DB.two;" diff --git a/br/tests/br_table_partition/run.sh b/br/tests/br_table_partition/run.sh index 87cd79a49c26c..74eec09f85ff3 100755 --- a/br/tests/br_table_partition/run.sh +++ b/br/tests/br_table_partition/run.sh @@ -38,7 +38,7 @@ run_sql "DROP DATABASE $DB;" # restore full echo "restore start..." -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR for i in $(seq $TABLE_COUNT) _Hash _List; do run_sql "SHOW CREATE TABLE $DB.$TABLE${i};" | grep 'PARTITION' diff --git a/br/tests/br_tiflash/run.sh b/br/tests/br_tiflash/run.sh index 2d8b0d6419256..e507f23f03a04 100644 --- a/br/tests/br_tiflash/run.sh +++ b/br/tests/br_tiflash/run.sh @@ -52,7 +52,7 @@ rm -rf "/${TEST_DIR}/$DB" run_br backup full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR run_sql "DROP DATABASE $DB" -run_br restore full -s "local://$TEST_DIR/$DB" --pd $PD_ADDR +run_br restore full --filter '*.*' --filter '!mysql.*' -s "local://$TEST_DIR/$DB" --pd $PD_ADDR # wating for TiFlash sync sleep 100 diff --git a/br/tests/br_tikv_outage/run.sh b/br/tests/br_tikv_outage/run.sh index d419e3d0ee95b..2f1247c06ad36 100644 --- a/br/tests/br_tikv_outage/run.sh +++ b/br/tests/br_tikv_outage/run.sh @@ -18,7 +18,7 @@ for failure in $cases; do rm -f "$hint_finegrained" "$hint_backup_start" "$hint_get_backup_client" export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/backup/hint-backup-start=1*return(\"$hint_backup_start\");\ github.com/pingcap/tidb/br/pkg/backup/hint-fine-grained-backup=1*return(\"$hint_finegrained\");\ -github.com/pingcap/tidb/br/pkg/conn/hint-get-backup-client=1*return(\"$hint_get_backup_client\")" +github.com/pingcap/tidb/br/pkg/utils/hint-get-backup-client=1*return(\"$hint_get_backup_client\")" backup_dir=${TEST_DIR:?}/"backup{test:${TEST_NAME}|with:${failure}}" rm -rf "${backup_dir:?}" diff --git a/br/tests/br_tikv_outage2/run.sh b/br/tests/br_tikv_outage2/run.sh index a482af29a08a0..aa963dfd52914 100644 --- a/br/tests/br_tikv_outage2/run.sh +++ b/br/tests/br_tikv_outage2/run.sh @@ -18,7 +18,7 @@ for failure in $cases; do rm -f "$hint_finegrained" "$hint_backup_start" "$hint_get_backup_client" export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/backup/hint-backup-start=1*return(\"$hint_backup_start\");\ github.com/pingcap/tidb/br/pkg/backup/hint-fine-grained-backup=1*return(\"$hint_finegrained\");\ -github.com/pingcap/tidb/br/pkg/conn/hint-get-backup-client=1*return(\"$hint_get_backup_client\")" +github.com/pingcap/tidb/br/pkg/utils/hint-get-backup-client=1*return(\"$hint_get_backup_client\")" if [ "$failure" = outage-at-finegrained ]; then export GO_FAILPOINTS="$GO_FAILPOINTS;github.com/pingcap/tidb/br/pkg/backup/noop-backup=return(true)" fi diff --git a/br/tests/lightning_incremental/run.sh b/br/tests/lightning_incremental/run.sh index a025e7bebc6f1..d8e922cd1d0a6 100644 --- a/br/tests/lightning_incremental/run.sh +++ b/br/tests/lightning_incremental/run.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright 2020 PingCAP, Inc. # @@ -34,6 +34,8 @@ for tbl in auto_random pk_auto_inc rowid_uk_inc uk_auto_inc; do check_contains "count(*): 3" done +declare -A next_ids=() + for tbl in auto_random pk_auto_inc rowid_uk_inc uk_auto_inc; do if [ "$tbl" = "auto_random" ]; then run_sql "SELECT id & b'000001111111111111111111111111111111111111111111111111111111111' as inc FROM incr.$tbl" @@ -43,6 +45,7 @@ for tbl in auto_random pk_auto_inc rowid_uk_inc uk_auto_inc; do check_contains 'inc: 1' check_contains 'inc: 2' check_contains 'inc: 3' + next_ids["$tbl"]="$(run_sql "SHOW TABLE incr.$tbl NEXT_ROW_ID" | grep NEXT_GLOBAL_ROW_ID | awk '{print $2}')" done for tbl in pk_auto_inc rowid_uk_inc; do @@ -67,9 +70,10 @@ for tbl in auto_random pk_auto_inc rowid_uk_inc uk_auto_inc; do else run_sql "SELECT id as inc FROM incr.$tbl" fi - check_contains 'inc: 4' - check_contains 'inc: 5' - check_contains 'inc: 6' + next_id=${next_ids["$tbl"]} + check_contains "inc: $next_id" + check_contains "inc: $((next_id + 1))" + check_contains "inc: $((next_id + 2))" done for tbl in pk_auto_inc rowid_uk_inc; do diff --git a/br/tests/lightning_parquet/data/test/test.warehouse/part-00000-c6c33252-4d2f-4c5c-8a2f-d162bde6c360-c000.gz.parquet b/br/tests/lightning_parquet/data/test/test.warehouse/part-00000-c6c33252-4d2f-4c5c-8a2f-d162bde6c360-c000.gz.parquet index 616f524dc8c4a..c8ae9098f1670 100644 Binary files a/br/tests/lightning_parquet/data/test/test.warehouse/part-00000-c6c33252-4d2f-4c5c-8a2f-d162bde6c360-c000.gz.parquet and b/br/tests/lightning_parquet/data/test/test.warehouse/part-00000-c6c33252-4d2f-4c5c-8a2f-d162bde6c360-c000.gz.parquet differ diff --git a/br/tests/lightning_parquet/db.sql b/br/tests/lightning_parquet/db.sql index c9c3ee11d31bc..181f0047bca3f 100644 --- a/br/tests/lightning_parquet/db.sql +++ b/br/tests/lightning_parquet/db.sql @@ -214,6 +214,7 @@ CREATE TABLE `warehouse` ( `w_zip` char(9) DEFAULT NULL, `w_tax` decimal(4,4) DEFAULT NULL, `w_ytd` decimal(12,2) DEFAULT NULL, + `w_bool` tinyint, PRIMARY KEY (`w_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/br/tests/lightning_parquet/run.sh b/br/tests/lightning_parquet/run.sh index ce5817415ef75..c3acaaa70ca7c 100755 --- a/br/tests/lightning_parquet/run.sh +++ b/br/tests/lightning_parquet/run.sh @@ -46,6 +46,8 @@ for BACKEND in local tidb; do run_sql 'select w_name from test.warehouse;' check_contains "w_name: eLNEDIW" + run_sql 'select w_bool from test.warehouse;' + check_contains "w_bool: 1" run_sql 'select c_since, c_discount from test.customer where c_id = 20;' check_contains "c_since: 2020-09-10 20:17:16" diff --git a/br/tests/lightning_partition_incremental/config.toml b/br/tests/lightning_partition_incremental/config.toml new file mode 100644 index 0000000000000..d2152b47c922a --- /dev/null +++ b/br/tests/lightning_partition_incremental/config.toml @@ -0,0 +1,2 @@ +[tikv-importer] +backend = 'local' diff --git a/br/tests/lightning_partition_incremental/config1.toml b/br/tests/lightning_partition_incremental/config1.toml new file mode 100644 index 0000000000000..60922c2b2d561 --- /dev/null +++ b/br/tests/lightning_partition_incremental/config1.toml @@ -0,0 +1,4 @@ +[tikv-importer] +backend = 'local' +incremental-import = true +max-kv-pairs = 1 diff --git a/br/tests/lightning_partition_incremental/config2.toml b/br/tests/lightning_partition_incremental/config2.toml new file mode 100644 index 0000000000000..3d8e42be9dab7 --- /dev/null +++ b/br/tests/lightning_partition_incremental/config2.toml @@ -0,0 +1,3 @@ +[tikv-importer] +backend = 'tidb' +max-kv-pairs = 1 diff --git a/br/tests/lightning_partition_incremental/data/incr.auto_rowid-schema.sql b/br/tests/lightning_partition_incremental/data/incr.auto_rowid-schema.sql new file mode 100644 index 0000000000000..e7d77bd757005 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data/incr.auto_rowid-schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE `auto_rowid` +( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + KEY `idx_bc` (`b`, `c`) +) PARTITION BY RANGE (`a`) + (PARTITION `p0` VALUES LESS THAN (100), + PARTITION `p1` VALUES LESS THAN (200), + PARTITION `p2` VALUES LESS THAN (300)); diff --git a/br/tests/lightning_partition_incremental/data/incr.auto_rowid.csv b/br/tests/lightning_partition_incremental/data/incr.auto_rowid.csv new file mode 100644 index 0000000000000..a1328f9738439 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data/incr.auto_rowid.csv @@ -0,0 +1,21 @@ +a,b,c +1,1,1 +2,2,2 +3,3,3 +4,4,4 +5,5,5 +6,6,6 +7,7,7 +8,8,8 +9,9,9 +10,10,10 +11,11,11 +12,12,12 +13,13,13 +14,14,14 +15,15,15 +16,16,16 +17,17,17 +18,18,18 +19,19,19 +20,20,20 diff --git a/br/tests/lightning_partition_incremental/data/incr.non_pk_auto_inc-schema.sql b/br/tests/lightning_partition_incremental/data/incr.non_pk_auto_inc-schema.sql new file mode 100644 index 0000000000000..62f33035c25d6 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data/incr.non_pk_auto_inc-schema.sql @@ -0,0 +1,12 @@ +CREATE TABLE `non_pk_auto_inc` +( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + `inc` bigint(20) NOT NULL AUTO_INCREMENT, + KEY `idx_bc` (`b`, `c`), + KEY `idx_inc` (`inc`) +) PARTITION BY RANGE (`a`) + (PARTITION `p0` VALUES LESS THAN (100), + PARTITION `p1` VALUES LESS THAN (200), + PARTITION `p2` VALUES LESS THAN (300)); diff --git a/br/tests/lightning_partition_incremental/data/incr.non_pk_auto_inc.csv b/br/tests/lightning_partition_incremental/data/incr.non_pk_auto_inc.csv new file mode 100644 index 0000000000000..a1328f9738439 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data/incr.non_pk_auto_inc.csv @@ -0,0 +1,21 @@ +a,b,c +1,1,1 +2,2,2 +3,3,3 +4,4,4 +5,5,5 +6,6,6 +7,7,7 +8,8,8 +9,9,9 +10,10,10 +11,11,11 +12,12,12 +13,13,13 +14,14,14 +15,15,15 +16,16,16 +17,17,17 +18,18,18 +19,19,19 +20,20,20 diff --git a/br/tests/lightning_partition_incremental/data1/incr.auto_rowid-schema.sql b/br/tests/lightning_partition_incremental/data1/incr.auto_rowid-schema.sql new file mode 100644 index 0000000000000..e7d77bd757005 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data1/incr.auto_rowid-schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE `auto_rowid` +( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + KEY `idx_bc` (`b`, `c`) +) PARTITION BY RANGE (`a`) + (PARTITION `p0` VALUES LESS THAN (100), + PARTITION `p1` VALUES LESS THAN (200), + PARTITION `p2` VALUES LESS THAN (300)); diff --git a/br/tests/lightning_partition_incremental/data1/incr.auto_rowid.csv b/br/tests/lightning_partition_incremental/data1/incr.auto_rowid.csv new file mode 100644 index 0000000000000..b4097c8838119 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data1/incr.auto_rowid.csv @@ -0,0 +1,21 @@ +a,b,c +101,1,1 +102,2,2 +103,3,3 +104,4,4 +105,5,5 +106,6,6 +107,7,7 +108,8,8 +109,9,9 +110,10,10 +111,11,11 +112,12,12 +113,13,13 +114,14,14 +115,15,15 +116,16,16 +117,17,17 +118,18,18 +119,19,19 +120,20,20 diff --git a/br/tests/lightning_partition_incremental/data1/incr.non_pk_auto_inc-schema.sql b/br/tests/lightning_partition_incremental/data1/incr.non_pk_auto_inc-schema.sql new file mode 100644 index 0000000000000..62f33035c25d6 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data1/incr.non_pk_auto_inc-schema.sql @@ -0,0 +1,12 @@ +CREATE TABLE `non_pk_auto_inc` +( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + `inc` bigint(20) NOT NULL AUTO_INCREMENT, + KEY `idx_bc` (`b`, `c`), + KEY `idx_inc` (`inc`) +) PARTITION BY RANGE (`a`) + (PARTITION `p0` VALUES LESS THAN (100), + PARTITION `p1` VALUES LESS THAN (200), + PARTITION `p2` VALUES LESS THAN (300)); diff --git a/br/tests/lightning_partition_incremental/data1/incr.non_pk_auto_inc.csv b/br/tests/lightning_partition_incremental/data1/incr.non_pk_auto_inc.csv new file mode 100644 index 0000000000000..b4097c8838119 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data1/incr.non_pk_auto_inc.csv @@ -0,0 +1,21 @@ +a,b,c +101,1,1 +102,2,2 +103,3,3 +104,4,4 +105,5,5 +106,6,6 +107,7,7 +108,8,8 +109,9,9 +110,10,10 +111,11,11 +112,12,12 +113,13,13 +114,14,14 +115,15,15 +116,16,16 +117,17,17 +118,18,18 +119,19,19 +120,20,20 diff --git a/br/tests/lightning_partition_incremental/data2/incr.auto_rowid-schema.sql b/br/tests/lightning_partition_incremental/data2/incr.auto_rowid-schema.sql new file mode 100644 index 0000000000000..e7d77bd757005 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data2/incr.auto_rowid-schema.sql @@ -0,0 +1,10 @@ +CREATE TABLE `auto_rowid` +( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + KEY `idx_bc` (`b`, `c`) +) PARTITION BY RANGE (`a`) + (PARTITION `p0` VALUES LESS THAN (100), + PARTITION `p1` VALUES LESS THAN (200), + PARTITION `p2` VALUES LESS THAN (300)); diff --git a/br/tests/lightning_partition_incremental/data2/incr.auto_rowid.csv b/br/tests/lightning_partition_incremental/data2/incr.auto_rowid.csv new file mode 100644 index 0000000000000..627ddcc989ca7 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data2/incr.auto_rowid.csv @@ -0,0 +1,21 @@ +a,b,c +201,1,1 +202,2,2 +203,3,3 +204,4,4 +205,5,5 +206,6,6 +207,7,7 +208,8,8 +209,9,9 +210,10,10 +211,11,11 +212,12,12 +213,13,13 +214,14,14 +215,15,15 +216,16,16 +217,17,17 +218,18,18 +219,19,19 +220,20,20 diff --git a/br/tests/lightning_partition_incremental/data2/incr.non_pk_auto_inc-schema.sql b/br/tests/lightning_partition_incremental/data2/incr.non_pk_auto_inc-schema.sql new file mode 100644 index 0000000000000..62f33035c25d6 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data2/incr.non_pk_auto_inc-schema.sql @@ -0,0 +1,12 @@ +CREATE TABLE `non_pk_auto_inc` +( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL, + `inc` bigint(20) NOT NULL AUTO_INCREMENT, + KEY `idx_bc` (`b`, `c`), + KEY `idx_inc` (`inc`) +) PARTITION BY RANGE (`a`) + (PARTITION `p0` VALUES LESS THAN (100), + PARTITION `p1` VALUES LESS THAN (200), + PARTITION `p2` VALUES LESS THAN (300)); diff --git a/br/tests/lightning_partition_incremental/data2/incr.non_pk_auto_inc.csv b/br/tests/lightning_partition_incremental/data2/incr.non_pk_auto_inc.csv new file mode 100644 index 0000000000000..627ddcc989ca7 --- /dev/null +++ b/br/tests/lightning_partition_incremental/data2/incr.non_pk_auto_inc.csv @@ -0,0 +1,21 @@ +a,b,c +201,1,1 +202,2,2 +203,3,3 +204,4,4 +205,5,5 +206,6,6 +207,7,7 +208,8,8 +209,9,9 +210,10,10 +211,11,11 +212,12,12 +213,13,13 +214,14,14 +215,15,15 +216,16,16 +217,17,17 +218,18,18 +219,19,19 +220,20,20 diff --git a/br/tests/lightning_partition_incremental/run.sh b/br/tests/lightning_partition_incremental/run.sh new file mode 100644 index 0000000000000..c1cdeec02d87a --- /dev/null +++ b/br/tests/lightning_partition_incremental/run.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# 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. + +set -eux + +run_lightning --backend=local -d "tests/$TEST_NAME/data" + +LOG_FILE1="$TEST_DIR/lightning_partition_incremental1.log" +LOG_FILE2="$TEST_DIR/lightning_partition_incremental2.log" + +run_lightning --log-file "$LOG_FILE1" --config "tests/$TEST_NAME/config1.toml" -d "tests/$TEST_NAME/data1" & +pid1="$!" +run_lightning --log-file "$LOG_FILE2" --config "tests/$TEST_NAME/config2.toml" -d "tests/$TEST_NAME/data2" & +pid2="$!" + +# Must wait for pid explicitly. Otherwise, we can't detect whether the process is exited with error. +wait "$pid1" "$pid2" + +grep -F 'checksum pass' "$LOG_FILE1" | grep -Fq 'auto_rowid' +grep -F 'checksum pass' "$LOG_FILE1" | grep -Fq 'non_pk_auto_inc' + +run_sql 'admin check table incr.auto_rowid' +run_sql 'admin check table incr.non_pk_auto_inc' + +run_sql 'select count(*) from incr.auto_rowid' +check_contains 'count(*): 60' + +run_sql 'select count(distinct _tidb_rowid) from incr.auto_rowid' +check_contains 'count(distinct _tidb_rowid): 60' + +run_sql 'select count(*) from incr.non_pk_auto_inc' +check_contains 'count(*): 60' + +run_sql 'select count(distinct _tidb_rowid) from incr.non_pk_auto_inc' +check_contains 'count(distinct _tidb_rowid): 60' diff --git a/build/BUILD.bazel b/build/BUILD.bazel index 396f4e943ed06..2da990828fcd3 100644 --- a/build/BUILD.bazel +++ b/build/BUILD.bazel @@ -133,7 +133,10 @@ nogo( "//build/linter/unconvert:unconvert", ] + staticcheck_analyzers(STATICHECK_ANALYZERS) + select({ - "//build:with_nogo": ["//build/linter/errcheck:errcheck"], + "//build:with_nogo": [ + "//build/linter/errcheck:errcheck", + "//build/linter/revive:revive", + ], "//conditions:default": [], }), ) diff --git a/build/linter/ineffassign/BUILD.bazel b/build/linter/ineffassign/BUILD.bazel index 706ea59702019..999f75af56a4b 100644 --- a/build/linter/ineffassign/BUILD.bazel +++ b/build/linter/ineffassign/BUILD.bazel @@ -5,5 +5,8 @@ go_library( srcs = ["analyzer.go"], importpath = "github.com/pingcap/tidb/build/linter/ineffassign", visibility = ["//visibility:public"], - deps = ["@com_github_gordonklaus_ineffassign//pkg/ineffassign"], + deps = [ + "//build/linter/util", + "@com_github_gordonklaus_ineffassign//pkg/ineffassign", + ], ) diff --git a/build/linter/ineffassign/analyzer.go b/build/linter/ineffassign/analyzer.go index 42179cb3ad567..0651b6a944f59 100644 --- a/build/linter/ineffassign/analyzer.go +++ b/build/linter/ineffassign/analyzer.go @@ -14,7 +14,14 @@ package ineffassign -import "github.com/gordonklaus/ineffassign/pkg/ineffassign" +import ( + "github.com/gordonklaus/ineffassign/pkg/ineffassign" + "github.com/pingcap/tidb/build/linter/util" +) // Analyzer is the analyzer struct of ineffassign. var Analyzer = ineffassign.Analyzer + +func init() { + util.SkipAnalyzer(Analyzer) +} diff --git a/build/linter/revive/BUILD.bazel b/build/linter/revive/BUILD.bazel new file mode 100644 index 0000000000000..922f493b7160c --- /dev/null +++ b/build/linter/revive/BUILD.bazel @@ -0,0 +1,17 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "revive", + srcs = ["analyzer.go"], + importpath = "github.com/pingcap/tidb/build/linter/revive", + visibility = ["//visibility:public"], + deps = [ + "//build/linter/util", + "@com_github_mgechev_revive//config", + "@com_github_mgechev_revive//lint", + "@com_github_mgechev_revive//rule", + "@com_github_pingcap_log//:log", + "@org_golang_x_tools//go/analysis", + "@org_uber_go_zap//:zap", + ], +) diff --git a/build/linter/revive/analyzer.go b/build/linter/revive/analyzer.go new file mode 100644 index 0000000000000..93b67358808e2 --- /dev/null +++ b/build/linter/revive/analyzer.go @@ -0,0 +1,194 @@ +// 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 revive + +import ( + "encoding/json" + "fmt" + "go/token" + "os" + + "github.com/mgechev/revive/config" + "github.com/mgechev/revive/lint" + "github.com/mgechev/revive/rule" + "github.com/pingcap/log" + "github.com/pingcap/tidb/build/linter/util" + "go.uber.org/zap" + "golang.org/x/tools/go/analysis" +) + +// Analyzer is the analyzer struct of gofmt. +var Analyzer = &analysis.Analyzer{ + Name: "revive", + Doc: "~6x faster, stricter, configurable, extensible, and beautiful drop-in replacement for golint", + Run: run, +} + +func init() { + util.SkipAnalyzer(Analyzer) +} + +// jsonObject defines a JSON object of a failure +type jsonObject struct { + Severity lint.Severity + lint.Failure `json:",inline"` +} + +var defaultRules = []lint.Rule{ + //&rule.VarDeclarationsRule{}, + &rule.PackageCommentsRule{}, + &rule.DotImportsRule{}, + &rule.BlankImportsRule{}, + &rule.ExportedRule{}, + &rule.VarNamingRule{}, + &rule.IndentErrorFlowRule{}, + &rule.RangeRule{}, + &rule.ErrorfRule{}, + &rule.ErrorNamingRule{}, + &rule.ErrorStringsRule{}, + &rule.ReceiverNamingRule{}, + &rule.IncrementDecrementRule{}, + &rule.ErrorReturnRule{}, + //&rule.UnexportedReturnRule{}, + &rule.TimeNamingRule{}, + &rule.ContextKeysType{}, + &rule.ContextAsArgumentRule{}, +} + +var allRules = append([]lint.Rule{ + //&rule.ArgumentsLimitRule{}, + //&rule.CyclomaticRule{}, + //&rule.FileHeaderRule{}, + &rule.EmptyBlockRule{}, + &rule.SuperfluousElseRule{}, + //&rule.ConfusingNamingRule{}, + &rule.GetReturnRule{}, + &rule.ModifiesParamRule{}, + &rule.ConfusingResultsRule{}, + //&rule.DeepExitRule{}, + &rule.UnusedParamRule{}, + &rule.UnreachableCodeRule{}, + //&rule.AddConstantRule{}, + //&rule.FlagParamRule{}, + &rule.UnnecessaryStmtRule{}, + //&rule.StructTagRule{}, + &rule.ModifiesValRecRule{}, + &rule.ConstantLogicalExprRule{}, + &rule.BoolLiteralRule{}, + //&rule.RedefinesBuiltinIDRule{}, + &rule.ImportsBlacklistRule{}, + //&rule.FunctionResultsLimitRule{}, + //&rule.MaxPublicStructsRule{}, + &rule.RangeValInClosureRule{}, + &rule.RangeValAddress{}, + &rule.WaitGroupByValueRule{}, + &rule.AtomicRule{}, + &rule.EmptyLinesRule{}, + //&rule.LineLengthLimitRule{}, + &rule.CallToGCRule{}, + &rule.DuplicatedImportsRule{}, + //&rule.ImportShadowingRule{}, + //&rule.BareReturnRule{}, + &rule.UnusedReceiverRule{}, + //&rule.UnhandledErrorRule{}, + //&rule.CognitiveComplexityRule{}, + &rule.StringOfIntRule{}, + &rule.StringFormatRule{}, + //&rule.EarlyReturnRule{}, + &rule.UnconditionalRecursionRule{}, + &rule.IdenticalBranchesRule{}, + &rule.DeferRule{}, + &rule.UnexportedNamingRule{}, + //&rule.FunctionLength{}, + //&rule.NestedStructs{}, + &rule.IfReturnRule{}, + &rule.UselessBreak{}, + &rule.TimeEqualRule{}, + //&rule.BannedCharsRule{}, + &rule.OptimizeOperandsOrderRule{}, +}, defaultRules...) + +func run(pass *analysis.Pass) (any, error) { + files := make([]string, 0, len(pass.Files)) + for _, file := range pass.Files { + files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename) + } + packages := [][]string{files} + + revive := lint.New(os.ReadFile, 1024) + conf := lint.Config{ + IgnoreGeneratedHeader: false, + Confidence: 0.8, + Severity: "error", + ErrorCode: -1, + WarningCode: -1, + Rules: map[string]lint.RuleConfig{}, + } + for _, r := range allRules { + conf.Rules[r.Name()] = lint.RuleConfig{} + } + lintingRules, err := config.GetLintingRules(&conf, []lint.Rule{}) + if err != nil { + return nil, err + } + + failures, err := revive.Lint(packages, lintingRules, conf) + if err != nil { + return nil, err + } + + formatChan := make(chan lint.Failure) + exitChan := make(chan bool) + + formatter, err := config.GetFormatter("json") + if err != nil { + return nil, err + } + var output string + go func() { + output, err = formatter.Format(formatChan, conf) + if err != nil { + log.Error("Format error", zap.Error(err)) + } + exitChan <- true + }() + + for f := range failures { + if f.Confidence < conf.Confidence { + continue + } + + formatChan <- f + } + + close(formatChan) + <-exitChan + + var results []jsonObject + err = json.Unmarshal([]byte(output), &results) + if err != nil { + return nil, err + } + for i := range results { + res := &results[i] + text := fmt.Sprintf("%s: %s", res.RuleName, res.Failure.Failure) + fileContent, tf, err := util.ReadFile(pass.Fset, res.Position.Start.Filename) + if err != nil { + panic(err) + } + pass.Reportf(token.Pos(tf.Base()+util.FindOffset(string(fileContent), res.Position.Start.Line, res.Position.Start.Column)), text) + } + return nil, nil +} diff --git a/build/linter/util/util.go b/build/linter/util/util.go index afa56c515613f..7dbf016106f07 100644 --- a/build/linter/util/util.go +++ b/build/linter/util/util.go @@ -201,7 +201,6 @@ func FindOffset(fileText string, line, column int) int { } else { currentCol++ } - } return -1 //not found } diff --git a/build/nogo_config.json b/build/nogo_config.json index b766d3ec45a14..21ea44e21175f 100644 --- a/build/nogo_config.json +++ b/build/nogo_config.json @@ -231,6 +231,28 @@ ".*_generated\\.go$": "ignore generated code" } }, + "revive": { + "exclude_files": { + "/external/": "no need to vet third party code", + "GOROOT/": "ignore code", + "/cgo/": "ignore cgo", + "tools/": "ignore tool code", + "parser/goyacc/": "ignore goyacc code", + "parser/ast/": "ignore parser/ast code", + "parser/test_driver/": "ignore parser/test_driver code", + ".*_test\\.go$": "ignore generated code", + ".*_generated\\.go$": "ignore generated code" + }, + "only_files": { + "lock/": "lock file", + "errno/": "errno code", + "structure/": "structure code", + "telemetry/": "telemetry code", + "util/": "util code", + "parser/": "parser code", + "meta/": "parser code" + } + }, "shift": { "exclude_files": { "/external/": "no need to vet third party code", diff --git a/cmd/explaintest/r/index_merge.result b/cmd/explaintest/r/index_merge.result index 5c7fece7d5161..32b2369d0c549 100644 --- a/cmd/explaintest/r/index_merge.result +++ b/cmd/explaintest/r/index_merge.result @@ -452,9 +452,9 @@ 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_10 1.00 root funcs:count(Column#92)->Column#93 -└─Sort_11 1.00 root Column#92 - └─StreamAgg_14 1.00 root funcs:count(1)->Column#92 +StreamAgg_10 1.00 root funcs:count(Column#93)->Column#94 +└─Sort_11 1.00 root Column#93 + └─StreamAgg_14 1.00 root funcs:count(1)->Column#93 └─MemTableScan_18 10000.00 root table:STATEMENTS_SUMMARY show warnings; Level Code Message diff --git a/config/BUILD.bazel b/config/BUILD.bazel index 222adfd336194..fd000f17f4b8b 100644 --- a/config/BUILD.bazel +++ b/config/BUILD.bazel @@ -10,6 +10,7 @@ go_library( importpath = "github.com/pingcap/tidb/config", visibility = ["//visibility:public"], deps = [ + "//br/pkg/streamhelper/config", "//parser/terror", "//types/json", "//util/logutil", diff --git a/config/config.go b/config/config.go index 0dc6cabc75727..193beee961f63 100644 --- a/config/config.go +++ b/config/config.go @@ -32,6 +32,7 @@ import ( "github.com/BurntSushi/toml" "github.com/pingcap/errors" zaplog "github.com/pingcap/log" + logbackupconf "github.com/pingcap/tidb/br/pkg/streamhelper/config" "github.com/pingcap/tidb/parser/terror" typejson "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/logutil" @@ -256,8 +257,8 @@ type Config struct { // BallastObjectSize set the initial size of the ballast object, the unit is byte. BallastObjectSize int `toml:"ballast-object-size" json:"ballast-object-size"` // EnableGlobalKill indicates whether to enable global kill. - EnableGlobalKill bool `toml:"enable-global-kill" json:"enable-global-kill"` TrxSummary TrxSummary `toml:"transaction-summary" json:"transaction-summary"` + EnableGlobalKill bool `toml:"enable-global-kill" json:"enable-global-kill"` // The following items are deprecated. We need to keep them here temporarily // to support the upgrade process. They can be removed in future. @@ -416,6 +417,13 @@ func (b *AtomicBool) UnmarshalText(text []byte) error { return nil } +// LogBackup is the config for log backup service. +// For now, it includes the embed advancer. +type LogBackup struct { + Advancer logbackupconf.Config `toml:"advancer" json:"advancer"` + Enabled bool `toml:"enabled" json:"enabled"` +} + // Log is the log section of config. type Log struct { // Log level. @@ -612,8 +620,6 @@ type Performance struct { ServerMemoryQuota uint64 `toml:"server-memory-quota" json:"server-memory-quota"` StatsLease string `toml:"stats-lease" json:"stats-lease"` StmtCountLimit uint `toml:"stmt-count-limit" json:"stmt-count-limit"` - FeedbackProbability float64 `toml:"feedback-probability" json:"feedback-probability"` - QueryFeedbackLimit uint `toml:"query-feedback-limit" json:"query-feedback-limit"` PseudoEstimateRatio float64 `toml:"pseudo-estimate-ratio" json:"pseudo-estimate-ratio"` BindInfoLease string `toml:"bind-info-lease" json:"bind-info-lease"` TxnEntrySizeLimit uint64 `toml:"txn-entry-size-limit" json:"txn-entry-size-limit"` @@ -875,8 +881,6 @@ var defaultConf = Config{ CrossJoin: true, StatsLease: "3s", StmtCountLimit: 5000, - FeedbackProbability: 0.0, - QueryFeedbackLimit: 512, PseudoEstimateRatio: 0.8, ForcePriority: "NO_PRIORITY", BindInfoLease: "3s", @@ -1020,6 +1024,8 @@ var removedConfig = map[string]struct{}{ "performance.memory-usage-alarm-ratio": {}, // use tidb_memory_usage_alarm_ratio "plugin.load": {}, // use plugin_load "plugin.dir": {}, // use plugin_dir + "performance.feedback-probability": {}, // This feature is deprecated + "performance.query-feedback-limit": {}, } // isAllRemovedConfigItems returns true if all the items that couldn't validate diff --git a/config/config.toml.example b/config/config.toml.example index afc97e60e74f8..e30ebdb3c4b37 100644 --- a/config/config.toml.example +++ b/config/config.toml.example @@ -232,12 +232,6 @@ cross-join = true # Stats lease duration, which influences the time of analyze and stats load. stats-lease = "3s" -# Probability to use the query feedback to update stats, 0.0 or 1.0 for always false/true. -feedback-probability = 0.0 - -# The max number of query feedback that cache in memory. -query-feedback-limit = 512 - # Pseudo stats will be used if the ratio between the modify count and # row count in statistics of a table is greater than it. pseudo-estimate-ratio = 0.8 diff --git a/config/config_test.go b/config/config_test.go index 2e044062bd4e8..27d2ebbec2111 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -650,7 +650,7 @@ allow-expression-index = false [isolation-read] # engines means allow the tidb server read data from which types of engines. options: "tikv", "tiflash", "tidb". engines = ["tikv", "tiflash", "tidb"] - `, errors.New("The following configuration options are no longer supported in this version of TiDB. Check the release notes for more information: check-mb4-value-in-utf8, enable-batch-dml, log.enable-slow-log, log.query-log-max-len, log.record-plan-in-slow-log, log.slow-threshold, lower-case-table-names, mem-quota-query, oom-action, performance.committer-concurrency, performance.force-priority, performance.memory-usage-alarm-ratio, performance.run-auto-analyze, prepared-plan-cache.capacity, prepared-plan-cache.enabled, prepared-plan-cache.memory-guard-ratio")}, + `, errors.New("The following configuration options are no longer supported in this version of TiDB. Check the release notes for more information: check-mb4-value-in-utf8, enable-batch-dml, log.enable-slow-log, log.query-log-max-len, log.record-plan-in-slow-log, log.slow-threshold, lower-case-table-names, mem-quota-query, oom-action, performance.committer-concurrency, performance.feedback-probability, performance.force-priority, performance.memory-usage-alarm-ratio, performance.query-feedback-limit, performance.run-auto-analyze, prepared-plan-cache.capacity, prepared-plan-cache.enabled, prepared-plan-cache.memory-guard-ratio")}, } for _, test := range configTest { @@ -1244,8 +1244,6 @@ func TestGetJSONConfig(t *testing.T) { require.NotContains(t, conf, "query-log-max-len") require.NotContains(t, conf, "oom-action") - require.Contains(t, conf, "query-feedback-limit") - require.Contains(t, conf, "feedback-probability") require.Contains(t, conf, "stmt-count-limit") require.Contains(t, conf, "rpc-metrics") } diff --git a/config/config_util.go b/config/config_util.go index 7b5f037b6a9c3..03e932289a59a 100644 --- a/config/config_util.go +++ b/config/config_util.go @@ -40,8 +40,6 @@ var ( "Performance.MaxProcs": {}, "Performance.MaxMemory": {}, "Performance.CrossJoin": {}, - "Performance.FeedbackProbability": {}, - "Performance.QueryFeedbackLimit": {}, "Performance.PseudoEstimateRatio": {}, "Performance.StmtCountLimit": {}, "Performance.TCPKeepAlive": {}, diff --git a/config/config_util_test.go b/config/config_util_test.go index e2327337ebcb3..8ef9ee8d49706 100644 --- a/config/config_util_test.go +++ b/config/config_util_test.go @@ -50,8 +50,6 @@ func TestMergeConfigItems(t *testing.T) { newConf.Performance.MaxProcs = 123 newConf.Performance.MaxMemory = 123 newConf.Performance.CrossJoin = false - newConf.Performance.FeedbackProbability = 123 - newConf.Performance.QueryFeedbackLimit = 123 newConf.Performance.PseudoEstimateRatio = 123 newConf.TiKVClient.StoreLimit = 123 @@ -62,7 +60,7 @@ func TestMergeConfigItems(t *testing.T) { newConf.Instance.SlowThreshold = 2345 as, rs := MergeConfigItems(oldConf, newConf) - require.Equal(t, 8, len(as)) + require.Equal(t, 6, len(as)) require.Equal(t, 3, len(rs)) for _, a := range as { _, ok := dynamicConfigItems[a] @@ -76,8 +74,6 @@ func TestMergeConfigItems(t *testing.T) { require.Equal(t, newConf.Performance.MaxProcs, oldConf.Performance.MaxProcs) require.Equal(t, newConf.Performance.MaxMemory, oldConf.Performance.MaxMemory) require.Equal(t, newConf.Performance.CrossJoin, oldConf.Performance.CrossJoin) - require.Equal(t, newConf.Performance.FeedbackProbability, oldConf.Performance.FeedbackProbability) - require.Equal(t, newConf.Performance.QueryFeedbackLimit, oldConf.Performance.QueryFeedbackLimit) require.Equal(t, newConf.Performance.PseudoEstimateRatio, oldConf.Performance.PseudoEstimateRatio) require.Equal(t, newConf.TiKVClient.StoreLimit, oldConf.TiKVClient.StoreLimit) require.Equal(t, newConf.Instance.SlowThreshold, oldConf.Instance.SlowThreshold) diff --git a/ddl/BUILD.bazel b/ddl/BUILD.bazel index 3327bf550acb9..4774f5e9d883f 100644 --- a/ddl/BUILD.bazel +++ b/ddl/BUILD.bazel @@ -6,16 +6,19 @@ go_library( "backfilling.go", "callback.go", "column.go", + "constant.go", "ddl.go", "ddl_algorithm.go", "ddl_api.go", "ddl_tiflash_api.go", "ddl_worker.go", + "ddl_workerpool.go", "delete_range.go", "delete_range_util.go", "foreign_key.go", "generated_column.go", "index.go", + "job_table.go", "mock.go", "multi_schema_change.go", "options.go", @@ -144,6 +147,7 @@ go_test( "index_change_test.go", "index_modify_test.go", "integration_test.go", + "job_table_test.go", "main_test.go", "modify_column_test.go", "multi_schema_change_test.go", @@ -172,6 +176,7 @@ go_test( deps = [ "//config", "//ddl/placement", + "//ddl/schematracker", "//ddl/testutil", "//ddl/util", "//domain", @@ -223,6 +228,7 @@ go_test( "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_pingcap_log//:log", + "@com_github_stretchr_testify//assert", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_client_go_v2//testutils", diff --git a/ddl/backfilling.go b/ddl/backfilling.go index 0b4ff4b6d554e..6a1e5ff0ecfa5 100644 --- a/ddl/backfilling.go +++ b/ddl/backfilling.go @@ -409,7 +409,7 @@ func (w *worker) handleReorgTasks(reorgInfo *reorgInfo, totalAddedCount *int64, if err != nil { // Update the reorg handle that has been processed. - err1 := reorgInfo.UpdateReorgMeta(nextKey) + err1 := reorgInfo.UpdateReorgMeta(nextKey, w.sessPool) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblError).Observe(elapsedTime.Seconds()) logutil.BgLogger().Warn("[ddl] backfill worker handle batch tasks failed", zap.ByteString("elementType", reorgInfo.currElement.TypeKey), diff --git a/ddl/callback.go b/ddl/callback.go index e74c405af44d2..84b22cdfed944 100644 --- a/ddl/callback.go +++ b/ddl/callback.go @@ -39,7 +39,7 @@ type Interceptor interface { type BaseInterceptor struct{} // OnGetInfoSchema implements Interceptor.OnGetInfoSchema interface. -func (bi *BaseInterceptor) OnGetInfoSchema(ctx sessionctx.Context, is infoschema.InfoSchema) infoschema.InfoSchema { +func (*BaseInterceptor) OnGetInfoSchema(_ sessionctx.Context, is infoschema.InfoSchema) infoschema.InfoSchema { return is } @@ -55,6 +55,10 @@ type Callback interface { OnJobUpdated(job *model.Job) // OnWatched is called after watching owner is completed. OnWatched(ctx context.Context) + // OnGetJobBefore is called before getting job. + OnGetJobBefore(jobType string) + // OnGetJobAfter is called after getting job. + OnGetJobAfter(jobType string, job *model.Job) } // BaseCallback implements Callback.OnChanged interface. @@ -62,27 +66,37 @@ type BaseCallback struct { } // OnChanged implements Callback interface. -func (c *BaseCallback) OnChanged(err error) error { +func (*BaseCallback) OnChanged(err error) error { return err } // OnSchemaStateChanged implements Callback interface. -func (c *BaseCallback) OnSchemaStateChanged() { +func (*BaseCallback) OnSchemaStateChanged() { // Nothing to do. } // OnJobRunBefore implements Callback.OnJobRunBefore interface. -func (c *BaseCallback) OnJobRunBefore(job *model.Job) { +func (*BaseCallback) OnJobRunBefore(_ *model.Job) { // Nothing to do. } // OnJobUpdated implements Callback.OnJobUpdated interface. -func (c *BaseCallback) OnJobUpdated(job *model.Job) { +func (*BaseCallback) OnJobUpdated(job *model.Job) { // Nothing to do. } // OnWatched implements Callback.OnWatched interface. -func (c *BaseCallback) OnWatched(ctx context.Context) { +func (*BaseCallback) OnWatched(ctx context.Context) { + // Nothing to do. +} + +// OnGetJobBefore implements Callback.OnGetJobBefore interface. +func (c *BaseCallback) OnGetJobBefore(jobType string) { + // Nothing to do. +} + +// OnGetJobAfter implements Callback.OnGetJobAfter interface. +func (c *BaseCallback) OnGetJobAfter(jobType string, job *model.Job) { // Nothing to do. } @@ -160,7 +174,7 @@ func (c *ctcCallback) OnSchemaStateChanged() { } // OnJobRunBefore is used to run the user customized logic of `onJobRunBefore` first. -func (c *ctcCallback) OnJobRunBefore(job *model.Job) { +func (*ctcCallback) OnJobRunBefore(job *model.Job) { log.Info("on job run before", zap.String("job", job.String())) // Only block the ctc type ddl here. if job.Type != model.ActionModifyColumn { diff --git a/ddl/callback_test.go b/ddl/callback_test.go index c8975da252cad..85e26209fff7c 100644 --- a/ddl/callback_test.go +++ b/ddl/callback_test.go @@ -52,6 +52,8 @@ type TestDDLCallback struct { onJobUpdated func(*model.Job) OnJobUpdatedExported func(*model.Job) onWatched func(ctx context.Context) + OnGetJobBeforeExported func(string) + OnGetJobAfterExported func(string, *model.Job) } // OnChanged mock the same behavior with the main DDL hook. @@ -118,6 +120,24 @@ func (tc *TestDDLCallback) OnWatched(ctx context.Context) { tc.BaseCallback.OnWatched(ctx) } +// OnGetJobBefore implements Callback.OnGetJobBefore interface. +func (tc *TestDDLCallback) OnGetJobBefore(jobType string) { + if tc.OnGetJobBeforeExported != nil { + tc.OnGetJobBeforeExported(jobType) + return + } + tc.BaseCallback.OnGetJobBefore(jobType) +} + +// OnGetJobAfter implements Callback.OnGetJobAfter interface. +func (tc *TestDDLCallback) OnGetJobAfter(jobType string, job *model.Job) { + if tc.OnGetJobAfterExported != nil { + tc.OnGetJobAfterExported(jobType, job) + return + } + tc.BaseCallback.OnGetJobAfter(jobType, job) +} + func TestCallback(t *testing.T) { cb := &BaseCallback{} require.Nil(t, cb.OnChanged(nil)) diff --git a/ddl/column.go b/ddl/column.go index 29b16c17140fd..879c3b87c4314 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -51,38 +51,6 @@ import ( "go.uber.org/zap" ) -func createColumnInfoWithPosCheck(tblInfo *model.TableInfo, colInfo *model.ColumnInfo, pos *ast.ColumnPosition) (*model.ColumnInfo, *ast.ColumnPosition, int, error) { - // Check column name duplicate. - cols := tblInfo.Columns - offset := len(cols) - // Should initialize pos when it is nil. - if pos == nil { - pos = &ast.ColumnPosition{} - } - // Get column offset. - if pos.Tp == ast.ColumnPositionFirst { - offset = 0 - } else if pos.Tp == ast.ColumnPositionAfter { - c := model.FindColumnInfo(cols, pos.RelativeColumn.Name.L) - if c == nil { - return nil, pos, 0, infoschema.ErrColumnNotExists.GenWithStackByArgs(pos.RelativeColumn, tblInfo.Name) - } - - // Insert offset is after the mentioned column. - offset = c.Offset + 1 - } - colInfo.ID = allocateColumnID(tblInfo) - colInfo.State = model.StateNone - // To support add column asynchronous, we should mark its offset as the last column. - // So that we can use origin column offset to get value from row. - colInfo.Offset = len(cols) - - // Append the column info to the end of the tblInfo.Columns. - // It will reorder to the right offset in "Columns" when it state change to public. - tblInfo.Columns = append(cols, colInfo) - return colInfo, pos, offset, nil -} - func initAndAddColumnToTable(tblInfo *model.TableInfo, colInfo *model.ColumnInfo) *model.ColumnInfo { cols := tblInfo.Columns colInfo.ID = allocateColumnID(tblInfo) @@ -151,7 +119,7 @@ func onAddColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) if err != nil { if ifNotExists && infoschema.ErrColumnExists.Equal(err) { job.Warning = toTError(err) - job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + job.State = model.JobStateDone return ver, nil } return ver, errors.Trace(err) @@ -262,7 +230,7 @@ func onDropColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) if ifExists && dbterror.ErrCantDropFieldOrKey.Equal(err) { // Convert the "not exists" error to a warning. job.Warning = toTError(err) - job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) + job.State = model.JobStateDone return ver, nil } return ver, errors.Trace(err) @@ -361,7 +329,7 @@ func checkDropColumn(t *meta.Meta, job *model.Job) (*model.TableInfo, *model.Col job.State = model.JobStateCancelled return nil, nil, nil, ifExists, dbterror.ErrCantDropFieldOrKey.GenWithStack("column %s doesn't exist", colName) } - if err = isDroppableColumn(job.MultiSchemaInfo != nil, tblInfo, colName); err != nil { + if err = isDroppableColumn(tblInfo, colName); err != nil { job.State = model.JobStateCancelled return nil, nil, nil, false, errors.Trace(err) } @@ -462,11 +430,13 @@ type modifyingColInfo struct { changingCol *model.ColumnInfo changingIdxs []*model.IndexInfo pos *ast.ColumnPosition + removedIdxs []int64 } func getModifyColumnInfo(t *meta.Meta, job *model.Job) (*model.DBInfo, *model.TableInfo, *model.ColumnInfo, *modifyingColInfo, error) { modifyInfo := &modifyingColInfo{pos: &ast.ColumnPosition{}} - err := job.DecodeArgs(&modifyInfo.newCol, &modifyInfo.oldColName, modifyInfo.pos, &modifyInfo.modifyColumnTp, &modifyInfo.updatedAutoRandomBits, &modifyInfo.changingCol, &modifyInfo.changingIdxs) + err := job.DecodeArgs(&modifyInfo.newCol, &modifyInfo.oldColName, modifyInfo.pos, &modifyInfo.modifyColumnTp, + &modifyInfo.updatedAutoRandomBits, &modifyInfo.changingCol, &modifyInfo.changingIdxs, &modifyInfo.removedIdxs) if err != nil { job.State = model.JobStateCancelled return nil, nil, nil, modifyInfo, errors.Trace(err) @@ -571,8 +541,8 @@ func (w *worker) onModifyColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in return ver, errors.Trace(err) } - if modifyInfo.changingCol == nil { - changingColPos := &ast.ColumnPosition{Tp: ast.ColumnPositionNone} + changingCol := modifyInfo.changingCol + if changingCol == nil { newColName := model.NewCIStr(genChangingColumnUniqueName(tblInfo, oldCol)) if mysql.HasPriKeyFlag(oldCol.GetFlag()) { job.State = model.JobStateCancelled @@ -580,45 +550,63 @@ func (w *worker) onModifyColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in return ver, dbterror.ErrUnsupportedModifyColumn.GenWithStackByArgs(msg) } - modifyInfo.changingCol = modifyInfo.newCol.Clone() - modifyInfo.changingCol.Name = newColName - modifyInfo.changingCol.ChangeStateInfo = &model.ChangeStateInfo{DependencyColumnOffset: oldCol.Offset} - originDefVal, err := getOriginDefaultValueForModifyColumn(d, modifyInfo.changingCol, oldCol) + changingCol = modifyInfo.newCol.Clone() + changingCol.Name = newColName + changingCol.ChangeStateInfo = &model.ChangeStateInfo{DependencyColumnOffset: oldCol.Offset} + + originDefVal, err := getOriginDefaultValueForModifyColumn(d, changingCol, oldCol) if err != nil { return ver, errors.Trace(err) } - if err = modifyInfo.changingCol.SetOriginDefaultValue(originDefVal); err != nil { - return ver, errors.Trace(err) - } - - _, _, _, err = createColumnInfoWithPosCheck(tblInfo, modifyInfo.changingCol, changingColPos) - if err != nil { - job.State = model.JobStateCancelled + if err = changingCol.SetOriginDefaultValue(originDefVal); err != nil { return ver, errors.Trace(err) } - idxInfos, offsets := findIndexesByColName(tblInfo.Indices, oldCol.Name.L) - modifyInfo.changingIdxs = make([]*model.IndexInfo, 0, len(idxInfos)) - for i, idxInfo := range idxInfos { - newIdxInfo := idxInfo.Clone() - newIdxInfo.Name = model.NewCIStr(genChangingIndexUniqueName(tblInfo, idxInfo)) - newIdxInfo.ID = allocateIndexID(tblInfo) - newIdxChangingCol := newIdxInfo.Columns[offsets[i]] - newIdxChangingCol.Name = newColName - newIdxChangingCol.Offset = modifyInfo.changingCol.Offset - canPrefix := types.IsTypePrefixable(modifyInfo.changingCol.GetType()) - if !canPrefix || (canPrefix && modifyInfo.changingCol.GetFlen() < newIdxChangingCol.Length) { - newIdxChangingCol.Length = types.UnspecifiedLength + initAndAddColumnToTable(tblInfo, changingCol) + indexesToChange := findRelatedIndexesToChange(tblInfo, oldCol.Name) + for _, info := range indexesToChange { + newIdxID := allocateIndexID(tblInfo) + if !info.isTemp { + // We create a temp index for each normal index. + tmpIdx := info.indexInfo.Clone() + tmpIdxName := genChangingIndexUniqueName(tblInfo, info.indexInfo) + setIdxIDName(tmpIdx, newIdxID, model.NewCIStr(tmpIdxName)) + setIdxColNameOffset(tmpIdx.Columns[info.offset], changingCol) + tblInfo.Indices = append(tblInfo.Indices, tmpIdx) + } else { + // The index is a temp index created by previous modify column job(s). + // We can overwrite it to reduce reorg cost, because it will be dropped eventually. + tmpIdx := info.indexInfo + oldTempIdxID := tmpIdx.ID + setIdxIDName(tmpIdx, newIdxID, tmpIdx.Name /* unchanged */) + setIdxColNameOffset(tmpIdx.Columns[info.offset], changingCol) + modifyInfo.removedIdxs = append(modifyInfo.removedIdxs, oldTempIdxID) } - modifyInfo.changingIdxs = append(modifyInfo.changingIdxs, newIdxInfo) } - tblInfo.Indices = append(tblInfo.Indices, modifyInfo.changingIdxs...) } else { - tblInfo.Columns[len(tblInfo.Columns)-1] = modifyInfo.changingCol - copy(tblInfo.Indices[len(tblInfo.Indices)-len(modifyInfo.changingIdxs):], modifyInfo.changingIdxs) + changingCol = model.FindColumnInfoByID(tblInfo.Columns, modifyInfo.changingCol.ID) + if changingCol == nil { + logutil.BgLogger().Error("[ddl] the changing column has been removed", zap.Error(err)) + job.State = model.JobStateCancelled + return ver, errors.Trace(infoschema.ErrColumnNotExists.GenWithStackByArgs(oldCol.Name, tblInfo.Name)) + } } - return w.doModifyColumnTypeWithData(d, t, job, dbInfo, tblInfo, modifyInfo.changingCol, oldCol, modifyInfo.newCol.Name, modifyInfo.pos, modifyInfo.changingIdxs) + return w.doModifyColumnTypeWithData(d, t, job, dbInfo, tblInfo, changingCol, oldCol, modifyInfo.newCol.Name, modifyInfo.pos, modifyInfo.removedIdxs) +} + +func setIdxIDName(idxInfo *model.IndexInfo, newID int64, newName model.CIStr) { + idxInfo.ID = newID + idxInfo.Name = newName +} + +func setIdxColNameOffset(idxCol *model.IndexColumn, changingCol *model.ColumnInfo) { + idxCol.Name = changingCol.Name + idxCol.Offset = changingCol.Offset + canPrefix := types.IsTypePrefixable(changingCol.GetType()) + if !canPrefix || (changingCol.GetFlen() < idxCol.Length) { + idxCol.Length = types.UnspecifiedLength + } } // rollbackModifyColumnJobWithData is used to rollback modify-column job which need to reorg the data. @@ -630,34 +618,50 @@ func rollbackModifyColumnJobWithData(d *ddlCtx, t *meta.Meta, tblInfo *model.Tab // Reset PreventNullInsertFlag flag. tblInfo.Columns[oldCol.Offset].SetFlag(oldCol.GetFlag() &^ mysql.PreventNullInsertFlag) } + var changingIdxIDs []int64 if modifyInfo.changingCol != nil { - // changingCol isn't nil means the job has been in the mid state. These appended changingCol and changingIndex should + changingIdxIDs = buildRelatedIndexIDs(tblInfo, modifyInfo.changingCol.ID) + // The job is in the middle state. The appended changingCol and changingIndex should // be removed from the tableInfo as well. - tblInfo.Columns = tblInfo.Columns[:len(tblInfo.Columns)-1] - tblInfo.Indices = tblInfo.Indices[:len(tblInfo.Indices)-len(modifyInfo.changingIdxs)] + removeChangingColAndIdxs(tblInfo, modifyInfo.changingCol.ID) } ver, err = updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, true) if err != nil { return ver, errors.Trace(err) } job.FinishTableJob(model.JobStateRollbackDone, model.StateNone, ver, tblInfo) - // Refactor the job args to add the abandoned temporary index ids into delete range table. - idxIDs := make([]int64, 0, len(modifyInfo.changingIdxs)) - for _, idx := range modifyInfo.changingIdxs { - idxIDs = append(idxIDs, idx.ID) - } - job.Args = []interface{}{idxIDs, getPartitionIDs(tblInfo)} + // Reconstruct the job args to add the temporary index ids into delete range table. + job.Args = []interface{}{changingIdxIDs, getPartitionIDs(tblInfo)} return ver, nil } +func removeChangingColAndIdxs(tblInfo *model.TableInfo, changingColID int64) { + restIdx := tblInfo.Indices[:0] + for _, idx := range tblInfo.Indices { + if !idx.HasColumnInIndexColumns(tblInfo, changingColID) { + restIdx = append(restIdx, idx) + } + } + tblInfo.Indices = restIdx + + restCols := tblInfo.Columns[:0] + for _, c := range tblInfo.Columns { + if c.ID != changingColID { + restCols = append(restCols, c) + } + } + tblInfo.Columns = restCols +} + func (w *worker) doModifyColumnTypeWithData( d *ddlCtx, t *meta.Meta, job *model.Job, dbInfo *model.DBInfo, tblInfo *model.TableInfo, changingCol, oldCol *model.ColumnInfo, - colName model.CIStr, pos *ast.ColumnPosition, changingIdxs []*model.IndexInfo) (ver int64, _ error) { + colName model.CIStr, pos *ast.ColumnPosition, rmIdxIDs []int64) (ver int64, _ error) { var err error originalState := changingCol.State targetCol := changingCol.Clone() targetCol.Name = colName + changingIdxs := buildRelatedIndexInfos(tblInfo, changingCol.ID) switch changingCol.State { case model.StateNone: // Column from null to not null. @@ -697,8 +701,8 @@ func (w *worker) doModifyColumnTypeWithData( // Make sure job args change after `updateVersionAndTableInfoWithCheck`, otherwise, the job args will // be updated in `updateDDLJob` even if it meets an error in `updateVersionAndTableInfoWithCheck`. job.SchemaState = model.StateDeleteOnly - metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn).Set(0) - job.Args = append(job.Args, changingCol, changingIdxs) + metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn, job.SchemaName, tblInfo.Name.String()).Set(0) + job.Args = append(job.Args, changingCol, changingIdxs, rmIdxIDs) case model.StateDeleteOnly: // Column from null to not null. if !mysql.HasNotNullFlag(oldCol.GetFlag()) && mysql.HasNotNullFlag(changingCol.GetFlag()) { @@ -735,12 +739,16 @@ func (w *worker) doModifyColumnTypeWithData( } var done bool - done, ver, err = doReorgWorkForModifyColumn(w, d, t, job, tbl, oldCol, changingCol, changingIdxs) + if job.MultiSchemaInfo != nil { + done, ver, err = doReorgWorkForModifyColumnMultiSchema(w, d, t, job, tbl, oldCol, changingCol, changingIdxs) + } else { + done, ver, err = doReorgWorkForModifyColumn(w, d, t, job, tbl, oldCol, changingCol, changingIdxs) + } if !done { return ver, err } - oldIdxIDs := getOldIndexIDs(tblInfo, oldCol) // used by GC delete range. + rmIdxIDs = append(buildRelatedIndexIDs(tblInfo, oldCol.ID), rmIdxIDs...) err = adjustTableInfoAfterModifyColumnWithData(tblInfo, pos, oldCol, changingCol, colName, changingIdxs) if err != nil { @@ -757,7 +765,7 @@ func (w *worker) doModifyColumnTypeWithData( // Finish this job. job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) // Refactor the job args to add the old index ids into delete range table. - job.Args = []interface{}{oldIdxIDs, getPartitionIDs(tblInfo)} + job.Args = []interface{}{rmIdxIDs, getPartitionIDs(tblInfo)} asyncNotifyEvent(d, &ddlutil.Event{Tp: model.ActionModifyColumn, TableInfo: tblInfo, ColumnInfos: []*model.ColumnInfo{changingCol}}) default: err = dbterror.ErrInvalidDDLState.GenWithStackByArgs("column", changingCol.State) @@ -766,9 +774,24 @@ func (w *worker) doModifyColumnTypeWithData( return ver, errors.Trace(err) } +func doReorgWorkForModifyColumnMultiSchema(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, + oldCol, changingCol *model.ColumnInfo, changingIdxs []*model.IndexInfo) (done bool, ver int64, err error) { + if job.MultiSchemaInfo.Revertible { + done, ver, err = doReorgWorkForModifyColumn(w, d, t, job, tbl, oldCol, changingCol, changingIdxs) + if done { + // We need another round to wait for all the others sub-jobs to finish. + job.MarkNonRevertible() + } + // We need another round to run the reorg process. + return false, ver, err + } + // Non-revertible means all the sub jobs finished. + return true, ver, err +} + func doReorgWorkForModifyColumn(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, oldCol, changingCol *model.ColumnInfo, changingIdxs []*model.IndexInfo) (done bool, ver int64, err error) { - rh := newReorgHandler(t) + rh := newReorgHandler(t, w.sess, w.concurrentDDL) reorgInfo, err := getReorgInfo(d.jobContext(job), d, rh, job, tbl, BuildElements(changingCol, changingIdxs)) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version @@ -819,8 +842,9 @@ func adjustTableInfoAfterModifyColumnWithData(tblInfo *model.TableInfo, pos *ast internalColName := changingCol.Name changingCol = replaceOldColumn(tblInfo, oldCol, changingCol, newName) if len(changingIdxs) > 0 { - replaceOldIndexes(tblInfo, changingIdxs) - updateNewIndexesCols(tblInfo, internalColName, newName, changingCol.Offset) + updateNewIdxColsNameOffset(changingIdxs, internalColName, changingCol) + indexesToRemove := filterIndexesToRemove(changingIdxs, newName, tblInfo) + replaceOldIndexes(tblInfo, indexesToRemove) } // Move the new column to a correct offset. destOffset, err := locateOffsetToMove(changingCol.Offset, pos, tblInfo) @@ -833,18 +857,10 @@ func adjustTableInfoAfterModifyColumnWithData(tblInfo *model.TableInfo, pos *ast func replaceOldColumn(tblInfo *model.TableInfo, oldCol, changingCol *model.ColumnInfo, newName model.CIStr) *model.ColumnInfo { - // Replace the old column. - tblInfo.Columns[oldCol.Offset] = changingCol - tblInfo.Columns[changingCol.Offset] = nil + tblInfo.MoveColumnInfo(changingCol.Offset, len(tblInfo.Columns)-1) changingCol = updateChangingCol(changingCol, newName, oldCol.Offset) - // Remove nil column. - tmp := tblInfo.Columns[:0] - for _, c := range tblInfo.Columns { - if c != nil { - tmp = append(tmp, c) - } - } - tblInfo.Columns = tmp + tblInfo.Columns[oldCol.Offset] = changingCol + tblInfo.Columns = tblInfo.Columns[:len(tblInfo.Columns)-1] return changingCol } @@ -879,18 +895,40 @@ func replaceOldIndexes(tblInfo *model.TableInfo, changingIdxs []*model.IndexInfo } } -func updateNewIndexesCols(tblInfo *model.TableInfo, oldName, newName model.CIStr, newOffset int) { - for _, idx := range tblInfo.Indices { - for i, col := range idx.Columns { +// updateNewIdxColsNameOffset updates the name&offset of the index column. +func updateNewIdxColsNameOffset(changingIdxs []*model.IndexInfo, + oldName model.CIStr, changingCol *model.ColumnInfo) { + for _, idx := range changingIdxs { + for _, col := range idx.Columns { if col.Name.L == oldName.L { - idx.Columns[i].Name = newName - idx.Columns[i].Offset = newOffset - break + setIdxColNameOffset(col, changingCol) } } } } +// filterIndexesToRemove filters out the indexes that can be removed. +func filterIndexesToRemove(changingIdxs []*model.IndexInfo, colName model.CIStr, tblInfo *model.TableInfo) []*model.IndexInfo { + indexesToRemove := make([]*model.IndexInfo, 0, len(changingIdxs)) + for _, idx := range changingIdxs { + var hasOtherChangingCol bool + for _, col := range idx.Columns { + if col.Name.L == colName.L { + continue // ignore the current modifying column. + } + if !hasOtherChangingCol { + hasOtherChangingCol = tblInfo.Columns[col.Offset].ChangeStateInfo != nil + } + } + // For the indexes that still contains other changing column, skip removing it now. + // We leave the removal work to the last modify column job. + if !hasOtherChangingCol { + indexesToRemove = append(indexesToRemove, idx) + } + } + return indexesToRemove +} + func updateChangingCol(col *model.ColumnInfo, newName model.CIStr, newOffset int) *model.ColumnInfo { col.Name = newName col.ChangeStateInfo = nil @@ -903,14 +941,21 @@ func updateChangingCol(col *model.ColumnInfo, newName model.CIStr, newOffset int return col } -func getOldIndexIDs(tblInfo *model.TableInfo, oldCol *model.ColumnInfo) []int64 { +func buildRelatedIndexInfos(tblInfo *model.TableInfo, colID int64) []*model.IndexInfo { + var indexInfos []*model.IndexInfo + for _, idx := range tblInfo.Indices { + if idx.HasColumnInIndexColumns(tblInfo, colID) { + indexInfos = append(indexInfos, idx) + } + } + return indexInfos +} + +func buildRelatedIndexIDs(tblInfo *model.TableInfo, colID int64) []int64 { var oldIdxIDs []int64 for _, idx := range tblInfo.Indices { - for _, idxCol := range idx.Columns { - if tblInfo.Columns[idxCol.Offset].ID == oldCol.ID { - oldIdxIDs = append(oldIdxIDs, idx.ID) - break - } + if idx.HasColumnInIndexColumns(tblInfo, colID) { + oldIdxIDs = append(oldIdxIDs, idx.ID) } } return oldIdxIDs @@ -1017,7 +1062,7 @@ func (w *worker) updateColumnAndIndexes(t table.Table, oldCol, col *model.Column // Update the element in the reorgInfo for updating the reorg meta below. reorgInfo.currElement = reorgInfo.elements[i+1] // Write the reorg info to store so the whole reorganize process can recover from panic. - err := reorgInfo.UpdateReorgMeta(reorgInfo.StartKey) + err := reorgInfo.UpdateReorgMeta(reorgInfo.StartKey, w.sessPool) logutil.BgLogger().Info("[ddl] update column and indexes", zap.Int64("jobID", reorgInfo.Job.ID), zap.ByteString("elementType", reorgInfo.currElement.TypeKey), @@ -1058,7 +1103,7 @@ func newUpdateColumnWorker(sessCtx sessionctx.Context, id int, t table.PhysicalT backfillWorker: newBackfillWorker(sessCtx, id, t, reorgInfo), oldColInfo: oldCol, newColInfo: newCol, - metricCounter: metrics.BackfillTotalCounter.WithLabelValues("update_col_rate"), + metricCounter: metrics.BackfillTotalCounter.WithLabelValues(metrics.GenerateReorgLabel("update_col_rate", reorgInfo.SchemaName, t.Meta().Name.String())), rowDecoder: rowDecoder, rowMap: make(map[int64]types.Datum, len(decodeColMap)), sqlMode: reorgInfo.ReorgMeta.SQLMode, @@ -1313,6 +1358,12 @@ func (w *worker) doModifyColumn( } } + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + // Store the mark and enter the next DDL handling loop. + return updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, false) + } + if err := adjustTableInfoAfterModifyColumn(tblInfo, newCol, oldCol, pos); err != nil { job.State = model.JobStateRollingback return ver, errors.Trace(err) @@ -1346,7 +1397,7 @@ func adjustTableInfoAfterModifyColumn( } tblInfo.Columns[oldCol.Offset] = newCol tblInfo.MoveColumnInfo(oldCol.Offset, destOffset) - updateNewIndexesCols(tblInfo, oldCol.Name, newCol.Name, newCol.Offset) + updateNewIdxColsNameOffset(tblInfo.Indices, oldCol.Name, newCol) return nil } @@ -1469,6 +1520,13 @@ func updateColumnDefaultValue(d *ddlCtx, t *meta.Meta, job *model.Job, newCol *m if err != nil { return ver, errors.Trace(err) } + + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + // Store the mark and enter the next DDL handling loop. + return updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, false) + } + oldCol := model.FindColumnInfo(tblInfo.Columns, oldColName.L) if oldCol == nil || oldCol.State != model.StatePublic { job.State = model.JobStateCancelled @@ -1511,7 +1569,7 @@ func isColumnWithIndex(colName string, indices []*model.IndexInfo) bool { return false } -func isColumnCanDropWithIndex(isMultiSchemaChange bool, colName string, indices []*model.IndexInfo) error { +func isColumnCanDropWithIndex(colName string, indices []*model.IndexInfo) error { for _, indexInfo := range indices { if indexInfo.Primary || len(indexInfo.Columns) > 1 { for _, col := range indexInfo.Columns { @@ -1520,9 +1578,6 @@ func isColumnCanDropWithIndex(isMultiSchemaChange bool, colName string, indices } } } - if len(indexInfo.Columns) == 1 && indexInfo.Columns[0].Name.L == colName && !isMultiSchemaChange { - return dbterror.ErrCantDropColWithIndex.GenWithStack("can't drop column %s with tidb_enable_change_multi_schema is disable", colName) - } } return nil } @@ -1649,6 +1704,11 @@ func generateOriginDefaultValue(col *model.ColumnInfo, ctx sessionctx.Context) ( return odValue, nil } +// FindColumnIndexCols finds column in index +func FindColumnIndexCols(c string, cols []*model.IndexColumn) *model.IndexColumn { + return findColumnInIndexCols(c, cols) +} + func findColumnInIndexCols(c string, cols []*model.IndexColumn) *model.IndexColumn { for _, c1 := range cols { if c == c1.Name.L { diff --git a/ddl/constant.go b/ddl/constant.go new file mode 100644 index 0000000000000..03e8d1fcfaaa5 --- /dev/null +++ b/ddl/constant.go @@ -0,0 +1,35 @@ +// 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 ddl + +import ( + "github.com/pingcap/tidb/meta" +) + +const ( + // JobTable stores the information of DDL jobs. + JobTable = "tidb_ddl_job" + // ReorgTable stores the information of DDL reorganization. + ReorgTable = "tidb_ddl_reorg" + // HistoryTable stores the history DDL jobs. + HistoryTable = "tidb_ddl_history" + + // JobTableID is the table ID of `tidb_ddl_job`. + JobTableID = meta.MaxInt48 - 1 + // ReorgTableID is the table ID of `tidb_ddl_reorg`. + ReorgTableID = meta.MaxInt48 - 2 + // HistoryTableID is the table ID of `tidb_ddl_history`. + HistoryTableID = meta.MaxInt48 - 3 +) diff --git a/ddl/db_cache_test.go b/ddl/db_cache_test.go index 8343cad58f37b..67aab9bb40edb 100644 --- a/ddl/db_cache_test.go +++ b/ddl/db_cache_test.go @@ -273,6 +273,7 @@ func TestIssue34069(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() sem.Enable() + defer sem.Disable() tk := testkit.NewTestKit(t, store) tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil) diff --git a/ddl/db_change_test.go b/ddl/db_change_test.go index 5efbd6dc3b688..5589a3ff77c03 100644 --- a/ddl/db_change_test.go +++ b/ddl/db_change_test.go @@ -1378,7 +1378,7 @@ func prepareTestControlParallelExecSQL(t *testing.T, store kv.Storage, dom *doma require.NoError(t, err) txn, err := sess.Txn(true) require.NoError(t, err) - jobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + jobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) qLen = len(jobs) if qLen == 2 { @@ -1407,7 +1407,7 @@ func prepareTestControlParallelExecSQL(t *testing.T, store kv.Storage, dom *doma require.NoError(t, err) txn, err := sess.Txn(true) require.NoError(t, err) - jobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + jobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) qLen = len(jobs) if qLen == 1 { @@ -1961,19 +1961,6 @@ func TestExpressionIndexDDLError(t *testing.T) { tk.MustGetErrCode("alter table t drop column b", errno.ErrDependentByFunctionalIndex) } -func TestRestrainDropColumnWithIndex(t *testing.T) { - store, clean := testkit.CreateMockStore(t) - defer clean() - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table t (a int, b int, index(a))") - tk.MustExec("set @@GLOBAL.tidb_enable_change_multi_schema=0") - tk.MustQuery("select @@tidb_enable_change_multi_schema").Check(testkit.Rows("0")) - tk.MustGetErrCode("alter table t drop column a", errno.ErrUnsupportedDDLOperation) - tk.MustExec("set @@GLOBAL.tidb_enable_change_multi_schema=1") - tk.MustExec("alter table t drop column a") -} - func TestParallelRenameTable(t *testing.T) { store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index a0a9f57106181..abbdc25775182 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/schematracker" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" @@ -148,8 +149,13 @@ func TestInvalidNameWhenCreateTable(t *testing.T) { // TestCreateTableIfNotExistsLike for issue #6879 func TestCreateTableIfNotExistsLike(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") @@ -175,8 +181,13 @@ func TestCreateTableIfNotExistsLike(t *testing.T) { // for issue #9910 func TestCreateTableWithKeyWord(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") @@ -620,13 +631,6 @@ func TestErrnoErrorCode(t *testing.T) { tk.MustExec("create table test_error_code_null(c1 char(100) not null);") sql = "insert into test_error_code_null (c1) values(null);" tk.MustGetErrCode(sql, errno.ErrBadNull) - // disable tidb_enable_change_multi_schema - tk.MustExec("set global tidb_enable_change_multi_schema = false") - sql = "alter table test_error_code_null add column (x1 int, x2 int)" - tk.MustGetErrCode(sql, errno.ErrUnsupportedDDLOperation) - sql = "alter table test_error_code_null add column (x1 int, x2 int)" - tk.MustGetErrCode(sql, errno.ErrUnsupportedDDLOperation) - tk.MustExec("set global tidb_enable_change_multi_schema = true") } func TestTableDDLWithFloatType(t *testing.T) { @@ -2131,8 +2135,12 @@ func TestDefaultColumnWithUUID(t *testing.T) { } func TestChangingDBCharset(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + tk := testkit.NewTestKit(t, store) tk.MustExec("DROP DATABASE IF EXISTS alterdb1") diff --git a/ddl/db_partition_test.go b/ddl/db_partition_test.go index 41a3ddc3f3a7d..2b0cabaf44d6e 100644 --- a/ddl/db_partition_test.go +++ b/ddl/db_partition_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/schematracker" "github.com/pingcap/tidb/ddl/testutil" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -83,8 +84,13 @@ func checkGlobalIndexCleanUpDone(t *testing.T, ctx sessionctx.Context, tblInfo * } func TestCreateTableWithPartition(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists tp;") @@ -336,8 +342,13 @@ partition by range (a) } func TestCreateTableWithHashPartition(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists employees;") @@ -395,8 +406,13 @@ func TestCreateTableWithHashPartition(t *testing.T) { } func TestCreateTableWithRangeColumnPartition(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists log_message_1;") @@ -637,6 +653,10 @@ create table log_message_1 ( tk.MustExec("drop table if exists t;") tk.MustExec(`create table t(a binary) partition by range columns (a) (partition p0 values less than (X'0C'));`) + + // TODO: we haven't implement AlterTable in SchemaTracker yet + ddlChecker.Disable() + tk.MustExec(`alter table t add partition (partition p1 values less than (X'0D'), partition p2 values less than (X'0E'));`) tk.MustExec(`insert into t values (X'0B'), (X'0C'), (X'0D')`) tk.MustQuery(`select * from t where a < X'0D' order by a`).Check(testkit.Rows("\x0B", "\x0C")) @@ -785,8 +805,13 @@ func generatePartitionTableByNum(num int) string { } func TestCreateTableWithListPartition(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("set @@session.tidb_enable_list_partition = ON") @@ -932,8 +957,13 @@ func TestCreateTableWithListPartition(t *testing.T) { } func TestCreateTableWithListColumnsPartition(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("set @@session.tidb_enable_list_partition = ON") @@ -1467,8 +1497,13 @@ func TestAlterTableTruncatePartitionByListColumns(t *testing.T) { } func TestCreateTableWithKeyPartition(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists tm1;") @@ -1959,6 +1994,40 @@ func TestAlterTableExchangePartition(t *testing.T) { tk.MustQuery("select * from e7").Check(testkit.Rows("1")) tk.MustGetErrCode("alter table e6 exchange partition p1 with table e7", tmysql.ErrRowDoesNotMatchPartition) + // validation test for list partition + tk.MustExec("set @@tidb_enable_list_partition=true") + tk.MustExec(`CREATE TABLE t1 (store_id int) + PARTITION BY LIST (store_id) ( + PARTITION pNorth VALUES IN (1, 2, 3, 4, 5), + PARTITION pEast VALUES IN (6, 7, 8, 9, 10), + PARTITION pWest VALUES IN (11, 12, 13, 14, 15), + PARTITION pCentral VALUES IN (16, 17, 18, 19, 20) + );`) + tk.MustExec(`create table t2 (store_id int);`) + tk.MustExec(`insert into t1 values (1);`) + tk.MustExec(`insert into t1 values (6);`) + tk.MustExec(`insert into t1 values (11);`) + tk.MustExec(`insert into t2 values (3);`) + tk.MustExec("alter table t1 exchange partition pNorth with table t2") + + tk.MustQuery("select * from t1 partition(pNorth)").Check(testkit.Rows("3")) + tk.MustGetErrCode("alter table t1 exchange partition pEast with table t2", tmysql.ErrRowDoesNotMatchPartition) + + // validation test for list columns partition + tk.MustExec(`CREATE TABLE t3 (id int, store_id int) + PARTITION BY LIST COLUMNS (id, store_id) ( + PARTITION p0 VALUES IN ((1, 1), (2, 2)), + PARTITION p1 VALUES IN ((3, 3), (4, 4)) + );`) + tk.MustExec(`create table t4 (id int, store_id int);`) + tk.MustExec(`insert into t3 values (1, 1);`) + tk.MustExec(`insert into t4 values (2, 2);`) + tk.MustExec("alter table t3 exchange partition p0 with table t4") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 after the exchange, please analyze related table of the exchange to update statistics")) + + tk.MustQuery("select * from t3 partition(p0)").Check(testkit.Rows("2 2")) + tk.MustGetErrCode("alter table t3 exchange partition p1 with table t4", tmysql.ErrRowDoesNotMatchPartition) + // test exchange partition from different databases tk.MustExec("create table e8 (a int) partition by hash(a) partitions 2;") tk.MustExec("create database if not exists exchange_partition") @@ -2257,6 +2326,38 @@ func TestExchangePartitionTableCompatiable(t *testing.T) { "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, + }, } tk := testkit.NewTestKit(t, store) @@ -2280,6 +2381,43 @@ func TestExchangePartitionTableCompatiable(t *testing.T) { require.NoError(t, err) } +func TestExchangePartitionHook(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + // why use tkCancel, not tk. + tkCancel := testkit.NewTestKit(t, store) + + tk.MustExec("set @@tidb_enable_exchange_partition=1") + defer tk.MustExec("set @@tidb_enable_exchange_partition=0") + + tk.MustExec("use test") + tk.MustExec(`create table pt (a int) partition by range(a) ( + partition p0 values less than (3), + partition p1 values less than (6), + PARTITION p2 VALUES LESS THAN (9), + PARTITION p3 VALUES LESS THAN (MAXVALUE) + );`) + tk.MustExec(`create table nt(a int);`) + + tk.MustExec(`insert into pt values (0), (4), (7)`) + tk.MustExec("insert into nt values (1)") + + hook := &ddl.TestDDLCallback{Do: dom} + dom.DDL().SetHook(hook) + + hookFunc := func(job *model.Job) { + if job.Type == model.ActionExchangeTablePartition && job.SchemaState != model.StateNone { + tkCancel.MustExec("use test") + tkCancel.MustGetErrCode("insert into nt values (5)", tmysql.ErrRowDoesNotMatchGivenPartitionSet) + } + } + hook.OnJobUpdatedExported = hookFunc + + tk.MustExec("alter table pt exchange partition p0 with table nt") + tk.MustQuery("select * from pt partition(p0)").Check(testkit.Rows("1")) +} + func TestExchangePartitionExpressIndex(t *testing.T) { restore := config.RestoreFunc() defer restore() diff --git a/ddl/db_rename_test.go b/ddl/db_rename_test.go index 5017beb99615c..bacba15d1a602 100644 --- a/ddl/db_rename_test.go +++ b/ddl/db_rename_test.go @@ -19,8 +19,10 @@ import ( "testing" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl/schematracker" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" @@ -58,8 +60,14 @@ func TestRenameTableWithLocked(t *testing.T) { config.UpdateGlobal(func(conf *config.Config) { conf.EnableTableLock = true }) - store, clean := testkit.CreateMockStore(t) + + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("create database renamedb") tk.MustExec("create database renamedb2") @@ -93,8 +101,24 @@ func TestAlterTableRenameTable(t *testing.T) { } func renameTableTest(t *testing.T, sql string, isAlterTable bool) { - store, clean := testkit.CreateMockStore(t) - defer clean() + var ( + store kv.Storage + clean func() + ) + + if isAlterTable { + store, clean = testkit.CreateMockStore(t) + defer clean() + } else { + var dom *domain.Domain + store, dom, clean = testkit.CreateMockStoreAndDomain(t) + defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + } + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustGetErrCode("rename table tb1 to tb2;", errno.ErrNoSuchTable) @@ -197,8 +221,13 @@ func renameTableTest(t *testing.T, sql string, isAlterTable bool) { } func TestRenameMultiTables(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t1(id int)") diff --git a/ddl/db_table_test.go b/ddl/db_table_test.go index a385acd7e3427..b2550e4060555 100644 --- a/ddl/db_table_test.go +++ b/ddl/db_table_test.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/schematracker" testddlutil "github.com/pingcap/tidb/ddl/testutil" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -227,8 +228,13 @@ func TestTransactionOnAddDropColumn(t *testing.T) { } func TestCreateTableWithSetCol(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t_set (a int, b set('e') default '');") @@ -284,8 +290,13 @@ func TestCreateTableWithSetCol(t *testing.T) { } func TestCreateTableWithEnumCol(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // It's for failure cases. @@ -316,8 +327,13 @@ func TestCreateTableWithEnumCol(t *testing.T) { } func TestCreateTableWithIntegerColWithDefault(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // It's for failure cases. @@ -913,3 +929,41 @@ func TestAddColumn2(t *testing.T) { re.Check(testkit.Rows("1 2")) tk.MustQuery("select a,b,_tidb_rowid from t2").Check(testkit.Rows("1 3 2")) } + +func TestDropTables(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + + failedSQL := "drop table t1;" + tk.MustGetErrCode(failedSQL, errno.ErrBadTable) + failedSQL = "drop table test2.t1;" + tk.MustGetErrCode(failedSQL, errno.ErrBadTable) + + tk.MustExec("create table t1 (a int);") + tk.MustExec("drop table if exists t1, t2;") + + tk.MustExec("create table t1 (a int);") + tk.MustExec("drop table if exists t2, t1;") + + // Without IF EXISTS, the statement drops all named tables that do exist, and returns an error indicating which + // nonexisting tables it was unable to drop. + // https://dev.mysql.com/doc/refman/5.7/en/drop-table.html + tk.MustExec("create table t1 (a int);") + failedSQL = "drop table t1, t2;" + tk.MustGetErrCode(failedSQL, errno.ErrBadTable) + + tk.MustExec("create table t1 (a int);") + failedSQL = "drop table t2, t1;" + tk.MustGetErrCode(failedSQL, errno.ErrBadTable) + + failedSQL = "show create table t1;" + tk.MustGetErrCode(failedSQL, errno.ErrNoSuchTable) +} diff --git a/ddl/db_test.go b/ddl/db_test.go index 8f2c6ac06a9fa..5baa00377f19e 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/schematracker" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -536,9 +537,13 @@ func TestAddConstraintCheck(t *testing.T) { } func TestCreateTableIgnoreCheckConstraint(t *testing.T) { - store, clean := testkit.CreateMockStoreWithSchemaLease(t, dbTestLease) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists table_constraint_check") @@ -642,7 +647,7 @@ func TestAddExpressionIndexRollback(t *testing.T) { txn, err := ctx.Txn(true) require.NoError(t, err) m := meta.NewMeta(txn) - element, start, end, physicalID, err := m.GetDDLReorgHandle(currJob) + element, start, end, physicalID, err := ddl.NewReorgHandlerForTest(m, testkit.NewTestKit(t, store).Session()).GetDDLReorgHandle(currJob) require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) require.Nil(t, element) require.Nil(t, start) @@ -913,6 +918,67 @@ func TestShardRowIDBitsOnTemporaryTable(t *testing.T) { dbterror.ErrUnsupportedLocalTempTableDDL.GenWithStackByArgs("ALTER TABLE").Error()) } +func TestAutoIncrementIDOnTemporaryTable(t *testing.T) { + store, clean := testkit.CreateMockStoreWithSchemaLease(t, dbTestLease) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // global temporary table with auto_increment=0 + tk.MustExec("drop table if exists global_temp_auto_id") + tk.MustExec("create global temporary table global_temp_auto_id(id int primary key auto_increment) on commit delete rows") + tk.MustExec("begin") + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 1 AUTO_INCREMENT")) + tk.MustExec("insert into global_temp_auto_id value(null)") + tk.MustQuery("select @@last_insert_id").Check(testkit.Rows("1")) + tk.MustQuery("select id from global_temp_auto_id").Check(testkit.Rows("1")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 2 AUTO_INCREMENT")) + tk.MustExec("commit") + tk.MustExec("drop table global_temp_auto_id") + + // global temporary table with auto_increment=100 + tk.MustExec("create global temporary table global_temp_auto_id(id int primary key auto_increment) auto_increment=100 on commit delete rows") + // the result should be the same in each transaction + for i := 0; i < 2; i++ { + tk.MustQuery("show create table global_temp_auto_id").Check(testkit.Rows("global_temp_auto_id CREATE GLOBAL TEMPORARY TABLE `global_temp_auto_id` (\n" + + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=100 ON COMMIT DELETE ROWS")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 100 AUTO_INCREMENT")) + tk.MustExec("begin") + tk.MustExec("insert into global_temp_auto_id value(null)") + tk.MustQuery("select @@last_insert_id").Check(testkit.Rows("100")) + tk.MustQuery("select id from global_temp_auto_id").Check(testkit.Rows("100")) + tk.MustQuery("show table global_temp_auto_id next_row_id").Check(testkit.Rows("test global_temp_auto_id id 101 AUTO_INCREMENT")) + tk.MustExec("commit") + } + tk.MustExec("drop table global_temp_auto_id") + + // local temporary table with auto_increment=0 + tk.MustExec("create temporary table local_temp_auto_id(id int primary key auto_increment)") + // It doesn't matter to report an error since `show next_row_id` is an extended syntax. + err := tk.QueryToErr("show table local_temp_auto_id next_row_id") + require.EqualError(t, err, "[schema:1146]Table 'test.local_temp_auto_id' doesn't exist") + tk.MustExec("insert into local_temp_auto_id value(null)") + tk.MustQuery("select @@last_insert_id").Check(testkit.Rows("1")) + tk.MustQuery("select id from local_temp_auto_id").Check(testkit.Rows("1")) + tk.MustExec("drop table local_temp_auto_id") + + // local temporary table with auto_increment=100 + tk.MustExec("create temporary table local_temp_auto_id(id int primary key auto_increment) auto_increment=100") + tk.MustQuery("show create table local_temp_auto_id").Check(testkit.Rows("local_temp_auto_id CREATE TEMPORARY TABLE `local_temp_auto_id` (\n" + + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=100")) + tk.MustExec("insert into local_temp_auto_id value(null)") + tk.MustQuery("select @@last_insert_id").Check(testkit.Rows("100")) + tk.MustQuery("select id from local_temp_auto_id").Check(testkit.Rows("100")) + tk.MustQuery("show create table local_temp_auto_id").Check(testkit.Rows("local_temp_auto_id CREATE TEMPORARY TABLE `local_temp_auto_id` (\n" + + " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=101")) +} + func TestDDLJobErrorCount(t *testing.T) { store, dom, clean := testkit.CreateMockStoreAndDomainWithSchemaLease(t, dbTestLease) defer clean() @@ -1269,6 +1335,8 @@ func TestCancelJobWriteConflict(t *testing.T) { stmt := fmt.Sprintf("admin cancel ddl jobs %d", job.ID) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/kv/mockCommitErrorInNewTxn", `return("no_retry")`)) defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/kv/mockCommitErrorInNewTxn")) }() + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/mockCancelConcurencyDDL", `return(true)`)) + defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/mockCancelConcurencyDDL")) }() rs, cancelErr = tk2.Session().Execute(context.Background(), stmt) } } diff --git a/ddl/ddl.go b/ddl/ddl.go index cd8e5c4d4806e..96f0abeb0b12a 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -23,13 +23,18 @@ import ( "encoding/json" "flag" "fmt" + "runtime" + "strconv" + "strings" "sync" + "sync/atomic" "time" "github.com/google/uuid" "github.com/ngaut/pools" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" @@ -49,9 +54,12 @@ import ( "github.com/pingcap/tidb/table" pumpcli "github.com/pingcap/tidb/tidb-binlog/pump_client" tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/gcutil" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/sqlexec" "github.com/tikv/client-go/v2/tikvrpc" clientv3 "go.etcd.io/etcd/client/v3" atomicutil "go.uber.org/atomic" @@ -72,6 +80,9 @@ const ( batchAddingJobs = 10 + reorgWorkerCnt = 10 + generalWorkerCnt = 1 + // PartitionCountLimit is limit of the number of partitions in a table. // Reference linking https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations.html. PartitionCountLimit = 8192 @@ -89,6 +100,8 @@ const ( // supported by VIEWs at the moment. For other object types, this is // equivalent to OnExistError. OnExistReplace + + jobRecordCapacity = 16 ) var ( @@ -183,8 +196,14 @@ type DDL interface { GetHook() Callback // SetHook sets the hook. SetHook(h Callback) + // GetInfoSchemaWithInterceptor gets the infoschema binding to d. It's exported for testing. + GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infoschema.InfoSchema // DoDDLJob does the DDL job, it's exported for test. DoDDLJob(ctx sessionctx.Context, job *model.Job) error + // MoveJobFromQueue2Table move existing DDLs from queue to table. + MoveJobFromQueue2Table(bool) error + // MoveJobFromTable2Queue move existing DDLs from table to queue. + MoveJobFromTable2Queue() error } type limitJobTask struct { @@ -203,6 +222,46 @@ type ddl struct { sessPool *sessionPool delRangeMgr delRangeManager enableTiFlashPoll *atomicutil.Bool + // used in the concurrency ddl. + reorgWorkerPool *workerPool + generalDDLWorkerPool *workerPool + // get notification if any DDL coming. + ddlJobCh chan struct{} +} + +// waitSchemaSyncedController is to control whether to waitSchemaSynced or not. +type waitSchemaSyncedController struct { + mu sync.RWMutex + job map[int64]struct{} + + // true if this node is elected to the DDL owner, we should wait 2 * lease before it runs the first DDL job. + once *atomicutil.Bool +} + +func newWaitSchemaSyncedController() *waitSchemaSyncedController { + return &waitSchemaSyncedController{ + job: make(map[int64]struct{}, jobRecordCapacity), + once: atomicutil.NewBool(true), + } +} + +func (w *waitSchemaSyncedController) registerSync(job *model.Job) { + w.mu.Lock() + defer w.mu.Unlock() + w.job[job.ID] = struct{}{} +} + +func (w *waitSchemaSyncedController) isSynced(job *model.Job) bool { + w.mu.RLock() + defer w.mu.RUnlock() + _, ok := w.job[job.ID] + return !ok +} + +func (w *waitSchemaSyncedController) synced(job *model.Job) { + w.mu.Lock() + defer w.mu.Unlock() + delete(w.job, job.ID) } // ddlCtx is the context when we use worker to handle DDL jobs. @@ -222,6 +281,15 @@ type ddlCtx struct { tableLockCkr util.DeadTableLockChecker etcdCli *clientv3.Client + *waitSchemaSyncedController + *schemaVersionManager + // recording the running jobs. + runningJobs struct { + sync.RWMutex + ids map[int64]struct{} + } + // It holds the running DDL jobs ID. + runningJobIDs []string // reorgCtx is used for reorganization. reorgCtx struct { sync.RWMutex @@ -246,6 +314,51 @@ type ddlCtx struct { sync.Mutex seqNum uint64 } + + waiting *atomicutil.Bool +} + +// 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. +type schemaVersionManager struct { + schemaVersionMu sync.Mutex + // lockOwner stores the job ID that is holding the lock. + lockOwner atomicutil.Int64 +} + +func newSchemaVersionManager() *schemaVersionManager { + return &schemaVersionManager{} +} + +func (sv *schemaVersionManager) setSchemaVersion(job *model.Job, store kv.Storage) (schemaVersion int64, err error) { + sv.lockSchemaVersion(job.ID) + 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) + schemaVersion, err = m.GenSchemaVersion() + return err + }) + return schemaVersion, err +} + +// lockSchemaVersion gets the lock to prevent the schema version from being updated. +func (sv *schemaVersionManager) lockSchemaVersion(jobID int64) { + 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) + } +} + +// unlockSchemaVersion releases the lock. +func (sv *schemaVersionManager) unlockSchemaVersion(jobID int64) { + ownerID := sv.lockOwner.Load() + if ownerID == jobID { + sv.lockOwner.Store(0) + sv.schemaVersionMu.Unlock() + } } func (dc *ddlCtx) isOwner() bool { @@ -274,9 +387,9 @@ func (dc *ddlCtx) setDDLSourceForDiagnosis(job *model.Job) { ctx, exists := dc.jobCtx.jobCtxMap[job.ID] if !exists { ctx = NewJobContext() + ctx.setDDLLabelForDiagnosis(job) dc.jobCtx.jobCtxMap[job.ID] = ctx } - ctx.setDDLLabelForDiagnosis(job) } func (dc *ddlCtx) getResourceGroupTaggerForTopSQL(job *model.Job) tikvrpc.ResourceGroupTagger { @@ -426,16 +539,19 @@ func newDDL(ctx context.Context, options ...Option) *ddl { } ddlCtx := &ddlCtx{ - uuid: id, - store: opt.Store, - lease: opt.Lease, - ddlJobDoneCh: make(chan struct{}, 1), - ownerManager: manager, - schemaSyncer: syncer, - binlogCli: binloginfo.GetPumpsClient(), - infoCache: opt.InfoCache, - tableLockCkr: deadLockCkr, - etcdCli: opt.EtcdCli, + uuid: id, + store: opt.Store, + lease: opt.Lease, + ddlJobDoneCh: make(chan struct{}, 1), + ownerManager: manager, + schemaSyncer: syncer, + binlogCli: binloginfo.GetPumpsClient(), + infoCache: opt.InfoCache, + tableLockCkr: deadLockCkr, + etcdCli: opt.EtcdCli, + schemaVersionManager: newSchemaVersionManager(), + waitSchemaSyncedController: newWaitSchemaSyncedController(), + runningJobIDs: make([]string, 0, jobRecordCapacity), } ddlCtx.reorgCtx.reorgCtxMap = make(map[int64]*reorgCtx) ddlCtx.jobCtx.jobCtxMap = make(map[int64]*JobContext) @@ -443,12 +559,18 @@ 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.waiting = atomicutil.NewBool(false) + d := &ddl{ ddlCtx: ddlCtx, limitJobCh: make(chan *limitJobTask, batchAddingJobs), enableTiFlashPoll: atomicutil.NewBool(true), + ddlJobCh: make(chan struct{}, 100), } + variable.SwitchConcurrentDDL = d.SwitchConcurrentDDL + return d } @@ -475,13 +597,55 @@ func (d *ddl) newDeleteRangeManager(mock bool) delRangeManager { return delRangeMgr } +func (d *ddl) prepareWorkers4ConcurrencyDDL() { + workerFactory := func(tp workerType) func() (pools.Resource, error) { + return func() (pools.Resource, error) { + wk := newWorker(d.ctx, tp, d.sessPool, d.delRangeMgr, d.ddlCtx, true) + sessForJob, err := d.sessPool.get() + if err != nil { + return nil, err + } + sessForJob.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) + wk.sess = newSession(sessForJob) + metrics.DDLCounter.WithLabelValues(fmt.Sprintf("%s_%s", metrics.CreateDDL, wk.String())).Inc() + return wk, nil + } + } + // reorg worker count at least 1 at most 10. + reorgCnt := mathutil.Min(mathutil.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) + failpoint.Inject("NoDDLDispatchLoop", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return() + } + }) + d.wg.Run(d.startDispatchLoop) +} + +func (d *ddl) prepareWorkers4legacyDDL() { + d.workers = make(map[workerType]*worker, 2) + d.workers[generalWorker] = newWorker(d.ctx, generalWorker, d.sessPool, d.delRangeMgr, d.ddlCtx, false) + d.workers[addIdxWorker] = newWorker(d.ctx, addIdxWorker, d.sessPool, d.delRangeMgr, d.ddlCtx, false) + for _, worker := range d.workers { + worker.wg.Add(1) + w := worker + go w.start(d.ddlCtx) + + metrics.DDLCounter.WithLabelValues(fmt.Sprintf("%s_%s", metrics.CreateDDL, worker.String())).Inc() + + // When the start function is called, we will send a fake job to let worker + // checks owner firstly and try to find whether a job exists and run. + asyncNotify(worker.ddlJobCh) + } +} + // Start implements DDL.Start interface. func (d *ddl) Start(ctxPool *pools.ResourcePool) error { logutil.BgLogger().Info("[ddl] start DDL", zap.String("ID", d.uuid), zap.Bool("runWorker", RunWorker)) d.wg.Run(d.limitDDLJobs) d.sessPool = newSessionPool(ctxPool, d.store) - // If RunWorker is true, we need campaign owner and do DDL job. // Otherwise, we needn't do that. if RunWorker { @@ -498,21 +662,10 @@ func (d *ddl) Start(ctxPool *pools.ResourcePool) error { return errors.Trace(err) } - d.workers = make(map[workerType]*worker, 2) d.delRangeMgr = d.newDeleteRangeManager(ctxPool == nil) - d.workers[generalWorker] = newWorker(d.ctx, generalWorker, d.sessPool, d.delRangeMgr, d.ddlCtx) - d.workers[addIdxWorker] = newWorker(d.ctx, addIdxWorker, d.sessPool, d.delRangeMgr, d.ddlCtx) - for _, worker := range d.workers { - worker.wg.Add(1) - w := worker - go w.start(d.ddlCtx) - metrics.DDLCounter.WithLabelValues(fmt.Sprintf("%s_%s", metrics.CreateDDL, worker.String())).Inc() - - // When the start function is called, we will send a fake job to let worker - // checks owner firstly and try to find whether a job exists and run. - asyncNotify(worker.ddlJobCh) - } + d.prepareWorkers4ConcurrencyDDL() + d.prepareWorkers4legacyDDL() go d.schemaSyncer.StartCleanWork() if config.TableLockEnabled() { @@ -532,7 +685,7 @@ func (d *ddl) Start(ctxPool *pools.ResourcePool) error { return nil } -// GetNextDDLSeqNum return the next ddl seq num. +// GetNextDDLSeqNum return the next DDL seq num. func (d *ddl) GetNextDDLSeqNum() (uint64, error) { var count uint64 ctx := kv.WithInternalSourceType(d.ctx, kv.InternalTxnDDL) @@ -555,6 +708,12 @@ func (d *ddl) close() { d.wg.Wait() d.ownerManager.Cancel() d.schemaSyncer.Close() + if d.reorgWorkerPool != nil { + d.reorgWorkerPool.close() + } + if d.generalDDLWorkerPool != nil { + d.generalDDLWorkerPool.close() + } for _, worker := range d.workers { worker.Close() @@ -564,10 +723,7 @@ func (d *ddl) close() { if d.delRangeMgr != nil { d.delRangeMgr.clear() } - if d.sessPool != nil { - d.sessPool.close() - } - + d.sessPool.close() variable.UnregisterStatistics(d) logutil.BgLogger().Info("[ddl] DDL closed", zap.String("ID", d.uuid), zap.Duration("take time", time.Since(startTime))) @@ -679,16 +835,24 @@ func (d *ddl) asyncNotifyWorker(job *model.Job) { if !RunWorker { return } - var worker *worker - if job.MayNeedReorg() { - worker = d.workers[addIdxWorker] - } else { - worker = d.workers[generalWorker] - } - if d.ownerManager.IsOwner() { - asyncNotify(worker.ddlJobCh) + if variable.EnableConcurrentDDL.Load() { + if d.isOwner() { + asyncNotify(d.ddlJobCh) + } else { + d.asyncNotifyByEtcd(addingDDLJobConcurrent, job) + } } else { - d.asyncNotifyByEtcd(worker.addingDDLJobKey, job) + var worker *worker + if job.MayNeedReorg() { + worker = d.workers[addIdxWorker] + } else { + worker = d.workers[generalWorker] + } + if d.ownerManager.IsOwner() { + asyncNotify(worker.ddlJobCh) + } else { + d.asyncNotifyByEtcd(worker.addingDDLJobKey, job) + } } } @@ -754,7 +918,8 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { return errors.Trace(err) } - ctx.GetSessionVars().StmtCtx.IsDDLJobInQueue = true + sessVars := ctx.GetSessionVars() + sessVars.StmtCtx.IsDDLJobInQueue = true // Notice worker that we push a new job and wait the job done. d.asyncNotifyWorker(job) @@ -796,7 +961,34 @@ func (d *ddl) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { return context.Canceled } - historyJob, err = d.getHistoryDDLJob(jobID) + // If the connection being killed, we need to CANCEL the DDL job. + if atomic.LoadUint32(&sessVars.Killed) == 1 { + if sessVars.StmtCtx.DDLJobID != 0 { + se, err := d.sessPool.get() + if err != nil { + logutil.BgLogger().Error("[ddl] get session failed, check again", zap.Error(err)) + continue + } + sessVars.StmtCtx.DDLJobID = 0 // Avoid repeat. + errs, err := CancelJobs(se, d.store, []int64{jobID}) + d.sessPool.put(se) + if len(errs) > 0 { + logutil.BgLogger().Warn("error canceling DDL job", zap.Error(errs[0])) + } + if err != nil { + logutil.BgLogger().Warn("Kill command could not cancel DDL job", zap.Error(err)) + continue + } + } + } + + se, err := d.sessPool.get() + if err != nil { + logutil.BgLogger().Error("[ddl] get session failed, check again", zap.Error(err)) + continue + } + historyJob, err = GetHistoryJobByID(se, jobID) + d.sessPool.put(se) if err != nil { logutil.BgLogger().Error("[ddl] get history DDL job failed, check again", zap.Error(err)) continue @@ -900,6 +1092,57 @@ func (d *ddl) startCleanDeadTableLock() { } } +// SwitchConcurrentDDL changes the DDL to concurrent DDL if toConcurrentDDL is true, otherwise, queue based DDL. +func (d *ddl) SwitchConcurrentDDL(toConcurrentDDL bool) error { + if !d.isOwner() { + return kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), d.store, true, func(ctx context.Context, txn kv.Transaction) error { + isConcurrentDDL, err := meta.NewMeta(txn).IsConcurrentDDL() + if err != nil { + return err + } + if isConcurrentDDL != toConcurrentDDL { + return errors.New("please set it on the DDL owner node") + } + return nil + }) + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + d.waiting.Store(true) + defer d.waiting.Store(false) + if err := d.wait4Switch(ctx); err != nil { + return err + } + + var err error + if toConcurrentDDL { + err = d.MoveJobFromQueue2Table(false) + } else { + err = d.MoveJobFromTable2Queue() + } + variable.EnableConcurrentDDL.Store(toConcurrentDDL) + logutil.BgLogger().Info("[ddl] SwitchConcurrentDDL", zap.Bool("toConcurrentDDL", toConcurrentDDL), zap.Error(err)) + return err +} + +func (d *ddl) wait4Switch(ctx context.Context) error { + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + d.runningJobs.RLock() + if len(d.runningJobs.ids) == 0 { + d.runningJobs.RUnlock() + return nil + } + d.runningJobs.RUnlock() + time.Sleep(time.Second * 1) + } +} + // RecoverInfo contains information needed by DDL.RecoverTable. type RecoverInfo struct { SchemaID int64 @@ -978,12 +1221,13 @@ type Info struct { // GetDDLInfoWithNewTxn returns DDL information using a new txn. func GetDDLInfoWithNewTxn(s sessionctx.Context) (*Info, error) { - err := sessiontxn.NewTxn(context.Background(), s) + sess := newSession(s) + err := sess.begin() if err != nil { return nil, err } info, err := GetDDLInfo(s) - s.RollbackTxn(context.Background()) + sess.rollback() return info, err } @@ -991,37 +1235,41 @@ func GetDDLInfoWithNewTxn(s sessionctx.Context) (*Info, error) { func GetDDLInfo(s sessionctx.Context) (*Info, error) { var err error info := &Info{} - txn, err := s.Txn(true) + sess := newSession(s) + txn, err := sess.txn() if err != nil { - return nil, err + return nil, errors.Trace(err) } t := meta.NewMeta(txn) - info.Jobs = make([]*model.Job, 0, 2) - job, err := t.GetDDLJobByIdx(0) - if err != nil { - return nil, errors.Trace(err) - } - if job != nil { - info.Jobs = append(info.Jobs, job) + enable := variable.EnableConcurrentDDL.Load() + var generalJob, reorgJob *model.Job + if enable { + generalJob, reorgJob, err = get2JobsFromTable(sess) + } else { + generalJob, reorgJob, err = get2JobsFromQueue(t) } - addIdxJob, err := t.GetDDLJobByIdx(0, meta.AddIndexJobListKey) if err != nil { return nil, errors.Trace(err) } - if addIdxJob != nil { - info.Jobs = append(info.Jobs, addIdxJob) + + if generalJob != nil { + info.Jobs = append(info.Jobs, generalJob) + } + + if reorgJob != nil { + info.Jobs = append(info.Jobs, reorgJob) } - info.SchemaVer, err = t.GetSchemaVersion() + info.SchemaVer, err = t.GetSchemaVersionWithNonEmptyDiff() if err != nil { return nil, errors.Trace(err) } - if addIdxJob == nil { + if reorgJob == nil { return info, nil } - _, info.ReorgHandle, _, _, err = newReorgHandler(t).GetDDLReorgHandle(addIdxJob) + _, info.ReorgHandle, _, _, err = newReorgHandler(t, sess, enable).GetDDLReorgHandle(reorgJob) if err != nil { if meta.ErrDDLReorgElementNotExist.Equal(err) { return info, nil @@ -1032,8 +1280,53 @@ func GetDDLInfo(s sessionctx.Context) (*Info, error) { return info, nil } +func get2JobsFromQueue(t *meta.Meta) (*model.Job, *model.Job, error) { + generalJob, err := t.GetDDLJobByIdx(0) + if err != nil { + return nil, nil, errors.Trace(err) + } + reorgJob, err := t.GetDDLJobByIdx(0, meta.AddIndexJobListKey) + if err != nil { + return nil, nil, errors.Trace(err) + } + + return generalJob, reorgJob, nil +} + +func get2JobsFromTable(sess *session) (*model.Job, *model.Job, error) { + var generalJob, reorgJob *model.Job + jobs, err := getJobsBySQL(sess, JobTable, "not reorg order by job_id limit 1") + if err != nil { + return nil, nil, errors.Trace(err) + } + + if len(jobs) != 0 { + generalJob = jobs[0] + } + jobs, err = getJobsBySQL(sess, JobTable, "reorg order by job_id limit 1") + if err != nil { + return nil, nil, errors.Trace(err) + } + if len(jobs) != 0 { + reorgJob = jobs[0] + } + return generalJob, reorgJob, nil +} + // CancelJobs cancels the DDL jobs. -func CancelJobs(txn kv.Transaction, ids []int64) ([]error, error) { +func CancelJobs(se sessionctx.Context, store kv.Storage, ids []int64) (errs []error, err error) { + if variable.EnableConcurrentDDL.Load() { + return cancelConcurrencyJobs(se, ids) + } + + err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { + errs, err = cancelLegacyJobs(txn, ids) + return err + }) + return +} + +func cancelLegacyJobs(txn kv.Transaction, ids []int64) ([]error, error) { if len(ids) == 0 { return nil, nil } @@ -1099,6 +1392,82 @@ func CancelJobs(txn kv.Transaction, ids []int64) ([]error, error) { return errs, nil } +// cancelConcurrencyJobs cancels the DDL jobs that are in the concurrent state. +func cancelConcurrencyJobs(se sessionctx.Context, ids []int64) ([]error, error) { + failpoint.Inject("mockCancelConcurencyDDL", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, errors.New("mock commit error")) + } + }) + if len(ids) == 0 { + return nil, nil + } + var jobMap = make(map[int64]int) // jobID -> error index + + sess := newSession(se) + err := sess.begin() + if err != nil { + return nil, err + } + + idsStr := make([]string, 0, len(ids)) + for idx, id := range ids { + jobMap[id] = idx + idsStr = append(idsStr, strconv.FormatInt(id, 10)) + } + + jobs, err := getJobsBySQL(sess, JobTable, fmt.Sprintf("job_id in (%s) order by job_id", strings.Join(idsStr, ", "))) + if err != nil { + sess.rollback() + return nil, err + } + + errs := make([]error, len(ids)) + + for _, job := range jobs { + i, ok := jobMap[job.ID] + if !ok { + logutil.BgLogger().Debug("the job that needs to be canceled isn't equal to current job", + zap.Int64("need to canceled job ID", job.ID), + zap.Int64("current job ID", job.ID)) + continue + } + delete(jobMap, job.ID) + // These states can't be cancelled. + if job.IsDone() || job.IsSynced() { + errs[i] = dbterror.ErrCancelFinishedDDLJob.GenWithStackByArgs(job.ID) + continue + } + // If the state is rolling back, it means the work is cleaning the data after cancelling the job. + if job.IsCancelled() || job.IsRollingback() || job.IsRollbackDone() { + continue + } + if !job.IsRollbackable() { + errs[i] = dbterror.ErrCannotCancelDDLJob.GenWithStackByArgs(job.ID) + continue + } + job.State = model.JobStateCancelling + // Make sure RawArgs isn't overwritten. + err := json.Unmarshal(job.RawArgs, &job.Args) + if err != nil { + errs[i] = errors.Trace(err) + continue + } + err = updateDDLJob2Table(sess, job, true) + if err != nil { + errs[i] = errors.Trace(err) + } + } + err = sess.commit() + if err != nil { + return nil, err + } + for id, idx := range jobMap { + errs[idx] = dbterror.ErrDDLJobNotFound.GenWithStackByArgs(id) + } + return errs, nil +} + func getDDLJobsInQueue(t *meta.Meta, jobListKey meta.JobListKeyType) ([]*model.Job, error) { cnt, err := t.DDLJobQueueLen(jobListKey) if err != nil { @@ -1115,7 +1484,16 @@ func getDDLJobsInQueue(t *meta.Meta, jobListKey meta.JobListKeyType) ([]*model.J } // GetAllDDLJobs get all DDL jobs and sorts jobs by job.ID. -func GetAllDDLJobs(t *meta.Meta) ([]*model.Job, error) { +func GetAllDDLJobs(sess sessionctx.Context, t *meta.Meta) ([]*model.Job, error) { + if variable.EnableConcurrentDDL.Load() { + return getJobsBySQL(newSession(sess), JobTable, "1 order by job_id") + } + + return getDDLJobs(t) +} + +// getDDLJobs get all DDL jobs and sorts jobs by job.ID. +func getDDLJobs(t *meta.Meta) ([]*model.Job, error) { generalJobs, err := getDDLJobsInQueue(t, meta.DefaultJobListKey) if err != nil { return nil, errors.Trace(err) @@ -1142,7 +1520,7 @@ 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 := t.GetLastHistoryDDLJobsIterator() + iterator, err := GetLastHistoryDDLJobsIterator(t) if err != nil { return nil, errors.Trace(err) } @@ -1152,7 +1530,7 @@ func GetLastNHistoryDDLJobs(t *meta.Meta, maxNumJobs int) ([]*model.Job, error) // 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 := txnMeta.GetLastHistoryDDLJobsIterator() + iter, err := GetLastHistoryDDLJobsIterator(txnMeta) if err != nil { return err } @@ -1171,8 +1549,8 @@ func IterHistoryDDLJobs(txn kv.Transaction, finishFn func([]*model.Job) (bool, e // 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(txn kv.Transaction, finishFn func([]*model.Job) (bool, error)) error { - jobs, err := GetAllDDLJobs(meta.NewMeta(txn)) +func IterAllDDLJobs(ctx sessionctx.Context, txn kv.Transaction, finishFn func([]*model.Job) (bool, error)) error { + jobs, err := GetAllDDLJobs(ctx, meta.NewMeta(txn)) if err != nil { return err } @@ -1184,9 +1562,76 @@ func IterAllDDLJobs(txn kv.Transaction, finishFn func([]*model.Job) (bool, error return IterHistoryDDLJobs(txn, finishFn) } +// GetLastHistoryDDLJobsIterator gets latest N history DDL jobs iterator. +func GetLastHistoryDDLJobsIterator(m *meta.Meta) (meta.LastJobIterator, error) { + return m.GetLastHistoryDDLJobsIterator() +} + +// session wraps sessionctx.Context for transaction usage. +type session struct { + sessionctx.Context +} + +func newSession(s sessionctx.Context) *session { + return &session{s} +} + +func (s *session) begin() error { + err := sessiontxn.NewTxn(context.Background(), s) + if err != nil { + return err + } + s.GetSessionVars().SetInTxn(true) + return nil +} + +func (s *session) commit() error { + s.StmtCommit() + return s.CommitTxn(context.Background()) +} + +func (s *session) txn() (kv.Transaction, error) { + return s.Txn(true) +} + +func (s *session) rollback() { + s.StmtRollback() + s.RollbackTxn(context.Background()) +} + +func (s *session) reset() { + s.StmtRollback() +} + +func (s *session) execute(ctx context.Context, query string, label string) ([]chunk.Row, error) { + startTime := time.Now() + var err error + defer func() { + metrics.DDLJobTableDuration.WithLabelValues(label + "-" + metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) + }() + rs, err := s.Context.(sqlexec.SQLExecutor).ExecuteInternal(kv.WithInternalSourceType(ctx, kv.InternalTxnDDL), query) + if err != nil { + return nil, errors.Trace(err) + } + + if rs == nil { + return nil, nil + } + var rows []chunk.Row + defer terror.Call(rs.Close) + if rows, err = sqlexec.DrainRecordSet(ctx, rs, 8); err != nil { + return nil, errors.Trace(err) + } + return rows, nil +} + +func (s *session) session() sessionctx.Context { + return s.Context +} + // GetAllHistoryDDLJobs get all the done DDL jobs. func GetAllHistoryDDLJobs(m *meta.Meta) ([]*model.Job, error) { - iterator, err := m.GetLastHistoryDDLJobsIterator() + iterator, err := GetLastHistoryDDLJobsIterator(m) if err != nil { return nil, errors.Trace(err) } @@ -1227,12 +1672,36 @@ func GetHistoryJobByID(sess sessionctx.Context, id int64) (*model.Job, error) { return job, errors.Trace(err) } -// AddHistoryDDLJob adds DDL job to history table. -func AddHistoryDDLJob(t *meta.Meta, job *model.Job, updateRawArgs bool) error { +// AddHistoryDDLJobForTest used for test. +func AddHistoryDDLJobForTest(sess sessionctx.Context, t *meta.Meta, job *model.Job, updateRawArgs bool) error { + return AddHistoryDDLJob(newSession(sess), t, job, updateRawArgs, variable.EnableConcurrentDDL.Load()) +} + +// AddHistoryDDLJob record the history job. +func AddHistoryDDLJob(sess *session, t *meta.Meta, job *model.Job, updateRawArgs bool, concurrentDDL bool) error { + if concurrentDDL { + // only add history job into table if it is concurrent DDL. + err := addHistoryDDLJob2Table(sess, job, updateRawArgs) + if err != nil { + logutil.BgLogger().Info("[ddl] failed to add DDL job to history table", zap.Error(err)) + } + } + // we always add history DDL job to job list at this moment. return t.AddHistoryDDLJob(job, updateRawArgs) } -// GetLastHistoryDDLJobsIterator gets latest N history ddl jobs iterator. -func GetLastHistoryDDLJobsIterator(m *meta.Meta) (meta.LastJobIterator, error) { - return m.GetLastHistoryDDLJobsIterator() +// addHistoryDDLJob2Table adds DDL job to history table. +func addHistoryDDLJob2Table(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, 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/ddl/ddl_api.go b/ddl/ddl_api.go index 130d632bf4b47..b66028f515884 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -88,7 +88,7 @@ func (d *ddl) CreateSchema(ctx sessionctx.Context, stmt *ast.CreateDatabaseStmt) sessionVars := ctx.GetSessionVars() // If no charset and/or collation is specified use collation_server and character_set_server - charsetOpt := &ast.CharsetOpt{} + charsetOpt := ast.CharsetOpt{} if sessionVars.GlobalVarsAccessor != nil { charsetOpt.Col, err = variable.GetSessionOrGlobalSystemVar(sessionVars, variable.CollationServer) if err != nil { @@ -102,19 +102,17 @@ func (d *ddl) CreateSchema(ctx sessionctx.Context, stmt *ast.CreateDatabaseStmt) explicitCharset := false explicitCollation := false - if len(stmt.Options) != 0 { - for _, val := range stmt.Options { - switch val.Tp { - case ast.DatabaseOptionCharset: - charsetOpt.Chs = val.Value - explicitCharset = true - case ast.DatabaseOptionCollate: - charsetOpt.Col = val.Value - explicitCollation = true - case ast.DatabaseOptionPlacementPolicy: - placementPolicyRef = &model.PolicyRefInfo{ - Name: model.NewCIStr(val.Value), - } + for _, val := range stmt.Options { + switch val.Tp { + case ast.DatabaseOptionCharset: + charsetOpt.Chs = val.Value + explicitCharset = true + case ast.DatabaseOptionCollate: + charsetOpt.Col = val.Value + explicitCollation = true + case ast.DatabaseOptionPlacementPolicy: + placementPolicyRef = &model.PolicyRefInfo{ + Name: model.NewCIStr(val.Value), } } } @@ -140,7 +138,7 @@ func (d *ddl) CreateSchema(ctx sessionctx.Context, stmt *ast.CreateDatabaseStmt) } dbInfo := &model.DBInfo{Name: stmt.Name} - chs, coll, err := ResolveCharsetCollation(ast.CharsetOpt{Chs: charsetOpt.Chs, Col: charsetOpt.Col}) + chs, coll, err := ResolveCharsetCollation(charsetOpt) if err != nil { return errors.Trace(err) } @@ -344,8 +342,9 @@ func (d *ddl) ModifySchemaSetTiFlashReplica(sctx sessionctx.Context, stmt *ast.A if !ok { return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(dbName.O) } + if util.IsMemOrSysDB(dbInfo.Name.L) { - return errors.Trace(dbterror.ErrUnsupportedAlterReplicaForSysTable) + return errors.Trace(dbterror.ErrUnsupportedTiFlashOperationForSysOrMemTable) } total := len(dbInfo.Tables) @@ -512,7 +511,7 @@ func checkMultiSchemaSpecs(_sctx sessionctx.Context, specs []*ast.DatabaseOption for _, spec := range specs { if spec.Tp == ast.DatabaseSetTiFlashReplica { if hasSetTiFlashReplica { - return dbterror.ErrRunMultiSchemaChanges + return dbterror.ErrRunMultiSchemaChanges.FastGenByArgs(model.ActionSetTiFlashReplica.String()) } hasSetTiFlashReplica = true } @@ -1784,13 +1783,15 @@ func convertAutoRandomBitsToUnsigned(autoRandomBits int) (uint64, error) { return uint64(autoRandomBits), nil } -func buildTableInfo( +// BuildTableInfo creates a TableInfo. +func BuildTableInfo( ctx sessionctx.Context, tableName model.CIStr, cols []*table.Column, constraints []*ast.Constraint, charset string, - collate string) (tbInfo *model.TableInfo, err error) { + collate string, +) (tbInfo *model.TableInfo, err error) { tbInfo = &model.TableInfo{ Name: tableName, Version: model.CurrLatestTableInfoVersion, @@ -1994,6 +1995,11 @@ func checkTableInfoValidExtra(tbInfo *model.TableInfo) error { return err } +// CheckTableInfoValidWithStmt exposes checkTableInfoValidWithStmt to SchemaTracker. Maybe one day we can delete it. +func CheckTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) (err error) { + return checkTableInfoValidWithStmt(ctx, tbInfo, s) +} + func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) (err error) { // All of these rely on the AST structure of expressions, which were // lost in the model (got serialized into strings). @@ -2052,7 +2058,8 @@ func checkTableInfoValid(tblInfo *model.TableInfo) error { return checkInvisibleIndexOnPK(tblInfo) } -func buildTableInfoWithLike(ctx sessionctx.Context, ident ast.Ident, referTblInfo *model.TableInfo, s *ast.CreateTableStmt) (*model.TableInfo, error) { +// BuildTableInfoWithLike builds a new table info according to CREATE TABLE ... LIKE statement. +func BuildTableInfoWithLike(ctx sessionctx.Context, ident ast.Ident, referTblInfo *model.TableInfo, s *ast.CreateTableStmt) (*model.TableInfo, error) { // Check the referred table is a real table object. if referTblInfo.IsSequence() || referTblInfo.IsView() { return nil, dbterror.ErrWrongObject.GenWithStackByArgs(ident.Schema, referTblInfo.Name, "BASE TABLE") @@ -2102,7 +2109,7 @@ func BuildTableInfoFromAST(s *ast.CreateTableStmt) (*model.TableInfo, error) { // buildTableInfoWithCheck builds model.TableInfo from a SQL statement. // Note: TableID and PartitionIDs are left as uninitialized value. func buildTableInfoWithCheck(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCharset, dbCollate string, placementPolicyRef *model.PolicyRefInfo) (*model.TableInfo, error) { - tbInfo, err := buildTableInfoWithStmt(ctx, s, dbCharset, dbCollate, placementPolicyRef) + tbInfo, err := BuildTableInfoWithStmt(ctx, s, dbCharset, dbCollate, placementPolicyRef) if err != nil { return nil, err } @@ -2135,15 +2142,15 @@ func BuildSessionTemporaryTableInfo(ctx sessionctx.Context, is infoschema.InfoSc if err != nil { return nil, infoschema.ErrTableNotExists.GenWithStackByArgs(referIdent.Schema, referIdent.Name) } - tbInfo, err = buildTableInfoWithLike(ctx, ident, referTbl.Meta(), s) + tbInfo, err = BuildTableInfoWithLike(ctx, ident, referTbl.Meta(), s) } else { tbInfo, err = buildTableInfoWithCheck(ctx, s, dbCharset, dbCollate, placementPolicyRef) } return tbInfo, err } -// buildTableInfoWithStmt builds model.TableInfo from a SQL statement without validity check -func buildTableInfoWithStmt(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCharset, dbCollate string, placementPolicyRef *model.PolicyRefInfo) (*model.TableInfo, error) { +// BuildTableInfoWithStmt builds model.TableInfo from a SQL statement without validity check +func BuildTableInfoWithStmt(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCharset, dbCollate string, placementPolicyRef *model.PolicyRefInfo) (*model.TableInfo, error) { colDefs := s.Cols tableCharset, tableCollate, err := getCharsetAndCollateInTableOption(0, s.Options) if err != nil { @@ -2168,7 +2175,7 @@ func buildTableInfoWithStmt(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCh } var tbInfo *model.TableInfo - tbInfo, err = buildTableInfo(ctx, s.Table.Name, cols, newConstraints, tableCharset, tableCollate) + tbInfo, err = BuildTableInfo(ctx, s.Table.Name, cols, newConstraints, tableCharset, tableCollate) if err != nil { return nil, errors.Trace(err) } @@ -2246,9 +2253,9 @@ func (d *ddl) CreateTable(ctx sessionctx.Context, s *ast.CreateTableStmt) (err e // build tableInfo var tbInfo *model.TableInfo if s.ReferTable != nil { - tbInfo, err = buildTableInfoWithLike(ctx, ident, referTbl.Meta(), s) + tbInfo, err = BuildTableInfoWithLike(ctx, ident, referTbl.Meta(), s) } else { - tbInfo, err = buildTableInfoWithStmt(ctx, s, schema.Charset, schema.Collate, schema.PlacementPolicyRef) + tbInfo, err = BuildTableInfoWithStmt(ctx, s, schema.Charset, schema.Collate, schema.PlacementPolicyRef) } if err != nil { return errors.Trace(err) @@ -2626,7 +2633,7 @@ func (d *ddl) RecoverTable(ctx sessionctx.Context, recoverInfo *RecoverInfo) (er } func (d *ddl) CreateView(ctx sessionctx.Context, s *ast.CreateViewStmt) (err error) { - viewInfo, err := buildViewInfo(ctx, s) + viewInfo, err := BuildViewInfo(ctx, s) if err != nil { return err } @@ -2650,7 +2657,7 @@ func (d *ddl) CreateView(ctx sessionctx.Context, s *ast.CreateViewStmt) (err err tblCollate = v } - tbInfo, err := buildTableInfo(ctx, s.ViewName.Name, cols, nil, tblCharset, tblCollate) + tbInfo, err := BuildTableInfo(ctx, s.ViewName.Name, cols, nil, tblCharset, tblCollate) if err != nil { return err } @@ -2664,7 +2671,8 @@ func (d *ddl) CreateView(ctx sessionctx.Context, s *ast.CreateViewStmt) (err err return d.CreateTableWithInfo(ctx, s.ViewName.Schema, tbInfo, onExist) } -func buildViewInfo(ctx sessionctx.Context, s *ast.CreateViewStmt) (*model.ViewInfo, error) { +// BuildViewInfo builds a ViewInfo structure from an ast.CreateViewStmt. +func BuildViewInfo(ctx sessionctx.Context, s *ast.CreateViewStmt) (*model.ViewInfo, error) { // Always Use `format.RestoreNameBackQuotes` to restore `SELECT` statement despite the `ANSI_QUOTES` SQL Mode is enabled or not. restoreFlag := format.RestoreStringSingleQuotes | format.RestoreKeyWordUppercase | format.RestoreNameBackQuotes var sb strings.Builder @@ -2997,11 +3005,21 @@ func needToOverwriteColCharset(options []*ast.TableOption) bool { // `ALTER TABLE ADD COLUMN (c1 INT, c2 INT)` is split into // `ALTER TABLE ADD COLUMN c1 INT, ADD COLUMN c2 INT`. func resolveAlterTableAddColumns(spec *ast.AlterTableSpec) []*ast.AlterTableSpec { - specs := make([]*ast.AlterTableSpec, len(spec.NewColumns)) - for i, col := range spec.NewColumns { + specs := make([]*ast.AlterTableSpec, 0, len(spec.NewColumns)+len(spec.NewConstraints)) + for _, col := range spec.NewColumns { t := *spec t.NewColumns = []*ast.ColumnDef{col} - specs[i] = &t + t.NewConstraints = []*ast.Constraint{} + specs = append(specs, &t) + } + // Split the add constraints from AlterTableSpec. + for _, con := range spec.NewConstraints { + t := *spec + t.NewColumns = []*ast.ColumnDef{} + t.NewConstraints = []*ast.Constraint{} + t.Constraint = con + t.Tp = ast.AlterTableAddConstraint + specs = append(specs, &t) } return specs } @@ -3019,7 +3037,7 @@ func resolveAlterTableSpec(ctx sessionctx.Context, specs []*ast.AlterTableSpec) if isIgnorableSpec(spec.Tp) { continue } - if spec.Tp == ast.AlterTableAddColumns && len(spec.NewColumns) > 1 { + if spec.Tp == ast.AlterTableAddColumns && (len(spec.NewColumns) > 1 || len(spec.NewConstraints) > 0) { validSpecs = append(validSpecs, resolveAlterTableAddColumns(spec)...) } else { validSpecs = append(validSpecs, spec) @@ -3045,47 +3063,6 @@ func resolveAlterTableSpec(ctx sessionctx.Context, specs []*ast.AlterTableSpec) return validSpecs, nil } -func isSameTypeMultiSpecs(specs []*ast.AlterTableSpec) bool { - specType := specs[0].Tp - for _, spec := range specs { - // We think AlterTableDropPrimaryKey and AlterTableDropIndex are the same types. - if spec.Tp == ast.AlterTableDropPrimaryKey || spec.Tp == ast.AlterTableDropIndex { - continue - } - if spec.Tp != specType { - return false - } - } - return true -} - -func checkMultiSpecs(sctx sessionctx.Context, specs []*ast.AlterTableSpec) error { - if !variable.EnableChangeMultiSchema.Load() { - if len(specs) > 1 { - return dbterror.ErrRunMultiSchemaChanges - } - if len(specs) == 1 && len(specs[0].NewColumns) > 1 && specs[0].Tp == ast.AlterTableAddColumns { - return dbterror.ErrRunMultiSchemaChanges - } - } else { - if len(specs) > 1 && !isSameTypeMultiSpecs(specs) && !allSupported(specs) { - return dbterror.ErrRunMultiSchemaChanges - } - } - return nil -} - -func allSupported(specs []*ast.AlterTableSpec) bool { - for _, s := range specs { - switch s.Tp { - case ast.AlterTableAddColumns, ast.AlterTableDropColumn, ast.AlterTableDropIndex, ast.AlterTableDropPrimaryKey: - default: - return false - } - } - return true -} - func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast.AlterTableStmt) (err error) { ident := ast.Ident{Schema: stmt.Table.Schema, Name: stmt.Table.Name} validSpecs, err := resolveAlterTableSpec(sctx, stmt.Specs) @@ -3110,32 +3087,9 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast } } - err = checkMultiSpecs(sctx, validSpecs) - if err != nil { - return err - } - - if len(validSpecs) > 1 { - useMultiSchemaChange := false - switch validSpecs[0].Tp { - case ast.AlterTableAddColumns, ast.AlterTableDropColumn, - ast.AlterTableDropPrimaryKey, ast.AlterTableDropIndex: - useMultiSchemaChange = true - default: - return dbterror.ErrRunMultiSchemaChanges - } - if err != nil { - return errors.Trace(err) - } - if !useMultiSchemaChange { - return nil - } - } - if len(validSpecs) > 1 { sctx.GetSessionVars().StmtCtx.MultiSchemaInfo = model.NewMultiSchemaInfo() } - for _, spec := range validSpecs { var handledCharsetOrCollate bool switch spec.Tp { @@ -4004,12 +3958,14 @@ func (d *ddl) ExchangeTablePartition(ctx sessionctx.Context, ident ast.Ident, sp 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}}, } 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")) err = d.callHookOnChanged(job, err) return errors.Trace(err) } @@ -4034,21 +3990,15 @@ func (d *ddl) DropColumn(ctx sessionctx.Context, ti ast.Ident, spec *ast.AlterTa return err } - var multiSchemaInfo *model.MultiSchemaInfo - if variable.EnableChangeMultiSchema.Load() { - multiSchemaInfo = &model.MultiSchemaInfo{} - } - 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{}, - MultiSchemaInfo: multiSchemaInfo, - 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}, } err = d.DoDDLJob(ctx, job) @@ -4070,7 +4020,7 @@ func checkIsDroppableColumn(ctx sessionctx.Context, t table.Table, spec *ast.Alt return false, err } - if err = isDroppableColumn(variable.EnableChangeMultiSchema.Load(), tblInfo, colName); err != nil { + if err = isDroppableColumn(tblInfo, colName); err != nil { return false, errors.Trace(err) } // We don't support dropping column with PK handle covered now. @@ -4485,7 +4435,7 @@ func (d *ddl) getModifiableColumnJob(ctx context.Context, sctx sessionctx.Contex Location: &model.TimeZoneLocation{Name: tzName, Offset: tzOffset}, }, CtxVars: []interface{}{needChangeColData}, - Args: []interface{}{&newCol, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, + Args: []interface{}{&newCol.ColumnInfo, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, } return job, nil } @@ -4946,19 +4896,10 @@ func (d *ddl) AlterTableSetTiFlashReplica(ctx sessionctx.Context, ident ast.Iden if err != nil { return errors.Trace(err) } - // Ban setting replica count for tables in system database. - if util.IsMemOrSysDB(schema.Name.L) { - return errors.Trace(dbterror.ErrUnsupportedAlterReplicaForSysTable) - } else if tb.Meta().TempTableType != model.TempTableNone { - return dbterror.ErrOptOnTemporaryTable.GenWithStackByArgs("set tiflash replica") - } - // Ban setting replica count for tables which has charset not supported by TiFlash - for _, col := range tb.Cols() { - _, ok := charset.TiFlashSupportedCharsets[col.GetCharset()] - if !ok { - return dbterror.ErrAlterReplicaForUnsupportedCharsetTable.GenWithStackByArgs(col.GetCharset()) - } + err = isTableTiFlashSupported(schema, tb) + if err != nil { + return errors.Trace(err) } tbReplicaInfo := tb.Meta().TiFlashReplica @@ -4985,6 +4926,26 @@ func (d *ddl) AlterTableSetTiFlashReplica(ctx sessionctx.Context, ident ast.Iden return errors.Trace(err) } +func isTableTiFlashSupported(schema *model.DBInfo, tb table.Table) error { + + // Memory tables and system tables are not supported by TiFlash + if util.IsMemOrSysDB(schema.Name.L) { + return errors.Trace(dbterror.ErrUnsupportedTiFlashOperationForSysOrMemTable) + } else if tb.Meta().TempTableType != model.TempTableNone { + return dbterror.ErrOptOnTemporaryTable.GenWithStackByArgs("set on tiflash") + } + + // Tables that has charset are not supported by TiFlash + for _, col := range tb.Cols() { + _, ok := charset.TiFlashSupportedCharsets[col.GetCharset()] + if !ok { + return dbterror.ErrUnsupportedTiFlashOperationForUnsupportedCharsetTable.GenWithStackByArgs(col.GetCharset()) + } + } + + return nil +} + func (d *ddl) AlterTableSetTiFlashMode(ctx sessionctx.Context, ident ast.Ident, mode model.TiFlashMode) error { schema, tb, err := d.getSchemaAndTableByIdent(ctx, ident) if err != nil { @@ -4995,6 +4956,18 @@ func (d *ddl) AlterTableSetTiFlashMode(ctx sessionctx.Context, ident ast.Ident, return fmt.Errorf("unsupported TiFlash mode %s", mode) } + err = isTableTiFlashSupported(schema, tb) + if err != nil { + return errors.Trace(err) + } + + // Prompt warning when there is no TiFlash replica, as TiFlash mode will + // only take effect when executing in TiFlash. + tbReplicaInfo := tb.Meta().TiFlashReplica + if tbReplicaInfo == nil || tbReplicaInfo.Count == 0 { + ctx.GetSessionVars().StmtCtx.AppendNote(dbterror.ErrAlterTiFlashModeForTableWithoutTiFlashReplica) + } + job := &model.Job{ SchemaID: schema.ID, TableID: tb.Meta().ID, @@ -5473,7 +5446,7 @@ func (d *ddl) RenameTable(ctx sessionctx.Context, s *ast.RenameTableStmt) error func (d *ddl) renameTable(ctx sessionctx.Context, oldIdent, newIdent ast.Ident, isAlterTable bool) error { is := d.GetInfoSchemaWithInterceptor(ctx) tables := make(map[string]int64) - schemas, tableID, err := extractTblInfos(is, oldIdent, newIdent, isAlterTable, tables) + schemas, tableID, err := ExtractTblInfos(is, oldIdent, newIdent, isAlterTable, tables) if err != nil { return err } @@ -5496,6 +5469,7 @@ func (d *ddl) renameTable(ctx sessionctx.Context, oldIdent, newIdent ast.Ident, 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}}, } err = d.DoDDLJob(ctx, job) @@ -5518,7 +5492,7 @@ func (d *ddl) renameTables(ctx sessionctx.Context, oldIdents, newIdents []ast.Id tables := make(map[string]int64) for i := 0; i < len(oldIdents); i++ { - schemas, tableID, err = extractTblInfos(is, oldIdents[i], newIdents[i], isAlterTable, tables) + schemas, tableID, err = ExtractTblInfos(is, oldIdents[i], newIdents[i], isAlterTable, tables) if err != nil { return err } @@ -5544,6 +5518,7 @@ func (d *ddl) renameTables(ctx sessionctx.Context, oldIdents, newIdents []ast.Id Type: model.ActionRenameTables, BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{oldSchemaIDs, newSchemaIDs, tableNames, tableIDs, oldSchemaNames, oldTableNames}, + CtxVars: []interface{}{append(oldSchemaIDs, newSchemaIDs...), tableIDs}, } err = d.DoDDLJob(ctx, job) @@ -5551,7 +5526,8 @@ func (d *ddl) renameTables(ctx sessionctx.Context, oldIdents, newIdents []ast.Id return errors.Trace(err) } -func extractTblInfos(is infoschema.InfoSchema, oldIdent, newIdent ast.Ident, isAlterTable bool, tables map[string]int64) ([]*model.DBInfo, int64, error) { +// ExtractTblInfos extracts the table information from the infoschema. +func ExtractTblInfos(is infoschema.InfoSchema, oldIdent, newIdent ast.Ident, isAlterTable bool, tables map[string]int64) ([]*model.DBInfo, int64, error) { oldSchema, ok := is.SchemaByName(oldIdent.Schema) if !ok { if isAlterTable { @@ -6187,7 +6163,7 @@ func checkIsDropPrimaryKey(indexName model.CIStr, indexInfo *model.IndexInfo, t return isPK, nil } -func isDroppableColumn(multiSchemaChange bool, tblInfo *model.TableInfo, colName model.CIStr) error { +func isDroppableColumn(tblInfo *model.TableInfo, colName model.CIStr) error { if ok, dep, isHidden := hasDependentByGeneratedColumn(tblInfo, colName); ok { if isHidden { return dbterror.ErrDependentByFunctionalIndex.GenWithStackByArgs(dep) @@ -6200,7 +6176,7 @@ func isDroppableColumn(multiSchemaChange bool, tblInfo *model.TableInfo, colName colName, tblInfo.Name) } // We only support dropping column with single-value none Primary Key index covered now. - err := isColumnCanDropWithIndex(multiSchemaChange, colName.L, tblInfo.Indices) + err := isColumnCanDropWithIndex(colName.L, tblInfo.Indices) if err != nil { return err } @@ -6602,7 +6578,7 @@ func (d *ddl) CreateSequence(ctx sessionctx.Context, stmt *ast.CreateSequenceStm return err } // TiDB describe the sequence within a tableInfo, as a same-level object of a table and view. - tbInfo, err := buildTableInfo(ctx, ident.Name, nil, nil, "", "") + tbInfo, err := BuildTableInfo(ctx, ident.Name, nil, nil, "", "") if err != nil { return err } @@ -6675,7 +6651,7 @@ func (d *ddl) AlterIndexVisibility(ctx sessionctx.Context, ident ast.Ident, inde invisible = true } - skip, err := validateAlterIndexVisibility(indexName, invisible, tb.Meta()) + skip, err := validateAlterIndexVisibility(ctx, indexName, invisible, tb.Meta()) if err != nil { return errors.Trace(err) } @@ -7062,7 +7038,7 @@ func (d *ddl) AlterTableCache(sctx sessionctx.Context, ti ast.Ident) (err error) return nil } - // forbit cache table in system database. + // forbidden cache table in system database. if util.IsMemOrSysDB(schema.Name.L) { return errors.Trace(dbterror.ErrUnsupportedAlterCacheForSysTable) } else if t.Meta().TempTableType != model.TempTableNone { diff --git a/ddl/ddl_api_test.go b/ddl/ddl_api_test.go index 90f0291ae2b35..b23692445659e 100644 --- a/ddl/ddl_api_test.go +++ b/ddl/ddl_api_test.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" "golang.org/x/exp/slices" @@ -47,15 +48,15 @@ func TestGetDDLJobs(t *testing.T) { SchemaID: 1, Type: model.ActionCreateTable, } - err := addDDLJobs(txn, jobs[i]) + err := addDDLJobs(sess, txn, jobs[i]) require.NoError(t, err) - currJobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + currJobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) require.Len(t, currJobs, i+1) currJobs2 = currJobs2[:0] - err = ddl.IterAllDDLJobs(txn, func(jobs []*model.Job) (b bool, e error) { + err = ddl.IterAllDDLJobs(sess, txn, func(jobs []*model.Job) (b bool, e error) { for _, job := range jobs { if job.NotStarted() { currJobs2 = append(currJobs2, job) @@ -69,7 +70,7 @@ func TestGetDDLJobs(t *testing.T) { require.Len(t, currJobs2, i+1) } - currJobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + currJobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) for i, job := range jobs { @@ -95,15 +96,15 @@ func TestGetDDLJobsIsSort(t *testing.T) { require.NoError(t, err) // insert 5 drop table jobs to DefaultJobListKey queue - enQueueDDLJobs(t, txn, model.ActionDropTable, 10, 15) + enQueueDDLJobs(t, sess, txn, model.ActionDropTable, 10, 15) // insert 5 create table jobs to DefaultJobListKey queue - enQueueDDLJobs(t, txn, model.ActionCreateTable, 0, 5) + enQueueDDLJobs(t, sess, txn, model.ActionCreateTable, 0, 5) // insert add index jobs to AddIndexJobListKey queue - enQueueDDLJobs(t, txn, model.ActionAddIndex, 5, 10) + enQueueDDLJobs(t, sess, txn, model.ActionAddIndex, 5, 10) - currJobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + currJobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) require.Len(t, currJobs, 15) @@ -124,8 +125,8 @@ func TestGetHistoryDDLJobs(t *testing.T) { err := kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, false, func(ctx context.Context, txn kv.Transaction) error { return meta.NewMeta(txn).ClearAllHistoryJob() }) - require.NoError(t, err) + testkit.NewTestKit(t, store).MustExec("delete from mysql.tidb_ddl_history") tk := testkit.NewTestKit(t, store) sess := tk.Session() @@ -143,7 +144,7 @@ func TestGetHistoryDDLJobs(t *testing.T) { SchemaID: 1, Type: model.ActionCreateTable, } - err = ddl.AddHistoryDDLJob(m, jobs[i], true) + err = ddl.AddHistoryDDLJobForTest(sess, m, jobs[i], true) require.NoError(t, err) historyJobs, err := ddl.GetLastNHistoryDDLJobs(m, ddl.DefNumHistoryJobs) @@ -204,14 +205,14 @@ func TestIsJobRollbackable(t *testing.T) { } } -func enQueueDDLJobs(t *testing.T, txn kv.Transaction, jobType model.ActionType, start, end int) { +func enQueueDDLJobs(t *testing.T, sess session.Session, txn kv.Transaction, jobType model.ActionType, start, end int) { for i := start; i < end; i++ { job := &model.Job{ ID: int64(i), SchemaID: 1, Type: jobType, } - err := addDDLJobs(txn, job) + err := addDDLJobs(sess, txn, job) require.NoError(t, err) } } diff --git a/ddl/ddl_test.go b/ddl/ddl_test.go index 160d238b51eb5..b0fedd991639b 100644 --- a/ddl/ddl_test.go +++ b/ddl/ddl_test.go @@ -16,10 +16,10 @@ package ddl import ( "context" - "fmt" "testing" "time" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -30,11 +30,8 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/testkit/testutil" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/mock" @@ -56,11 +53,6 @@ func (d *ddl) SetInterceptor(i Interceptor) { d.mu.interceptor = i } -// generalWorker returns the general worker. -func (d *ddl) generalWorker() *worker { - return d.workers[generalWorker] -} - // JobNeedGCForTest is only used for test. var JobNeedGCForTest = jobNeedGC @@ -85,60 +77,6 @@ func createMockStore(t *testing.T) kv.Storage { return store } -func testNewContext(d *ddl) sessionctx.Context { - ctx := mock.NewContext() - ctx.Store = d.store - return ctx -} - -func getSchemaVer(t *testing.T, ctx sessionctx.Context) int64 { - err := sessiontxn.NewTxn(context.Background(), ctx) - require.NoError(t, err) - txn, err := ctx.Txn(true) - require.NoError(t, err) - m := meta.NewMeta(txn) - ver, err := m.GetSchemaVersion() - require.NoError(t, err) - return ver -} - -type historyJobArgs struct { - ver int64 - db *model.DBInfo - tbl *model.TableInfo - tblIDs map[int64]struct{} -} - -func checkEqualTable(t *testing.T, t1, t2 *model.TableInfo) { - require.Equal(t, t1.ID, t2.ID) - require.Equal(t, t1.Name, t2.Name) - require.Equal(t, t1.Charset, t2.Charset) - require.Equal(t, t1.Collate, t2.Collate) - require.Equal(t, t1.PKIsHandle, t2.PKIsHandle) - require.Equal(t, t1.Comment, t2.Comment) - require.Equal(t, t1.AutoIncID, t2.AutoIncID) -} - -func checkHistoryJobArgs(t *testing.T, ctx sessionctx.Context, id int64, args *historyJobArgs) { - historyJob, err := GetHistoryJobByID(ctx, id) - require.NoError(t, err) - require.Greater(t, historyJob.BinlogInfo.FinishedTS, uint64(0)) - - if args.tbl != nil { - require.Equal(t, historyJob.BinlogInfo.SchemaVersion, args.ver) - checkEqualTable(t, historyJob.BinlogInfo.TableInfo, args.tbl) - return - } - - // for handling schema job - require.Equal(t, historyJob.BinlogInfo.SchemaVersion, args.ver) - require.Equal(t, historyJob.BinlogInfo.DBInfo, args.db) - // only for creating schema job - if args.db != nil && len(args.tblIDs) == 0 { - return - } -} - func TestGetIntervalFromPolicy(t *testing.T) { policy := []time.Duration{ 1 * time.Second, @@ -336,6 +274,9 @@ func TestNotifyDDLJob(t *testing.T) { require.NoError(t, store.Close()) }() + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NoDDLDispatchLoop", `return(true)`)) + defer require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/NoDDLDispatchLoop")) + getFirstNotificationAfterStartDDL := func(d *ddl) { select { case <-d.workers[addIdxWorker].ddlJobCh: @@ -347,6 +288,11 @@ func TestNotifyDDLJob(t *testing.T) { default: // The notification may be received by the worker. } + + select { + case <-d.ddlJobCh: + default: + } } d, err := testNewDDLAndStart( @@ -377,6 +323,7 @@ func TestNotifyDDLJob(t *testing.T) { d.asyncNotifyWorker(job) select { case <-d.workers[generalWorker].ddlJobCh: + case <-d.ddlJobCh: default: require.FailNow(t, "do not get the general job notification") } @@ -386,6 +333,7 @@ func TestNotifyDDLJob(t *testing.T) { d.asyncNotifyWorker(job) select { case <-d.workers[addIdxWorker].ddlJobCh: + case <-d.ddlJobCh: default: require.FailNow(t, "do not get the add index job notification") } @@ -417,391 +365,12 @@ func TestNotifyDDLJob(t *testing.T) { require.FailNow(t, "should not get the add index job notification") case <-d1.workers[generalWorker].ddlJobCh: require.FailNow(t, "should not get the general job notification") + case <-d1.ddlJobCh: + require.FailNow(t, "should not get the job notification") default: } } -func testSchemaInfo(d *ddl, name string) (*model.DBInfo, error) { - dbInfo := &model.DBInfo{ - Name: model.NewCIStr(name), - } - genIDs, err := d.genGlobalIDs(1) - if err != nil { - return nil, err - } - dbInfo.ID = genIDs[0] - return dbInfo, nil -} - -func testCreateSchema(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) *model.Job { - job := &model.Job{ - SchemaID: dbInfo.ID, - Type: model.ActionCreateSchema, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{dbInfo}, - } - ctx.SetValue(sessionctx.QueryString, "skip") - require.NoError(t, d.DoDDLJob(ctx, job)) - - v := getSchemaVer(t, ctx) - dbInfo.State = model.StatePublic - checkHistoryJobArgs(t, ctx, job.ID, &historyJobArgs{ver: v, db: dbInfo}) - dbInfo.State = model.StateNone - return job -} - -func buildDropSchemaJob(dbInfo *model.DBInfo) *model.Job { - return &model.Job{ - SchemaID: dbInfo.ID, - Type: model.ActionDropSchema, - BinlogInfo: &model.HistoryInfo{}, - } -} - -func testDropSchema(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) (*model.Job, int64) { - job := buildDropSchemaJob(dbInfo) - ctx.SetValue(sessionctx.QueryString, "skip") - err := d.DoDDLJob(ctx, job) - require.NoError(t, err) - ver := getSchemaVer(t, ctx) - return job, ver -} - -func isDDLJobDone(test *testing.T, t *meta.Meta) bool { - job, err := t.GetDDLJobByIdx(0) - require.NoError(test, err) - if job == nil { - return true - } - - time.Sleep(testLease) - return false -} - -func testCheckSchemaState(test *testing.T, d *ddl, dbInfo *model.DBInfo, state model.SchemaState) { - isDropped := true - - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - for { - err := kv.RunInNewTxn(ctx, d.store, false, func(ctx context.Context, txn kv.Transaction) error { - t := meta.NewMeta(txn) - info, err := t.GetDatabase(dbInfo.ID) - require.NoError(test, err) - - if state == model.StateNone { - isDropped = isDDLJobDone(test, t) - if !isDropped { - return nil - } - require.Nil(test, info) - return nil - } - - require.Equal(test, info.Name, dbInfo.Name) - require.Equal(test, info.State, state) - return nil - }) - require.NoError(test, err) - - if isDropped { - break - } - } -} - -type testCtxKeyType int - -func (k testCtxKeyType) String() string { - return "test_ctx_key" -} - -const testCtxKey testCtxKeyType = 0 - -func TestReorg(t *testing.T) { - tests := []struct { - isCommonHandle bool - handle kv.Handle - startKey kv.Handle - endKey kv.Handle - }{ - { - false, - kv.IntHandle(100), - kv.IntHandle(1), - kv.IntHandle(0), - }, - { - true, - testutil.MustNewCommonHandle(t, "a", 100, "string"), - testutil.MustNewCommonHandle(t, 100, "string"), - testutil.MustNewCommonHandle(t, 101, "string"), - }, - } - - for _, test := range tests { - t.Run(fmt.Sprintf("isCommandHandle(%v)", test.isCommonHandle), func(t *testing.T) { - store := createMockStore(t) - defer func() { - require.NoError(t, store.Close()) - }() - - d, err := testNewDDLAndStart( - context.Background(), - WithStore(store), - WithLease(testLease), - ) - require.NoError(t, err) - defer func() { - err := d.Stop() - require.NoError(t, err) - }() - - time.Sleep(testLease) - - sctx := testNewContext(d) - - sctx.SetValue(testCtxKey, 1) - require.Equal(t, sctx.Value(testCtxKey), 1) - sctx.ClearValue(testCtxKey) - - err = sessiontxn.NewTxn(context.Background(), sctx) - require.NoError(t, err) - txn, err := sctx.Txn(true) - require.NoError(t, err) - err = txn.Set([]byte("a"), []byte("b")) - require.NoError(t, err) - err = txn.Rollback() - require.NoError(t, err) - - err = sessiontxn.NewTxn(context.Background(), sctx) - require.NoError(t, err) - txn, err = sctx.Txn(true) - require.NoError(t, err) - err = txn.Set([]byte("a"), []byte("b")) - require.NoError(t, err) - err = txn.Commit(context.Background()) - require.NoError(t, err) - - rowCount := int64(10) - handle := test.handle - job := &model.Job{ - ID: 1, - SnapshotVer: 1, // Make sure it is not zero. So the reorgInfo's first is false. - } - err = sessiontxn.NewTxn(context.Background(), sctx) - require.NoError(t, err) - txn, err = sctx.Txn(true) - require.NoError(t, err) - m := meta.NewMeta(txn) - e := &meta.Element{ID: 333, TypeKey: meta.IndexElementKey} - rInfo := &reorgInfo{ - Job: job, - currElement: e, - d: d.ddlCtx, - } - f := func() error { - d.getReorgCtx(job).setRowCount(rowCount) - d.getReorgCtx(job).setNextKey(handle.Encoded()) - time.Sleep(1*ReorgWaitTimeout + 100*time.Millisecond) - return nil - } - mockTbl := tables.MockTableFromMeta(&model.TableInfo{IsCommonHandle: test.isCommonHandle, CommonHandleVersion: 1}) - err = d.generalWorker().runReorgJob(newReorgHandler(m), rInfo, mockTbl.Meta(), d.lease, f) - require.Error(t, err) - - // The longest to wait for 5 seconds to make sure the function of f is returned. - for i := 0; i < 1000; i++ { - time.Sleep(5 * time.Millisecond) - err = d.generalWorker().runReorgJob(newReorgHandler(m), rInfo, mockTbl.Meta(), d.lease, f) - if err == nil { - require.Equal(t, job.RowCount, rowCount) - - // Test whether reorgInfo's Handle is update. - err = txn.Commit(context.Background()) - require.NoError(t, err) - err = sessiontxn.NewTxn(context.Background(), sctx) - require.NoError(t, err) - - m = meta.NewMeta(txn) - info, err1 := getReorgInfo(NewJobContext(), d.ddlCtx, newReorgHandler(m), job, mockTbl, nil) - require.NoError(t, err1) - require.Equal(t, info.StartKey, kv.Key(handle.Encoded())) - require.Equal(t, info.currElement, e) - break - } - } - require.NoError(t, err) - - job = &model.Job{ - ID: 2, - SchemaID: 1, - Type: model.ActionCreateSchema, - Args: []interface{}{model.NewCIStr("test")}, - SnapshotVer: 1, // Make sure it is not zero. So the reorgInfo's first is false. - } - - element := &meta.Element{ID: 123, TypeKey: meta.ColumnElementKey} - info := &reorgInfo{ - Job: job, - d: d.ddlCtx, - currElement: element, - StartKey: test.startKey.Encoded(), - EndKey: test.endKey.Encoded(), - PhysicalTableID: 456, - } - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - err = kv.RunInNewTxn(ctx, d.store, false, func(ctx context.Context, txn kv.Transaction) error { - m := meta.NewMeta(txn) - var err1 error - _, err1 = getReorgInfo(NewJobContext(), d.ddlCtx, newReorgHandler(m), job, mockTbl, []*meta.Element{element}) - require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err1)) - require.Equal(t, job.SnapshotVer, uint64(0)) - return nil - }) - require.NoError(t, err) - job.SnapshotVer = uint64(1) - err = info.UpdateReorgMeta(info.StartKey) - require.NoError(t, err) - err = kv.RunInNewTxn(ctx, d.store, false, func(ctx context.Context, txn kv.Transaction) error { - m := meta.NewMeta(txn) - info1, err1 := getReorgInfo(NewJobContext(), d.ddlCtx, newReorgHandler(m), job, mockTbl, []*meta.Element{element}) - require.NoError(t, err1) - require.Equal(t, info1.currElement, info.currElement) - require.Equal(t, info1.StartKey, info.StartKey) - require.Equal(t, info1.EndKey, info.EndKey) - require.Equal(t, info1.PhysicalTableID, info.PhysicalTableID) - return nil - }) - require.NoError(t, err) - - err = d.Stop() - require.NoError(t, err) - err = d.generalWorker().runReorgJob(newReorgHandler(m), rInfo, mockTbl.Meta(), d.lease, func() error { - time.Sleep(4 * testLease) - return nil - }) - require.Error(t, err) - txn, err = sctx.Txn(true) - require.NoError(t, err) - err = txn.Commit(context.Background()) - require.NoError(t, err) - }) - } -} - -func TestCancelJobs(t *testing.T) { - store, clean := newMockStore(t) - defer clean() - - txn, err := store.Begin() - require.NoError(t, err) - - m := meta.NewMeta(txn) - cnt := 10 - ids := make([]int64, cnt) - for i := 0; i < cnt; i++ { - job := &model.Job{ - ID: int64(i), - SchemaID: 1, - Type: model.ActionCreateTable, - } - if i == 0 { - job.State = model.JobStateDone - } - if i == 1 { - job.State = model.JobStateCancelled - } - ids[i] = int64(i) - err = m.EnQueueDDLJob(job) - require.NoError(t, err) - } - - errs, err := CancelJobs(txn, ids) - require.NoError(t, err) - for i, err := range errs { - if i == 0 { - require.Error(t, err) - continue - } - require.NoError(t, err) - } - - errs, err = CancelJobs(txn, []int64{}) - require.NoError(t, err) - require.Nil(t, errs) - - errs, err = CancelJobs(txn, []int64{-1}) - require.NoError(t, err) - require.Error(t, errs[0]) - require.Regexp(t, "DDL Job:-1 not found$", errs[0].Error()) - - // test cancel finish job. - job := &model.Job{ - ID: 100, - SchemaID: 1, - Type: model.ActionCreateTable, - State: model.JobStateDone, - } - err = m.EnQueueDDLJob(job) - require.NoError(t, err) - errs, err = CancelJobs(txn, []int64{100}) - require.NoError(t, err) - require.Error(t, errs[0]) - require.Regexp(t, "This job:100 is finished, so can't be cancelled$", errs[0].Error()) - - // test can't cancelable job. - job.Type = model.ActionDropIndex - job.SchemaState = model.StateWriteOnly - job.State = model.JobStateRunning - job.ID = 101 - err = m.EnQueueDDLJob(job) - require.NoError(t, err) - errs, err = CancelJobs(txn, []int64{101}) - require.NoError(t, err) - require.Error(t, errs[0]) - require.Regexp(t, "This job:101 is almost finished, can't be cancelled now$", errs[0].Error()) - - // When both types of jobs exist in the DDL queue, - // we first cancel the job with a larger ID. - job = &model.Job{ - ID: 1000, - SchemaID: 1, - TableID: 2, - Type: model.ActionAddIndex, - } - job1 := &model.Job{ - ID: 1001, - SchemaID: 1, - TableID: 2, - Type: model.ActionAddColumn, - } - job2 := &model.Job{ - ID: 1002, - SchemaID: 1, - TableID: 2, - Type: model.ActionAddIndex, - } - job3 := &model.Job{ - ID: 1003, - SchemaID: 1, - TableID: 2, - Type: model.ActionRepairTable, - } - require.NoError(t, m.EnQueueDDLJob(job, meta.AddIndexJobListKey)) - require.NoError(t, m.EnQueueDDLJob(job1)) - require.NoError(t, m.EnQueueDDLJob(job2, meta.AddIndexJobListKey)) - require.NoError(t, m.EnQueueDDLJob(job3)) - - errs, err = CancelJobs(txn, []int64{job1.ID, job.ID, job2.ID, job3.ID}) - require.NoError(t, err) - for _, err := range errs { - require.NoError(t, err) - } - - err = txn.Rollback() - require.NoError(t, err) -} - func TestError(t *testing.T) { kvErrs := []*terror.Error{ dbterror.ErrDDLJobNotFound, @@ -814,16 +383,3 @@ func TestError(t *testing.T) { require.Equal(t, uint16(err.Code()), code) } } - -func newMockStore(t *testing.T) (store kv.Storage, clean func()) { - var err error - store, err = mockstore.NewMockStore() - require.NoError(t, err) - - clean = func() { - err = store.Close() - require.NoError(t, err) - } - - return -} diff --git a/ddl/ddl_tiflash_api.go b/ddl/ddl_tiflash_api.go index ac200a9667655..4c3f9a70a3cec 100644 --- a/ddl/ddl_tiflash_api.go +++ b/ddl/ddl_tiflash_api.go @@ -499,7 +499,7 @@ func getDropOrTruncateTableTiflash(ctx sessionctx.Context, currentSchema infosch return GetDropOrTruncateTableInfoFromJobsByStore(jobs, gcSafePoint, getTable, handleJobAndTableInfo) } - err = IterAllDDLJobs(txn, fn) + err = IterAllDDLJobs(ctx, txn, fn) if err != nil { if terror.ErrorEqual(variable.ErrSnapshotTooOld, err) { // The err indicate that current ddl job and remain DDL jobs was been deleted by GC, diff --git a/ddl/ddl_tiflash_test.go b/ddl/ddl_tiflash_test.go index 87001a8f6b971..2db35d19cb744 100644 --- a/ddl/ddl_tiflash_test.go +++ b/ddl/ddl_tiflash_test.go @@ -392,8 +392,8 @@ func TestSetTiFlashModeAvailable(t *testing.T) { tk.MustExec("use test") tk.MustExec("drop table if exists ddltiflash") tk.MustExec("create table ddltiflash(z int)") - tk.MustExec("alter table ddltiflash set tiflash mode fast") tk.MustExec("alter table ddltiflash set tiflash replica 1") + tk.MustExec("alter table ddltiflash set tiflash mode fast") time.Sleep(ddl.PollTiFlashInterval * RoundToBeAvailable * 3) tb, err := s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("ddltiflash")) require.NoError(t, err) @@ -408,6 +408,29 @@ func TestSetTiFlashModeAvailable(t *testing.T) { tiflashmode = tb.Meta().TiFlashMode require.NotNil(t, tiflashmode) require.Equal(t, tiflashmode, model.TiFlashModeNormal) + + // check the warning when set tiflash mode on the table whose tiflash replica is nil + tk.MustExec("use test") + tk.MustExec("drop table if exists ddltiflash") + tk.MustExec("create table ddltiflash(z int)") + tk.MustExec("alter table ddltiflash set tiflash mode fast") + tk.MustQuery("show warnings").Check( + testkit.Rows("Note 0 TiFlash mode will take effect after at least one TiFlash replica is set for the table")) +} + +// check for the condition that unsupport set tiflash mode +func TestSetTiFlashModeUnsupported(t *testing.T) { + s, teardown := createTiFlashContext(t) + defer teardown() + tk := testkit.NewTestKit(t, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists ddltiflash") + tk.MustExec("create temporary table ddltiflash(z int)") + // unsupport for temporary table + tk.MustGetErrMsg("alter table ddltiflash set tiflash mode fast", "[ddl:8200]TiDB doesn't support ALTER TABLE for local temporary table") + // unsupport for system table + tk.MustGetErrMsg("alter table information_schema.tiflash_replica set tiflash mode fast", "[ddl:8200]Unsupported ALTER TiFlash settings for system table and memory table") } // Truncate partition shall not block. @@ -760,10 +783,10 @@ func TestAlterDatabaseErrorGrammar(t *testing.T) { defer tear() tk := testkit.NewTestKit(t, store) - tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", "[ddl:8200]Unsupported multi schema change") - tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2", "[ddl:8200]Unsupported multi schema change") - tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2", "[ddl:8200]Unsupported multi schema change") - tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", "[ddl:8200]Unsupported multi schema change") + tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", "[ddl:8200]Unsupported multi schema change for set tiflash replica") + tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 SET TIFLASH REPLICA 2", "[ddl:8200]Unsupported multi schema change for set tiflash replica") + tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2", "[ddl:8200]Unsupported multi schema change for set tiflash replica") + tk.MustGetErrMsg("ALTER DATABASE t SET TIFLASH REPLICA 1 LOCATION LABELS 'a','b' SET TIFLASH REPLICA 2 LOCATION LABELS 'a','b'", "[ddl:8200]Unsupported multi schema change for set tiflash replica") } func TestAlterDatabaseBasic(t *testing.T) { diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 8391b79118e2d..b1b30f07d7f4d 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -17,6 +17,7 @@ package ddl import ( "context" "fmt" + "math/rand" "strconv" "sync" "sync/atomic" @@ -91,10 +92,13 @@ type worker struct { wg sync.WaitGroup sessPool *sessionPool // sessPool is used to new sessions to execute SQL in ddl package. + sess *session // sess is used and only used in running DDL job. delRangeManager delRangeManager logCtx context.Context lockSeqNum bool + concurrentDDL bool + *ddlCtx } @@ -119,7 +123,7 @@ func NewJobContext() *JobContext { } } -func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRangeMgr delRangeManager, dCtx *ddlCtx) *worker { +func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRangeMgr delRangeManager, dCtx *ddlCtx, concurrentDDL bool) *worker { worker := &worker{ id: ddlWorkerID.Add(1), tp: tp, @@ -128,8 +132,8 @@ func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRan ddlCtx: dCtx, sessPool: sessPool, delRangeManager: delRangeMgr, + concurrentDDL: concurrentDDL, } - worker.addingDDLJobKey = addingDDLJobPrefix + worker.typeStr() worker.logCtx = logutil.WithKeyValue(context.Background(), "worker", worker.String()) return worker @@ -154,6 +158,9 @@ func (w *worker) String() string { func (w *worker) Close() { startTime := time.Now() + if w.sess != nil { + w.sessPool.put(w.sess.session()) + } w.wg.Wait() logutil.Logger(w.logCtx).Info("[ddl] DDL worker closed", zap.Duration("take time", time.Since(startTime))) } @@ -286,8 +293,29 @@ func (d *ddl) limitDDLJobs() { // addBatchDDLJobs gets global job IDs and puts the DDL jobs in the DDL queue. func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { startTime := time.Now() + var err error + if variable.EnableConcurrentDDL.Load() { + err = d.addBatchDDLJobs2Table(tasks) + } else { + err = d.addBatchDDLJobs2Queue(tasks) + } + var jobs string + for _, task := range tasks { + task.err <- err + jobs += task.job.String() + "; " + metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerAddDDLJob, task.job.Type.String(), + metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) + } + if err != nil { + logutil.BgLogger().Warn("[ddl] add DDL jobs failed", zap.String("jobs", jobs), zap.Error(err)) + } else { + logutil.BgLogger().Info("[ddl] add DDL jobs", zap.Int("batch count", len(tasks)), zap.String("jobs", jobs)) + } +} + +func (d *ddl) addBatchDDLJobs2Queue(tasks []*limitJobTask) error { ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - err := kv.RunInNewTxn(ctx, d.store, true, func(ctx context.Context, txn kv.Transaction) error { + 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)) if err != nil { @@ -319,18 +347,6 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { }) return nil }) - var jobs string - for _, task := range tasks { - task.err <- err - jobs += task.job.String() + "; " - metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerAddDDLJob, task.job.Type.String(), - metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) - } - if err != nil { - logutil.BgLogger().Warn("[ddl] add DDL jobs failed", zap.String("jobs", jobs), zap.Error(err)) - } else { - logutil.BgLogger().Info("[ddl] add DDL jobs", zap.Int("batch count", len(tasks)), zap.String("jobs", jobs)) - } } func injectModifyJobArgFailPoint(job *model.Job) { @@ -357,16 +373,41 @@ func setJobStateToQueueing(job *model.Job) { job.State = model.JobStateQueueing } -// getHistoryDDLJob gets a DDL job with job's ID from history queue. -func (d *ddl) getHistoryDDLJob(id int64) (*model.Job, error) { - se, err := d.sessPool.get() - if err != nil { - return nil, errors.Trace(err) +// addBatchDDLJobs2Table gets global job IDs and puts the DDL jobs in the DDL job table. +func (d *ddl) addBatchDDLJobs2Table(tasks []*limitJobTask) error { + var ids []int64 + var err error + startTS := uint64(0) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) + 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) + } + startTS = txn.StartTS() + return nil + }) + if err == nil { + jobTasks := make([]*model.Job, len(tasks)) + for i, task := range tasks { + job := task.job + job.Version = currentVersion + job.StartTS = startTS + job.ID = ids[i] + setJobStateToQueueing(job) + jobTasks[i] = job + injectModifyJobArgFailPoint(job) + } + sess, err1 := d.sessPool.get() + if err1 == nil { + sess.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) + err1 = insertDDLJobs2Table(newSession(sess), jobTasks, true) + d.sessPool.put(sess) + } + err = err1 } - defer d.sessPool.put(se) - job, err := GetHistoryJobByID(se, id) - - return job, errors.Trace(err) + return errors.Trace(err) } func injectFailPointForGetJob(job *model.Job) { @@ -414,15 +455,29 @@ func (w *worker) updateDDLJob(t *meta.Meta, job *model.Job, meetErr bool) error failpoint.Return(kv.ErrEntryTooLarge) } }) - updateRawArgs := true - // If there is an error when running job and the RawArgs hasn't been decoded by DecodeArgs, - // so we shouldn't replace RawArgs with the marshaling Args. - if meetErr && (job.RawArgs != nil && job.Args == nil) { + updateRawArgs := needUpdateRawArgs(job, meetErr) + if !updateRawArgs { logutil.Logger(w.logCtx).Info("[ddl] meet something wrong before update DDL job, shouldn't update raw args", zap.String("job", job.String())) - updateRawArgs = false } - return errors.Trace(t.UpdateDDLJob(0, job, updateRawArgs)) + var err error + if w.concurrentDDL { + err = updateDDLJob2Table(w.sess, job, updateRawArgs) + } else { + err = t.UpdateDDLJob(0, job, updateRawArgs) + } + return errors.Trace(err) +} + +func needUpdateRawArgs(job *model.Job, meetErr bool) bool { + // If there is an error when running job and the RawArgs hasn't been decoded by DecodeArgs, + // we shouldn't replace RawArgs with the marshaling Args. + if meetErr && job.RawArgs != nil && job.Args == nil { + // However, for multi-schema change, the args of the parent job is always nil. + // Since Job.Encode() can handle the sub-jobs properly, we can safely update the raw args. + return job.MultiSchemaInfo != nil + } + return true } func (w *worker) deleteRange(ctx context.Context, job *model.Job) error { @@ -494,8 +549,11 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { if err != nil { return errors.Trace(err) } - - _, err = t.DeQueueDDLJob() + if w.concurrentDDL { + err = w.deleteDDLJob(job) + } else { + _, err = t.DeQueueDDLJob() + } if err != nil { return errors.Trace(err) } @@ -510,7 +568,7 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { } w.writeDDLSeqNum(job) w.removeJobCtx(job) - err = t.AddHistoryDDLJob(job, updateRawArgs) + err = AddHistoryDDLJob(w.sess, t, job, updateRawArgs, w.concurrentDDL) return errors.Trace(err) } @@ -606,6 +664,146 @@ func (w *JobContext) setDDLLabelForDiagnosis(job *model.Job) { w.ddlJobCtx = kv.WithInternalSourceType(w.ddlJobCtx, w.ddlJobSourceType()) } +func (w *worker) HandleJobDone(d *ddlCtx, job *model.Job, t *meta.Meta) error { + err := w.finishDDLJob(t, job) + if err != nil { + w.sess.rollback() + return err + } + + err = w.sess.commit() + if err != nil { + return err + } + asyncNotify(d.ddlJobDoneCh) + return nil +} + +func (w *worker) HandleDDLJobTable(d *ddlCtx, job *model.Job) error { + var ( + err error + schemaVer int64 + runJobErr error + waitTime = 2 * d.lease + ) + defer func() { + w.unlockSeqNum(err) + }() + + err = w.sess.begin() + if err != nil { + return err + } + if !variable.EnableConcurrentDDL.Load() || d.waiting.Load() { + w.sess.rollback() + return nil + } + failpoint.Inject("mockRunJobTime", func(val failpoint.Value) { + if val.(bool) { + time.Sleep(time.Duration(rand.Intn(5)) * time.Second) // #nosec G404 + } + }) + txn, err := w.sess.txn() + if err != nil { + w.sess.rollback() + return err + } + // Only general DDLs are allowed to be executed when TiKV is disk full. + if w.tp == addIdxWorker && job.IsRunning() { + txn.SetDiskFullOpt(kvrpcpb.DiskFullOpt_NotAllowedOnFull) + } + w.setDDLLabelForTopSQL(job) + w.setDDLSourceForDiagnosis(job) + jobContext := w.jobContext(job) + if tagger := w.getResourceGroupTaggerForTopSQL(job); tagger != nil { + txn.SetOption(kv.ResourceGroupTagger, tagger) + } + t := meta.NewMeta(txn) + if job.IsDone() || job.IsRollbackDone() { + if job.IsDone() { + job.State = model.JobStateSynced + } + err = w.HandleJobDone(d, job, t) + return err + } + + d.mu.RLock() + 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) + + if job.IsCancelled() { + defer d.unlockSchemaVersion(job.ID) + w.sess.reset() + err = w.HandleJobDone(d, job, t) + return 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. + // Some DDL jobs (such as adding indexes) may need to update the table info and the schema version, + // then shouldn't discard the KV modification. + // And the job state is rollback done, it means the job was already finished, also shouldn't discard too. + // Otherwise, we should discard the KV modification when running job. + w.sess.reset() + // If error happens after updateSchemaVersion(), then the schemaVer is updated. + // Result in the retry duration is up to 2 * lease. + schemaVer = 0 + } + + err = w.updateDDLJob(t, job, runJobErr != nil) + if err = w.handleUpdateJobError(t, job, err); err != nil { + w.sess.rollback() + d.unlockSchemaVersion(job.ID) + return err + } + writeBinlog(d.binlogCli, txn, job) + // reset the SQL digest to make topsql work right. + w.sess.GetSessionVars().StmtCtx.ResetSQLDigest(job.Query) + err = w.sess.commit() + d.unlockSchemaVersion(job.ID) + if err != nil { + return err + } + w.registerSync(job) + + if runJobErr != nil { + // wait a while to retry again. If we don't wait here, DDL will retry this job immediately, + // which may act like a deadlock. + logutil.Logger(w.logCtx).Info("[ddl] run DDL job failed, sleeps a while then retries it.", + zap.Duration("waitTime", GetWaitTimeWhenErrorOccurred()), zap.Error(runJobErr)) + time.Sleep(GetWaitTimeWhenErrorOccurred()) + } + + // Here means the job enters another state (delete only, write only, public, etc...) or is cancelled. + // If the job is done or still running or rolling back, we will wait 2 * lease time to guarantee other servers to update + // the newest schema. + ctx, cancel := context.WithTimeout(w.ctx, waitTime) + w.waitSchemaChanged(ctx, d, waitTime, schemaVer, job) + cancel() + d.synced(job) + + if RunInGoTest { + // d.mu.hook is initialed from domain / test callback, which will force the owner host update schema diff synchronously. + d.mu.RLock() + d.mu.hook.OnSchemaStateChanged() + d.mu.RUnlock() + } + + d.mu.RLock() + d.mu.hook.OnJobUpdated(job) + d.mu.RUnlock() + + return nil +} + func (w *JobContext) getResourceGroupTaggerForTopSQL() tikvrpc.ResourceGroupTagger { if !topsqlstate.TopSQLEnabled() || w.cacheDigest == nil { return nil @@ -640,18 +838,26 @@ func (w *worker) handleDDLJobQueue(d *ddlCtx) error { waitTime := 2 * d.lease ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) err := kv.RunInNewTxn(ctx, d.store, false, func(ctx context.Context, txn kv.Transaction) error { + d.runningJobs.Lock() // We are not owner, return and retry checking later. - if !d.isOwner() { + if !d.isOwner() || variable.EnableConcurrentDDL.Load() || d.waiting.Load() { + d.runningJobs.Unlock() return nil } var err error t := newMetaWithQueueTp(txn, w.tp) + // We become the owner. Get the first job and run it. job, err = w.getFirstDDLJob(t) if job == nil || err != nil { + d.runningJobs.Unlock() return errors.Trace(err) } + d.runningJobs.ids[job.ID] = struct{}{} + d.runningJobs.Unlock() + + defer d.deleteRunningDDLJobMap(job.ID) // only general ddls allowed to be executed when TiKV is disk full. if w.tp == addIdxWorker && job.IsRunning() { @@ -723,6 +929,9 @@ func (w *worker) handleDDLJobQueue(d *ddlCtx) error { zap.Duration("waitTime", GetWaitTimeWhenErrorOccurred()), zap.Error(runJobErr)) time.Sleep(GetWaitTimeWhenErrorOccurred()) } + if job != nil { + d.unlockSchemaVersion(job.ID) + } if err != nil { w.unlockSeqNum(err) @@ -778,7 +987,7 @@ func writeBinlog(binlogCli *pumpcli.PumpsClient, txn kv.Transaction, job *model. // When this column is in the "delete only" and "delete reorg" states, the binlog of "drop column" has not been written yet, // but the column has been removed from the binlog of the write operation. // So we add this binlog to enable downstream components to handle DML correctly in this schema state. - ((job.Type == model.ActionDropColumn) && job.SchemaState == model.StateDeleteOnly) { + (job.Type == model.ActionDropColumn && job.SchemaState == model.StateDeleteOnly) { if skipWriteBinlog(job) { return } @@ -869,7 +1078,9 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, // Mock for run ddl job panic. failpoint.Inject("mockPanicInRunDDLJob", func(val failpoint.Value) {}) - logutil.Logger(w.logCtx).Info("[ddl] run DDL job", zap.String("job", job.String())) + if job.Type != model.ActionMultiSchemaChange { + logutil.Logger(w.logCtx).Info("[ddl] run DDL job", zap.String("job", job.String())) + } timeStart := time.Now() if job.RealStartTS == 0 { job.RealStartTS = t.StartTS @@ -878,10 +1089,12 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerRunDDLJob, job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(timeStart).Seconds()) }() if job.IsFinished() { + logutil.Logger(w.logCtx).Debug("[ddl] finish DDL job", zap.String("job", job.String())) return } // The cause of this job state is that the job is cancelled by client. if job.IsCancelling() { + logutil.Logger(w.logCtx).Debug("[ddl] cancel DDL job", zap.String("job", job.String())) return convertJob2RollbackJob(w, d, t, job) } @@ -1118,8 +1331,8 @@ func buildPlacementAffects(oldIDs []int64, newIDs []int64) []*model.AffectedOpti } // updateSchemaVersion increments the schema version by 1 and sets SchemaDiff. -func updateSchemaVersion(_ *ddlCtx, t *meta.Meta, job *model.Job) (int64, error) { - schemaVersion, err := t.GenSchemaVersion() +func updateSchemaVersion(d *ddlCtx, t *meta.Meta, job *model.Job) (int64, error) { + schemaVersion, err := d.setSchemaVersion(job, d.store) if err != nil { return 0, errors.Trace(err) } @@ -1201,10 +1414,12 @@ func updateSchemaVersion(_ *ddlCtx, t *meta.Meta, job *model.Job) (int64, error) diff.AffectedOpts = affects case model.ActionExchangeTablePartition: var ( - ptSchemaID int64 - ptTableID int64 + ptSchemaID int64 + ptTableID int64 + partName string + withValidation bool ) - err = job.DecodeArgs(&diff.TableID, &ptSchemaID, &ptTableID) + err = job.DecodeArgs(&diff.TableID, &ptSchemaID, &ptTableID, &partName, &withValidation) if err != nil { return 0, errors.Trace(err) } diff --git a/ddl/ddl_worker_test.go b/ddl/ddl_worker_test.go index 6c21be950aead..01a11dd1da9eb 100644 --- a/ddl/ddl_worker_test.go +++ b/ddl/ddl_worker_test.go @@ -15,7 +15,6 @@ package ddl_test import ( - "context" "strconv" "sync" "testing" @@ -24,7 +23,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" @@ -33,7 +31,7 @@ import ( "github.com/stretchr/testify/require" ) -const testLease = 5 * time.Millisecond +const testLease = 5 * time.Second func TestCheckOwner(t *testing.T) { _, dom, clean := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) @@ -102,30 +100,29 @@ func TestParallelDDL(t *testing.T) { tk.MustExec("create table test_parallel_ddl_2.t3(c1 int, c2 int, c3 int, c4 int)") // set hook to execute jobs after all jobs are in queue. - jobCnt := int64(11) + jobCnt := 11 tc := &ddl.TestDDLCallback{Do: dom} once := sync.Once{} var checkErr error tc.OnJobRunBeforeExported = func(job *model.Job) { // TODO: extract a unified function for other tests. once.Do(func() { - qLen1 := int64(0) - qLen2 := int64(0) - var err error for { - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - checkErr = kv.RunInNewTxn(ctx, store, false, func(ctx context.Context, txn kv.Transaction) error { - m := meta.NewMeta(txn) - qLen1, err = m.DDLJobQueueLen() - if err != nil { - return err + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("begin") + txn, err := tk1.Session().Txn(true) + require.NoError(t, err) + jobs, err := ddl.GetAllDDLJobs(tk1.Session(), meta.NewMeta(txn)) + require.NoError(t, err) + tk1.MustExec("rollback") + var qLen1, qLen2 int + for _, job := range jobs { + if !job.MayNeedReorg() { + qLen1++ + } else { + qLen2++ } - qLen2, err = m.DDLJobQueueLen(meta.AddIndexJobListKey) - if err != nil { - return err - } - return nil - }) + } if checkErr != nil { break } @@ -139,6 +136,25 @@ func TestParallelDDL(t *testing.T) { } }) } + + once1 := sync.Once{} + tc.OnGetJobBeforeExported = func(string) { + once1.Do(func() { + for { + tk := testkit.NewTestKit(t, store) + tk.MustExec("begin") + txn, err := tk.Session().Txn(true) + require.NoError(t, err) + jobs, err := ddl.GetAllDDLJobs(tk.Session(), meta.NewMeta(txn)) + require.NoError(t, err) + tk.MustExec("rollback") + if len(jobs) == jobCnt { + break + } + time.Sleep(time.Millisecond * 20) + } + }) + } dom.DDL().SetHook(tc) /* @@ -232,8 +248,7 @@ func TestParallelDDL(t *testing.T) { time.Sleep(5 * time.Millisecond) wg.Run(func() { tk := testkit.NewTestKit(t, store) - err := tk.ExecToErr("alter table test_parallel_ddl_2.t3 add index db3_idx1(c2)") - require.Error(t, err) + _ = tk.ExecToErr("alter table test_parallel_ddl_2.t3 add index db3_idx1(c2)") rs := tk.MustQuery("select json_extract(@@tidb_last_ddl_info, '$.seq_num')") seqIDs[10], _ = strconv.Atoi(rs.Rows()[0][0].(string)) }) @@ -253,18 +268,6 @@ func TestParallelDDL(t *testing.T) { require.Less(t, seqIDs[6], seqIDs[7]) require.Less(t, seqIDs[7], seqIDs[9]) require.Less(t, seqIDs[9], seqIDs[10]) - - // General job order. - require.Less(t, seqIDs[1], seqIDs[3]) - require.Less(t, seqIDs[3], seqIDs[4]) - require.Less(t, seqIDs[4], seqIDs[6]) - require.Less(t, seqIDs[6], seqIDs[7]) - require.Less(t, seqIDs[7], seqIDs[9]) - - // Reorg job order. - require.Less(t, seqIDs[2], seqIDs[5]) - require.Less(t, seqIDs[5], seqIDs[8]) - require.Less(t, seqIDs[8], seqIDs[10]) } func TestJobNeedGC(t *testing.T) { diff --git a/ddl/ddl_workerpool.go b/ddl/ddl_workerpool.go new file mode 100644 index 0000000000000..2d931bf7823e7 --- /dev/null +++ b/ddl/ddl_workerpool.go @@ -0,0 +1,89 @@ +// 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 ddl + +import ( + "github.com/ngaut/pools" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/atomic" +) + +// workerPool is used to new worker. +type workerPool struct { + t jobType + exit atomic.Bool + resPool *pools.ResourcePool +} + +func newDDLWorkerPool(resPool *pools.ResourcePool, tp jobType) *workerPool { + return &workerPool{ + t: tp, + exit: *atomic.NewBool(false), + resPool: resPool, + } +} + +// get gets workerPool from context resource pool. +// Please remember to call put after you finished using workerPool. +func (wp *workerPool) get() (*worker, error) { + if wp.resPool == nil { + return nil, nil + } + + if wp.exit.Load() { + return nil, errors.Errorf("workerPool is closed") + } + + // no need to protect wp.resPool + resource, err := wp.resPool.TryGet() + if err != nil { + return nil, errors.Trace(err) + } + + if resource == nil { + return nil, nil + } + + worker := resource.(*worker) + return worker, nil +} + +// put returns workerPool to context resource pool. +func (wp *workerPool) put(wk *worker) { + if wp.resPool == nil { + return + } + + // no need to protect wp.resPool, even the wp.resPool is closed, the ctx still need to + // put into resPool, because when resPool is closing, it will wait all the ctx returns, then resPool finish closing. + wp.resPool.Put(wk) +} + +// close clean up the workerPool. +func (wp *workerPool) close() { + // prevent closing resPool twice. + if wp.exit.Load() || wp.resPool == nil { + return + } + wp.exit.Store(true) + logutil.BgLogger().Info("[ddl] closing workerPool") + wp.resPool.Close() +} + +// tp return the type of worker pool. +func (wp *workerPool) tp() jobType { + return wp.t +} diff --git a/ddl/foreign_key.go b/ddl/foreign_key.go index b81e2729af379..dfccb1086c9af 100644 --- a/ddl/foreign_key.go +++ b/ddl/foreign_key.go @@ -111,5 +111,4 @@ func onDropForeignKey(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ err default: return ver, dbterror.ErrInvalidDDLState.GenWithStackByArgs("foreign key", fkInfo.State) } - } diff --git a/ddl/index.go b/ddl/index.go index 4016cee19f59a..0a3e9fe1b7814 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -323,8 +323,13 @@ func onRenameIndex(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) return ver, errors.Trace(dbterror.ErrOptOnCacheTable.GenWithStackByArgs("Rename Index")) } - idx := tblInfo.FindIndexByName(from.L) - idx.Name = to + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + // Store the mark and enter the next DDL handling loop. + return updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, false) + } + + renameIndexes(tblInfo, from, to) if ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true); err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -333,11 +338,16 @@ func onRenameIndex(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) return ver, nil } -func validateAlterIndexVisibility(indexName model.CIStr, invisible bool, tbl *model.TableInfo) (bool, error) { - if idx := tbl.FindIndexByName(indexName.L); idx == nil { +func validateAlterIndexVisibility(ctx sessionctx.Context, indexName model.CIStr, invisible bool, tbl *model.TableInfo) (bool, error) { + var idx *model.IndexInfo + if idx = tbl.FindIndexByName(indexName.L); idx == nil || idx.State != model.StatePublic { return false, errors.Trace(infoschema.ErrKeyNotExists.GenWithStackByArgs(indexName.O, tbl.Name)) - } else if idx.Invisible == invisible { - return true, nil + } + if ctx == nil || ctx.GetSessionVars() == nil || ctx.GetSessionVars().StmtCtx.MultiSchemaInfo == nil { + // Early return. + if idx.Invisible == invisible { + return true, nil + } } return false, nil } @@ -347,8 +357,13 @@ func onAlterIndexVisibility(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, if err != nil || tblInfo == nil { return ver, errors.Trace(err) } - idx := tblInfo.FindIndexByName(from.L) - idx.Invisible = invisible + + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + return updateVersionAndTableInfo(d, t, job, tblInfo, false) + } + + setIndexVisibility(tblInfo, from, invisible) if ver, err = updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, true); err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -357,6 +372,14 @@ func onAlterIndexVisibility(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, return ver, nil } +func setIndexVisibility(tblInfo *model.TableInfo, name model.CIStr, invisible bool) { + for _, idx := range tblInfo.Indices { + if idx.Name.L == name.L || (isTempIdxInfo(idx, tblInfo) && getChangingIndexOriginName(idx) == name.O) { + idx.Invisible = invisible + } + } +} + func getNullColInfos(tblInfo *model.TableInfo, indexInfo *model.IndexInfo) ([]*model.ColumnInfo, error) { nullCols := make([]*model.ColumnInfo, 0, len(indexInfo.Columns)) for _, colName := range indexInfo.Columns { @@ -396,10 +419,31 @@ func checkPrimaryKeyNotNull(d *ddlCtx, w *worker, sqlMode mysql.SQLMode, t *meta return nil, err } -func updateHiddenColumns(tblInfo *model.TableInfo, idxInfo *model.IndexInfo, state model.SchemaState) { +// moveAndUpdateHiddenColumnsToPublic updates the hidden columns to public, and +// moves the hidden columns to proper offsets, so that Table.Columns' states meet the assumption of +// [public, public, ..., public, non-public, non-public, ..., non-public]. +func moveAndUpdateHiddenColumnsToPublic(tblInfo *model.TableInfo, idxInfo *model.IndexInfo) { + hiddenColOffset := make(map[int]struct{}, 0) for _, col := range idxInfo.Columns { if tblInfo.Columns[col.Offset].Hidden { - tblInfo.Columns[col.Offset].State = state + hiddenColOffset[col.Offset] = struct{}{} + } + } + if len(hiddenColOffset) == 0 { + return + } + // Find the first non-public column. + firstNonPublicPos := len(tblInfo.Columns) - 1 + for i, c := range tblInfo.Columns { + if c.State != model.StatePublic { + firstNonPublicPos = i + break + } + } + for _, col := range idxInfo.Columns { + tblInfo.Columns[col.Offset].State = model.StatePublic + if _, needMove := hiddenColOffset[col.Offset]; needMove { + tblInfo.MoveColumnInfo(col.Offset, firstNonPublicPos) } } } @@ -469,13 +513,8 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo if indexInfo == nil { if len(hiddenCols) > 0 { - pos := &ast.ColumnPosition{Tp: ast.ColumnPositionNone} for _, hiddenCol := range hiddenCols { - _, _, _, err = createColumnInfoWithPosCheck(tblInfo, hiddenCol, pos) - if err != nil { - job.State = model.JobStateCancelled - return ver, errors.Trace(err) - } + initAndAddColumnToTable(tblInfo, hiddenCol) } } if err = checkAddColumnTooManyColumns(len(tblInfo.Columns)); err != nil { @@ -532,13 +571,13 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo case model.StateNone: // none -> delete only indexInfo.State = model.StateDeleteOnly - updateHiddenColumns(tblInfo, indexInfo, model.StatePublic) + moveAndUpdateHiddenColumnsToPublic(tblInfo, indexInfo) ver, err = updateVersionAndTableInfoWithCheck(d, t, job, tblInfo, originalState != indexInfo.State) if err != nil { return ver, err } job.SchemaState = model.StateDeleteOnly - metrics.GetBackfillProgressByLabel(metrics.LblAddIndex).Set(0) + metrics.GetBackfillProgressByLabel(metrics.LblAddIndex, job.SchemaName, tblInfo.Name.String()).Set(0) case model.StateDeleteOnly: // delete only -> write only indexInfo.State = model.StateWriteOnly @@ -573,12 +612,15 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo } var done bool - done, ver, err = doReorgWorkForCreateIndex(w, d, t, job, tbl, indexInfo) + if job.MultiSchemaInfo != nil { + done, ver, err = doReorgWorkForCreateIndexMultiSchema(w, d, t, job, tbl, indexInfo) + } else { + done, ver, err = doReorgWorkForCreateIndex(w, d, t, job, tbl, indexInfo) + } if !done { return ver, err } - indexInfo.State = model.StatePublic // Set column index flag. addIndexColumnFlag(tblInfo, indexInfo) if isPK { @@ -586,6 +628,7 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo return ver, errors.Trace(err) } } + indexInfo.State = model.StatePublic ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, originalState != indexInfo.State) if err != nil { return ver, errors.Trace(err) @@ -599,10 +642,23 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo return ver, errors.Trace(err) } +func doReorgWorkForCreateIndexMultiSchema(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, + tbl table.Table, indexInfo *model.IndexInfo) (done bool, ver int64, err error) { + if job.MultiSchemaInfo.Revertible { + done, ver, err = doReorgWorkForCreateIndex(w, d, t, job, tbl, indexInfo) + if done { + job.MarkNonRevertible() + } + // We need another round to wait for all the others sub-jobs to finish. + return false, ver, err + } + return true, ver, err +} + func doReorgWorkForCreateIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, indexInfo *model.IndexInfo) (done bool, ver int64, err error) { elements := []*meta.Element{{ID: indexInfo.ID, TypeKey: meta.IndexElementKey}} - rh := newReorgHandler(t) + rh := newReorgHandler(t, w.sess, w.concurrentDDL) reorgInfo, err := getReorgInfo(d.jobContext(job), d, rh, job, tbl, elements) if err != nil || reorgInfo.first { // If we run reorg firstly, we should update the job snapshot version @@ -639,7 +695,7 @@ func onDropIndex(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { if err != nil { if ifExists && dbterror.ErrCantDropFieldOrKey.Equal(err) { job.Warning = toTError(err) - job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) + job.State = model.JobStateDone return ver, nil } return ver, errors.Trace(err) @@ -877,12 +933,13 @@ func checkAlterIndexVisibility(t *meta.Meta, job *model.Job) (*model.TableInfo, return nil, indexName, invisible, errors.Trace(err) } - skip, err := validateAlterIndexVisibility(indexName, invisible, tblInfo) + skip, err := validateAlterIndexVisibility(nil, indexName, invisible, tblInfo) if err != nil { job.State = model.JobStateCancelled return nil, indexName, invisible, errors.Trace(err) } if skip { + job.State = model.JobStateDone return nil, indexName, invisible, nil } return tblInfo, indexName, invisible, nil @@ -1295,7 +1352,7 @@ func (w *worker) updateReorgInfo(t table.PartitionedTable, reorg *reorgInfo) (bo ts := oracle.GoTimeToTS(time.Now()) s := reorg.d.store.(tikv.Storage) s.UpdateSPCache(ts, time.Now()) - time.Sleep(time.Millisecond * 3) + time.Sleep(time.Second * 3) } }) currentVer, err := getValidCurrentVersion(reorg.d.store) @@ -1309,7 +1366,7 @@ func (w *worker) updateReorgInfo(t table.PartitionedTable, reorg *reorgInfo) (bo reorg.StartKey, reorg.EndKey, reorg.PhysicalTableID = start, end, pid // Write the reorg info to store so the whole reorganize process can recover from panic. - err = reorg.UpdateReorgMeta(start) + err = reorg.UpdateReorgMeta(start, w.sessPool) logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), zap.ByteString("elementType", reorg.currElement.TypeKey), @@ -1495,7 +1552,7 @@ func (w *worker) updateReorgInfoForPartitions(t table.PartitionedTable, reorg *r reorg.StartKey, reorg.EndKey, reorg.PhysicalTableID = start, end, pid // Write the reorg info to store so the whole reorganize process can recover from panic. - err = reorg.UpdateReorgMeta(reorg.StartKey) + err = reorg.UpdateReorgMeta(reorg.StartKey, w.sessPool) logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), zap.ByteString("elementType", reorg.currElement.TypeKey), zap.Int64("elementID", reorg.currElement.ID), zap.Int64("partitionTableID", pid), zap.String("startHandle", tryDecodeToHandleString(start)), @@ -1503,17 +1560,74 @@ func (w *worker) updateReorgInfoForPartitions(t table.PartitionedTable, reorg *r return false, errors.Trace(err) } -func findIndexesByColName(indexes []*model.IndexInfo, colName string) ([]*model.IndexInfo, []int) { - idxInfos := make([]*model.IndexInfo, 0, len(indexes)) - offsets := make([]int, 0, len(indexes)) - for _, idxInfo := range indexes { - for i, c := range idxInfo.Columns { - if strings.EqualFold(colName, c.Name.L) { - idxInfos = append(idxInfos, idxInfo) - offsets = append(offsets, i) - break +// changingIndex is used to store the index that need to be changed during modifying column. +type changingIndex struct { + indexInfo *model.IndexInfo + // Column offset in idxInfo.Columns. + offset int + // When the modifying column is contained in the index, a temp index is created. + // isTemp indicates whether the indexInfo is a temp index created by a previous modify column job. + isTemp bool +} + +// findRelatedIndexesToChange finds the indexes that covering the given column. +// The normal one will be overridden by the temp one. +func findRelatedIndexesToChange(tblInfo *model.TableInfo, colName model.CIStr) []changingIndex { + // In multi-schema change jobs that contains several "modify column" sub-jobs, there may be temp indexes for another temp index. + // To prevent reorganizing too many indexes, we should create the temp indexes that are really necessary. + var normalIdxInfos, tempIdxInfos []changingIndex + for _, idxInfo := range tblInfo.Indices { + if pos := findIdxCol(idxInfo, colName); pos != -1 { + isTemp := isTempIdxInfo(idxInfo, tblInfo) + r := changingIndex{indexInfo: idxInfo, offset: pos, isTemp: isTemp} + if isTemp { + tempIdxInfos = append(tempIdxInfos, r) + } else { + normalIdxInfos = append(normalIdxInfos, r) + } + } + } + // Overwrite if the index has the corresponding temp index. For example, + // we try to find the indexes that contain the column `b` and there are two indexes, `i(a, b)` and `$i($a, b)`. + // Note that the symbol `$` means temporary. The index `$i($a, b)` is temporarily created by the previous "modify a" statement. + // In this case, we would create a temporary index like $$i($a, $b), so the latter should be chosen. + result := normalIdxInfos + for _, tmpIdx := range tempIdxInfos { + origName := getChangingIndexOriginName(tmpIdx.indexInfo) + for i, normIdx := range normalIdxInfos { + if normIdx.indexInfo.Name.O == origName { + result[i] = tmpIdx } } } - return idxInfos, offsets + return result +} + +func isTempIdxInfo(idxInfo *model.IndexInfo, tblInfo *model.TableInfo) bool { + for _, idxCol := range idxInfo.Columns { + if tblInfo.Columns[idxCol.Offset].ChangeStateInfo != nil { + return true + } + } + return false +} + +func findIdxCol(idxInfo *model.IndexInfo, colName model.CIStr) int { + for offset, idxCol := range idxInfo.Columns { + if idxCol.Name.L == colName.L { + return offset + } + } + return -1 +} + +func renameIndexes(tblInfo *model.TableInfo, from, to model.CIStr) { + for _, idx := range tblInfo.Indices { + if idx.Name.L == from.L { + idx.Name = to + } else if isTempIdxInfo(idx, tblInfo) && getChangingIndexOriginName(idx) == from.O { + idx.Name.L = strings.Replace(idx.Name.L, from.L, to.L, 1) + idx.Name.O = strings.Replace(idx.Name.O, from.O, to.O, 1) + } + } } diff --git a/ddl/job_table.go b/ddl/job_table.go new file mode 100644 index 0000000000000..23cedfb8b1b56 --- /dev/null +++ b/ddl/job_table.go @@ -0,0 +1,556 @@ +// 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 ddl + +import ( + "bytes" + "context" + "fmt" + "math" + "strconv" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/util/logutil" + clientv3 "go.etcd.io/etcd/client/v3" + "go.uber.org/zap" + "golang.org/x/exp/slices" +) + +var ( + addingDDLJobConcurrent = "/tidb/ddl/add_ddl_job_general" +) + +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) and %s reorg %s order by processing desc, job_id" +) + +type jobType int + +func (t jobType) String() string { + switch t { + case general: + return "general" + case reorg: + return "reorg" + } + return "unknown job type: " + strconv.Itoa(int(t)) +} + +const ( + general jobType = iota + reorg +) + +func (d *ddl) getJob(sess *session, tp jobType, filter func(*model.Job) (bool, error)) (*model.Job, error) { + not := "not" + label := "get_job_general" + if tp == reorg { + not = "" + label = "get_job_reorg" + } + sql := fmt.Sprintf(getJobSQL, not, d.excludeJobIDs()) + rows, err := sess.execute(context.Background(), sql, label) + if err != nil { + return nil, errors.Trace(err) + } + for _, row := range rows { + jobBinary := row.GetBytes(0) + runJob := model.Job{} + err := runJob.Decode(jobBinary) + if err != nil { + return nil, errors.Trace(err) + } + if row.GetInt64(1) == 1 { + return &runJob, nil + } + b, err := filter(&runJob) + if err != nil { + return nil, errors.Trace(err) + } + if b { + if err := d.markJobProcessing(sess, &runJob); err != nil { + logutil.BgLogger().Warn("[ddl] handle ddl job failed: mark job is processing meet error", zap.Error(err), zap.String("job", runJob.String())) + return nil, errors.Trace(err) + } + return &runJob, nil + } + } + return nil, nil +} + +func (d *ddl) getGeneralJob(sess *session) (*model.Job, error) { + return d.getJob(sess, general, func(job *model.Job) (bool, error) { + if job.Type == model.ActionDropSchema { + sql := fmt.Sprintf("select job_id from mysql.tidb_ddl_job where find_in_set(%s, schema_ids) != 0 and processing limit 1", strconv.Quote(strconv.FormatInt(job.SchemaID, 10))) + return d.checkJobIsRunnable(sess, sql) + } + // For general job, there is only 1 general worker to handle it, so at this moment the processing job must be reorg job and the reorg job must only contain one table id. + // So it's not possible the find_in_set("1,2", "1,2,3") occurs. + 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 find_in_set(t1.table_ids, t2.table_ids) != 0", job.ID) + return d.checkJobIsRunnable(sess, sql) + }) +} + +func (d *ddl) checkJobIsRunnable(sess *session, sql string) (bool, error) { + rows, err := sess.execute(context.Background(), sql, "check_runnable") + return len(rows) == 0, err +} + +func (d *ddl) getReorgJob(sess *session) (*model.Job, error) { + return d.getJob(sess, reorg, func(job *model.Job) (bool, error) { + sql := fmt.Sprintf("select job_id from mysql.tidb_ddl_job where (find_in_set(%s, schema_ids) != 0 and type = %d and processing) or (find_in_set(%s, table_ids) != 0 and processing) limit 1", + strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), model.ActionDropSchema, strconv.Quote(strconv.FormatInt(job.TableID, 10))) + return d.checkJobIsRunnable(sess, sql) + }) +} + +func (d *ddl) startDispatchLoop() { + se, err := d.sessPool.get() + if err != nil { + logutil.BgLogger().Fatal("dispatch loop get session failed, it should not happen, please try restart TiDB", zap.Error(err)) + } + defer d.sessPool.put(se) + sess := newSession(se) + var notifyDDLJobByEtcdCh clientv3.WatchChan + if d.etcdCli != nil { + notifyDDLJobByEtcdCh = d.etcdCli.Watch(d.ctx, addingDDLJobConcurrent) + } + ticker := time.NewTicker(1 * time.Second) + defer ticker.Stop() + for { + if isChanClosed(d.ctx.Done()) { + return + } + if !variable.EnableConcurrentDDL.Load() || !d.isOwner() || d.waiting.Load() { + d.once.Store(true) + time.Sleep(time.Second) + continue + } + select { + case <-d.ddlJobCh: + case <-ticker.C: + case _, ok := <-notifyDDLJobByEtcdCh: + if !ok { + logutil.BgLogger().Warn("[ddl] start worker watch channel closed", zap.String("watch key", addingDDLJobConcurrent)) + notifyDDLJobByEtcdCh = d.etcdCli.Watch(d.ctx, addingDDLJobConcurrent) + time.Sleep(time.Second) + continue + } + case <-d.ctx.Done(): + return + } + d.getDDLJobAndRun(sess, d.generalDDLWorkerPool, d.getGeneralJob) + d.getDDLJobAndRun(sess, d.reorgWorkerPool, d.getReorgJob) + } +} + +func (d *ddl) getDDLJobAndRun(sess *session, pool *workerPool, getJob func(*session) (*model.Job, error)) { + wk, err := pool.get() + if err != nil || wk == nil { + logutil.BgLogger().Debug(fmt.Sprintf("[ddl] no %v worker available now", pool.tp()), zap.Error(err)) + return + } + + d.mu.RLock() + d.mu.hook.OnGetJobBefore(pool.tp().String()) + d.mu.RUnlock() + + job, err := getJob(sess) + if job == nil || err != nil { + if err != nil { + logutil.BgLogger().Warn("[ddl] get job met error", zap.Error(err)) + } + pool.put(wk) + return + } + d.mu.RLock() + d.mu.hook.OnGetJobAfter(pool.tp().String(), job) + d.mu.RUnlock() + + d.delivery2worker(wk, pool, job) +} + +func (d *ddl) delivery2worker(wk *worker, pool *workerPool, job *model.Job) { + injectFailPointForGetJob(job) + d.insertRunningDDLJobMap(job.ID) + d.wg.Run(func() { + metrics.DDLRunningJobCount.WithLabelValues(pool.tp().String()).Inc() + defer func() { + pool.put(wk) + d.deleteRunningDDLJobMap(job.ID) + asyncNotify(d.ddlJobCh) + metrics.DDLRunningJobCount.WithLabelValues(pool.tp().String()).Dec() + }() + // we should wait 2 * d.lease time to guarantee all TiDB server have finished the schema change. + // see waitSchemaSynced for more details. + if !d.isSynced(job) || d.once.Load() { + wk.waitSchemaSynced(d.ddlCtx, job, 2*d.lease) + d.once.Store(false) + } + if err := wk.HandleDDLJobTable(d.ddlCtx, job); err != nil { + logutil.BgLogger().Info("[ddl] handle ddl job failed", zap.Error(err), zap.String("job", job.String())) + } + }) +} + +func (d *ddl) markJobProcessing(sess *session, job *model.Job) error { + sess.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) + _, err := sess.execute(context.Background(), fmt.Sprintf("update mysql.tidb_ddl_job set processing = 1 where job_id = %d", job.ID), "mark_job_processing") + return errors.Trace(err) +} + +const ( + addDDLJobSQL = "insert into mysql.tidb_ddl_job(job_id, reorg, schema_ids, table_ids, job_meta, type, processing) values" + updateDDLJobSQL = "update mysql.tidb_ddl_job set job_meta = %s where job_id = %d" +) + +func insertDDLJobs2Table(sess *session, jobs []*model.Job, updateRawArgs bool) error { + failpoint.Inject("mockAddBatchDDLJobsErr", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(errors.Errorf("mockAddBatchDDLJobsErr")) + } + }) + if len(jobs) == 0 { + return nil + } + var sql bytes.Buffer + sql.WriteString(addDDLJobSQL) + for i, job := range jobs { + b, err := job.Encode(updateRawArgs) + if err != nil { + return err + } + if i != 0 { + sql.WriteString(",") + } + sql.WriteString(fmt.Sprintf("(%d, %t, %s, %s, %s, %d, %t)", job.ID, job.MayNeedReorg(), strconv.Quote(job2SchemaIDs(job)), strconv.Quote(job2TableIDs(job)), wrapKey2String(b), job.Type, !job.NotStarted())) + } + sess.SetDiskFullOpt(kvrpcpb.DiskFullOpt_AllowedOnAlmostFull) + ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) + _, err := sess.execute(ctx, sql.String(), "insert_job") + logutil.BgLogger().Debug("[ddl] add job to mysql.tidb_ddl_job table", zap.String("sql", sql.String())) + return errors.Trace(err) +} + +func job2SchemaIDs(job *model.Job) string { + return job2UniqueIDs(job, true) +} + +func job2TableIDs(job *model.Job) string { + return job2UniqueIDs(job, false) +} + +func job2UniqueIDs(job *model.Job, schema bool) string { + switch job.Type { + case model.ActionExchangeTablePartition, model.ActionRenameTables, model.ActionRenameTable: + var ids []int64 + if schema { + ids = job.CtxVars[0].([]int64) + } else { + ids = job.CtxVars[1].([]int64) + } + set := make(map[int64]struct{}, len(ids)) + for _, id := range ids { + set[id] = struct{}{} + } + + s := make([]string, 0, len(set)) + for id := range set { + s = append(s, strconv.FormatInt(id, 10)) + } + slices.Sort(s) + return strings.Join(s, ",") + } + if schema { + return strconv.FormatInt(job.SchemaID, 10) + } + return strconv.FormatInt(job.TableID, 10) +} + +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") + return errors.Trace(err) +} + +func updateDDLJob2Table(sctx *session, job *model.Job, updateRawArgs bool) error { + b, err := job.Encode(updateRawArgs) + if err != nil { + return err + } + sql := fmt.Sprintf(updateDDLJobSQL, wrapKey2String(b), job.ID) + _, err = sctx.execute(context.Background(), sql, "update_job") + return errors.Trace(err) +} + +// getDDLReorgHandle gets DDL reorg handle. +func getDDLReorgHandle(sess *session, job *model.Job) (element *meta.Element, startKey, endKey kv.Key, physicalTableID int64, err error) { + sql := fmt.Sprintf("select ele_id, ele_type, start_key, end_key, physical_id from mysql.tidb_ddl_reorg where job_id = %d", job.ID) + rows, err := sess.execute(context.Background(), sql, "get_handle") + if err != nil { + return nil, nil, nil, 0, err + } + if len(rows) == 0 { + return nil, nil, nil, 0, meta.ErrDDLReorgElementNotExist + } + id := rows[0].GetInt64(0) + tp := rows[0].GetBytes(1) + element = &meta.Element{ + ID: id, + TypeKey: tp, + } + startKey = rows[0].GetBytes(2) + endKey = rows[0].GetBytes(3) + physicalTableID = rows[0].GetInt64(4) + // physicalTableID may be 0, because older version TiDB (without table partition) doesn't store them. + // update them to table's in this case. + if physicalTableID == 0 { + if job.ReorgMeta != nil { + endKey = kv.IntHandle(job.ReorgMeta.EndHandle).Encoded() + } else { + endKey = kv.IntHandle(math.MaxInt64).Encoded() + } + physicalTableID = job.TableID + logutil.BgLogger().Warn("new TiDB binary running on old TiDB DDL reorg data", + zap.Int64("partition ID", physicalTableID), + zap.Stringer("startHandle", startKey), + zap.Stringer("endHandle", endKey)) + } + return +} + +// updateDDLReorgStartHandle update the startKey of the handle. +func updateDDLReorgStartHandle(sess *session, job *model.Job, element *meta.Element, startKey kv.Key) error { + sql := fmt.Sprintf("update mysql.tidb_ddl_reorg set ele_id = %d, ele_type = %s, start_key = %s where job_id = %d", + element.ID, wrapKey2String(element.TypeKey), wrapKey2String(startKey), job.ID) + _, err := sess.execute(context.Background(), sql, "update_start_handle") + return err +} + +// updateDDLReorgHandle update startKey, endKey physicalTableID and element of the handle. +func updateDDLReorgHandle(sess *session, jobID int64, startKey kv.Key, endKey kv.Key, physicalTableID int64, element *meta.Element) error { + sql := fmt.Sprintf("update mysql.tidb_ddl_reorg set ele_id = %d, ele_type = %s, start_key = %s, end_key = %s, physical_id = %d where job_id = %d", + element.ID, wrapKey2String(element.TypeKey), wrapKey2String(startKey), wrapKey2String(endKey), physicalTableID, jobID) + _, err := sess.execute(context.Background(), sql, "update_handle") + return err +} + +// initDDLReorgHandle initializes the handle for ddl reorg. +func initDDLReorgHandle(sess *session, jobID int64, startKey kv.Key, endKey kv.Key, physicalTableID int64, element *meta.Element) error { + sql := fmt.Sprintf("insert into mysql.tidb_ddl_reorg(job_id, ele_id, ele_type, start_key, end_key, physical_id) values (%d, %d, %s, %s, %s, %d)", + jobID, element.ID, wrapKey2String(element.TypeKey), wrapKey2String(startKey), wrapKey2String(endKey), physicalTableID) + _, err := sess.execute(context.Background(), sql, "update_handle") + return err +} + +// deleteDDLReorgHandle deletes the handle for ddl reorg. +func removeDDLReorgHandle(sess *session, job *model.Job, elements []*meta.Element) error { + if len(elements) == 0 { + return nil + } + sql := fmt.Sprintf("delete from mysql.tidb_ddl_reorg where job_id = %d", job.ID) + _, err := sess.execute(context.Background(), sql, "remove_handle") + return err +} + +// removeReorgElement removes the element from ddl reorg, it is the same with removeDDLReorgHandle, only used in failpoint +func removeReorgElement(sess *session, job *model.Job) error { + sql := fmt.Sprintf("delete from mysql.tidb_ddl_reorg where job_id = %d", job.ID) + _, err := sess.execute(context.Background(), sql, "remove_handle") + return err +} + +func wrapKey2String(key []byte) string { + if len(key) == 0 { + return "''" + } + return fmt.Sprintf("0x%x", key) +} + +func getJobsBySQL(sess *session, tbl, condition string) ([]*model.Job, error) { + rows, err := sess.execute(context.Background(), fmt.Sprintf("select job_meta from mysql.%s where %s", tbl, condition), "get_job") + if err != nil { + return nil, errors.Trace(err) + } + jobs := make([]*model.Job, 0, 16) + for _, row := range rows { + jobBinary := row.GetBytes(0) + job := model.Job{} + err := job.Decode(jobBinary) + if err != nil { + return nil, errors.Trace(err) + } + jobs = append(jobs, &job) + } + return jobs, nil +} + +// MoveJobFromQueue2Table move existing DDLs in queue to table. +func (d *ddl) MoveJobFromQueue2Table(force bool) error { + sess, err := d.sessPool.get() + if err != nil { + return err + } + defer d.sessPool.put(sess) + return runInTxn(newSession(sess), func(se *session) error { + txn, err := se.txn() + if err != nil { + return errors.Trace(err) + } + t := meta.NewMeta(txn) + isConcurrentDDL, err := t.IsConcurrentDDL() + if !force && (isConcurrentDDL || err != nil) { + return errors.Trace(err) + } + for _, tp := range []workerType{addIdxWorker, generalWorker} { + t := newMetaWithQueueTp(txn, tp) + jobs, err := t.GetAllDDLJobsInQueue() + if err != nil { + return errors.Trace(err) + } + err = insertDDLJobs2Table(se, jobs, false) + if err != nil { + return errors.Trace(err) + } + if tp == generalWorker { + // general job do not have reorg info. + continue + } + for _, job := range jobs { + element, start, end, pid, err := t.GetDDLReorgHandle(job) + if meta.ErrDDLReorgElementNotExist.Equal(err) { + continue + } + if err != nil { + return errors.Trace(err) + } + err = initDDLReorgHandle(se, job.ID, start, end, pid, element) + if err != nil { + return errors.Trace(err) + } + } + } + + if err = t.ClearALLDDLJob(); err != nil { + return errors.Trace(err) + } + if err = t.ClearAllDDLReorgHandle(); err != nil { + return errors.Trace(err) + } + return t.SetConcurrentDDL(true) + }) +} + +// MoveJobFromTable2Queue move existing DDLs in table to queue. +func (d *ddl) MoveJobFromTable2Queue() error { + sess, err := d.sessPool.get() + if err != nil { + return err + } + defer d.sessPool.put(sess) + return runInTxn(newSession(sess), func(se *session) error { + txn, err := se.txn() + if err != nil { + return errors.Trace(err) + } + t := meta.NewMeta(txn) + isConcurrentDDL, err := t.IsConcurrentDDL() + if !isConcurrentDDL || err != nil { + return errors.Trace(err) + } + jobs, err := getJobsBySQL(se, "tidb_ddl_job", "1 order by job_id") + if err != nil { + return errors.Trace(err) + } + + for _, job := range jobs { + jobListKey := meta.DefaultJobListKey + if job.MayNeedReorg() { + jobListKey = meta.AddIndexJobListKey + } + if err := t.EnQueueDDLJobNoUpdate(job, jobListKey); err != nil { + return errors.Trace(err) + } + } + + reorgHandle, err := se.execute(context.Background(), "select job_id, start_key, end_key, physical_id, ele_id, ele_type from mysql.tidb_ddl_reorg", "get_handle") + if err != nil { + return errors.Trace(err) + } + for _, row := range reorgHandle { + if err := t.UpdateDDLReorgHandle(row.GetInt64(0), row.GetBytes(1), row.GetBytes(2), row.GetInt64(3), &meta.Element{ID: row.GetInt64(4), TypeKey: row.GetBytes(5)}); err != nil { + return errors.Trace(err) + } + } + + // clean up these 2 tables. + _, err = se.execute(context.Background(), "delete from mysql.tidb_ddl_job", "delete_old_ddl") + if err != nil { + return errors.Trace(err) + } + _, err = se.execute(context.Background(), "delete from mysql.tidb_ddl_reorg", "delete_old_reorg") + if err != nil { + return errors.Trace(err) + } + return t.SetConcurrentDDL(false) + }) +} + +func runInTxn(se *session, f func(*session) error) (err error) { + err = se.begin() + if err != nil { + return err + } + err = f(se) + if err != nil { + se.rollback() + return + } + return errors.Trace(se.commit()) +} diff --git a/ddl/job_table_test.go b/ddl/job_table_test.go new file mode 100644 index 0000000000000..8f2b5b5a056b8 --- /dev/null +++ b/ddl/job_table_test.go @@ -0,0 +1,301 @@ +// 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 ddl_test + +import ( + "context" + "fmt" + "math/rand" + "sync" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util" + "github.com/stretchr/testify/require" + "go.uber.org/atomic" + "golang.org/x/exp/slices" +) + +func TestDDLSchedulingMultiTimes(t *testing.T) { + if !variable.EnableConcurrentDDL.Load() { + t.Skipf("test requires concurrent ddl") + } + for i := 0; i < 3; i++ { + testDDLScheduling(t) + } +} + +// testDDLScheduling tests the DDL scheduling. See Concurrent DDL RFC for the rules of DDL scheduling. +// This test checks the chosen job records to see if there are wrong scheduling, if job A and job B cannot run concurrently, +// then the all the record of job A must before or after job B, no cross record between these 2 jobs should be in between. +func testDDLScheduling(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE e (id INT NOT NULL) PARTITION BY RANGE (id) (PARTITION p1 VALUES LESS THAN (50), PARTITION p2 VALUES LESS THAN (100));") + tk.MustExec("CREATE TABLE e2 (id INT NOT NULL);") + tk.MustExec("CREATE TABLE e3 (id INT NOT NULL);") + + d := dom.DDL() + + ddlJobs := []string{ + "alter table e2 add index idx(id)", + "alter table e2 add index idx1(id)", + "alter table e2 add index idx2(id)", + "create table e5 (id int)", + "ALTER TABLE e EXCHANGE PARTITION p1 WITH TABLE e2;", + "alter table e add index idx(id)", + "alter table e add partition (partition p3 values less than (150))", + "create table e4 (id int)", + "alter table e3 add index idx1(id)", + "ALTER TABLE e EXCHANGE PARTITION p1 WITH TABLE e3;", + } + + hook := &ddl.TestDDLCallback{} + var wg util.WaitGroupWrapper + wg.Add(1) + var once sync.Once + hook.OnGetJobBeforeExported = func(jobType string) { + once.Do(func() { + for i, job := range ddlJobs { + wg.Run(func() { + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_exchange_partition=1") + recordSet, _ := tk.Exec(job) + if recordSet != nil { + require.NoError(t, recordSet.Close()) + } + }) + for { + time.Sleep(time.Millisecond * 100) + jobs, err := ddl.GetAllDDLJobs(testkit.NewTestKit(t, store).Session(), nil) + require.NoError(t, err) + if len(jobs) == i+1 { + break + } + } + } + wg.Done() + }) + } + + record := make([]int64, 0, 16) + hook.OnGetJobAfterExported = func(jobType string, job *model.Job) { + // record the job schedule order + record = append(record, job.ID) + } + + err := failpoint.Enable("github.com/pingcap/tidb/ddl/mockRunJobTime", `return(true)`) + require.NoError(t, err) + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/ddl/mockRunJobTime") + require.NoError(t, err) + }() + + d.SetHook(hook) + wg.Wait() + + // sort all the job id. + ids := make(map[int64]struct{}, 16) + for _, id := range record { + ids[id] = struct{}{} + } + + sortedIDs := make([]int64, 0, 16) + for id := range ids { + sortedIDs = append(sortedIDs, id) + } + slices.Sort(sortedIDs) + + // map the job id to the DDL sequence. + // sortedIDs may looks like [30, 32, 34, 36, ...], it is the same order with the job in `ddlJobs`, 30 is the first job in `ddlJobs`, 32 is second... + // record may looks like [30, 30, 32, 32, 34, 32, 36, 34, ...] + // and the we map the record to the DDL sequence, [0, 0, 1, 1, 2, 1, 3, 2, ...] + for i := range record { + idx, b := slices.BinarySearch(sortedIDs, record[i]) + require.True(t, b) + record[i] = int64(idx) + } + + check(t, record, 0, 1, 2) + check(t, record, 0, 4) + check(t, record, 1, 4) + check(t, record, 2, 4) + check(t, record, 4, 5) + check(t, record, 4, 6) + check(t, record, 4, 9) + check(t, record, 5, 6) + check(t, record, 5, 9) + check(t, record, 6, 9) + check(t, record, 8, 9) +} + +// check will check if there are any cross between ids. +// e.g. if ids is [1, 2] this function checks all `1` is before or after than `2` in record. +func check(t *testing.T, record []int64, ids ...int64) { + // have return true if there are any `i` is before `j`, false if there are any `j` is before `i`. + have := func(i, j int64) bool { + for _, id := range record { + if id == i { + return true + } + if id == j { + return false + } + } + require.FailNow(t, "should not reach here") + return false + } + + // all checks if all `i` is before `j`. + all := func(i, j int64) { + meet := false + for _, id := range record { + if id == j { + meet = true + } + require.False(t, meet && id == i) + } + } + + for i := 0; i < len(ids)-1; i++ { + for j := i + 1; j < len(ids); j++ { + if have(ids[i], ids[j]) { + all(ids[i], ids[j]) + } else { + all(ids[j], ids[i]) + } + } + } +} + +func TestConcurrentDDLSwitch(t *testing.T) { + store, _, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + type table struct { + columnIdx int + indexIdx int + } + + var tables []*table + tblCount := 20 + for i := 0; i < tblCount; i++ { + tables = append(tables, &table{1, 0}) + } + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt=1") + tk.MustExec("set @@global.tidb_ddl_reorg_batch_size=32") + + for i := range tables { + tk.MustExec(fmt.Sprintf("create table t%d (col0 int) partition by range columns (col0) ("+ + "partition p1 values less than (100), "+ + "partition p2 values less than (300), "+ + "partition p3 values less than (500), "+ + "partition p4 values less than (700), "+ + "partition p5 values less than (1000), "+ + "partition p6 values less than maxvalue);", + i)) + for j := 0; j < 1000; j++ { + tk.MustExec(fmt.Sprintf("insert into t%d values (%d)", i, j)) + } + } + + ddls := make([]string, 0, tblCount) + ddlCount := 500 + for i := 0; i < ddlCount; i++ { + tblIdx := rand.Intn(tblCount) + if rand.Intn(2) == 0 { + ddls = append(ddls, fmt.Sprintf("alter table t%d add index idx%d (col0)", tblIdx, tables[tblIdx].indexIdx)) + tables[tblIdx].indexIdx++ + } else { + ddls = append(ddls, fmt.Sprintf("alter table t%d add column col%d int", tblIdx, tables[tblIdx].columnIdx)) + tables[tblIdx].columnIdx++ + } + } + + c := atomic.NewInt32(0) + ch := make(chan struct{}) + go func() { + var wg util.WaitGroupWrapper + for i := range ddls { + wg.Add(1) + go func(idx int) { + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(ddls[idx]) + c.Add(1) + wg.Done() + }(i) + } + wg.Wait() + ch <- struct{}{} + }() + + ticker := time.NewTicker(time.Second * 2) + count := 0 + done := false + for !done { + select { + case <-ch: + done = true + case <-ticker.C: + var b bool + var err error + err = kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, false, func(ctx context.Context, txn kv.Transaction) error { + b, err = meta.NewMeta(txn).IsConcurrentDDL() + return err + }) + require.NoError(t, err) + rs, err := testkit.NewTestKit(t, store).Exec(fmt.Sprintf("set @@global.tidb_enable_concurrent_ddl=%t", !b)) + if rs != nil { + require.NoError(t, rs.Close()) + } + if err == nil { + count++ + if b { + tk := testkit.NewTestKit(t, store) + tk.MustQuery("select count(*) from mysql.tidb_ddl_job").Check(testkit.Rows("0")) + tk.MustQuery("select count(*) from mysql.tidb_ddl_reorg").Check(testkit.Rows("0")) + } + } + } + } + + require.Equal(t, int32(ddlCount), c.Load()) + require.Greater(t, count, 0) + + tk = testkit.NewTestKit(t, store) + tk.MustExec("use test") + for i, tbl := range tables { + tk.MustQuery(fmt.Sprintf("select count(*) from information_schema.columns where TABLE_SCHEMA = 'test' and TABLE_NAME = 't%d'", i)).Check(testkit.Rows(fmt.Sprintf("%d", tbl.columnIdx))) + tk.MustExec(fmt.Sprintf("admin check table t%d", i)) + for j := 0; j < tbl.indexIdx; j++ { + tk.MustExec(fmt.Sprintf("admin check index t%d idx%d", i, j)) + } + } +} diff --git a/ddl/mock.go b/ddl/mock.go index 7f470cc979a7f..a5dfb75e2025e 100644 --- a/ddl/mock.go +++ b/ddl/mock.go @@ -120,13 +120,13 @@ func (s *MockSchemaSyncer) OwnerCheckAllVersions(ctx context.Context, latestVer } // NotifyCleanExpiredPaths implements SchemaSyncer.NotifyCleanExpiredPaths interface. -func (s *MockSchemaSyncer) NotifyCleanExpiredPaths() bool { return true } +func (*MockSchemaSyncer) NotifyCleanExpiredPaths() bool { return true } // StartCleanWork implements SchemaSyncer.StartCleanWork interface. -func (s *MockSchemaSyncer) StartCleanWork() {} +func (*MockSchemaSyncer) StartCleanWork() {} // Close implements SchemaSyncer.Close interface. -func (s *MockSchemaSyncer) Close() {} +func (*MockSchemaSyncer) Close() {} type mockDelRange struct { } @@ -137,12 +137,12 @@ func newMockDelRangeManager() delRangeManager { } // addDelRangeJob implements delRangeManager interface. -func (dr *mockDelRange) addDelRangeJob(ctx context.Context, job *model.Job) error { +func (*mockDelRange) addDelRangeJob(_ context.Context, _ *model.Job) error { return nil } // removeFromGCDeleteRange implements delRangeManager interface. -func (dr *mockDelRange) removeFromGCDeleteRange(ctx context.Context, jobID int64, tableIDs []int64) error { +func (*mockDelRange) removeFromGCDeleteRange(_ context.Context, _ int64, _ []int64) error { return nil } @@ -159,7 +159,7 @@ func MockTableInfo(ctx sessionctx.Context, stmt *ast.CreateTableStmt, tableID in if err != nil { return nil, errors.Trace(err) } - tbl, err := buildTableInfo(ctx, stmt.Table.Name, cols, newConstraints, "", "") + tbl, err := BuildTableInfo(ctx, stmt.Table.Name, cols, newConstraints, "", "") if err != nil { return nil, errors.Trace(err) } diff --git a/ddl/modify_column_test.go b/ddl/modify_column_test.go index cec65fb769c49..783f11d7c71d0 100644 --- a/ddl/modify_column_test.go +++ b/ddl/modify_column_test.go @@ -120,7 +120,7 @@ func TestModifyColumnReorgInfo(t *testing.T) { txn, err := ctx.Txn(true) require.NoError(t, err) m := meta.NewMeta(txn) - e, start, end, physicalID, err := m.GetDDLReorgHandle(currJob) + e, start, end, physicalID, err := ddl.NewReorgHandlerForTest(m, testkit.NewTestKit(t, store).Session()).GetDDLReorgHandle(currJob) require.True(t, meta.ErrDDLReorgElementNotExist.Equal(err)) require.Nil(t, e) require.Nil(t, start) diff --git a/ddl/multi_schema_change.go b/ddl/multi_schema_change.go index 20e62d89ed22b..894b926ba512e 100644 --- a/ddl/multi_schema_change.go +++ b/ddl/multi_schema_change.go @@ -27,6 +27,9 @@ import ( ) func (d *ddl) MultiSchemaChange(ctx sessionctx.Context, ti ast.Ident) error { + if len(ctx.GetSessionVars().StmtCtx.MultiSchemaInfo.SubJobs) == 0 { + return nil + } schema, t, err := d.getSchemaAndTableByIdent(ctx, ti) if err != nil { return errors.Trace(err) @@ -69,8 +72,12 @@ func onMultiSchemaChange(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job) (ve } proxyJob := sub.ToProxyJob(job) ver, err = w.runDDLJob(d, t, &proxyJob) - sub.FromProxyJob(&proxyJob) - return ver, err + err = handleRollbackException(err, proxyJob.Error) + if err != nil { + return ver, err + } + sub.FromProxyJob(&proxyJob, ver) + return ver, nil } // The last rollback/cancelling sub-job is done. job.State = model.JobStateRollbackDone @@ -88,7 +95,7 @@ func onMultiSchemaChange(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job) (ve } proxyJob := sub.ToProxyJob(job) ver, err = w.runDDLJob(d, t, &proxyJob) - sub.FromProxyJob(&proxyJob) + sub.FromProxyJob(&proxyJob, ver) handleRevertibleException(job, sub, proxyJob.Error) return ver, err } @@ -99,16 +106,23 @@ func onMultiSchemaChange(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job) (ve if err != nil { return ver, err } + var schemaVersionGenerated = false subJobs := make([]model.SubJob, len(job.MultiSchemaInfo.SubJobs)) // Step the sub-jobs to the non-revertible states all at once. + // We only generate 1 schema version for these sub-job. for i, sub := range job.MultiSchemaInfo.SubJobs { if sub.IsFinished() { continue } subJobs[i] = *sub proxyJob := sub.ToProxyJob(job) + if schemaVersionGenerated { + proxyJob.MultiSchemaInfo.SkipVersion = true + } else { + schemaVersionGenerated = true + } ver, err = w.runDDLJob(d, t, &proxyJob) - sub.FromProxyJob(&proxyJob) + sub.FromProxyJob(&proxyJob, ver) if err != nil || proxyJob.Error != nil { for j := i - 1; j >= 0; j-- { job.MultiSchemaInfo.SubJobs[j] = &subJobs[j] @@ -130,11 +144,10 @@ func onMultiSchemaChange(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job) (ve } proxyJob := sub.ToProxyJob(job) ver, err = w.runDDLJob(d, t, &proxyJob) - sub.FromProxyJob(&proxyJob) + sub.FromProxyJob(&proxyJob, ver) return ver, err } - job.State = model.JobStateDone - return ver, err + return finishMultiSchemaJob(job, t) } func handleRevertibleException(job *model.Job, subJob *model.SubJob, err *terror.Error) { @@ -154,6 +167,22 @@ func handleRevertibleException(job *model.Job, subJob *model.SubJob, err *terror } } +func handleRollbackException(runJobErr error, proxyJobErr *terror.Error) error { + if runJobErr != nil { + // The physical errors are not recoverable during rolling back. + // We keep retrying it. + return runJobErr + } + if proxyJobErr != nil { + if proxyJobErr.Equal(dbterror.ErrCancelledDDLJob) { + // A cancelled DDL error is normal during rolling back. + return nil + } + return proxyJobErr + } + return nil +} + func appendToSubJobs(m *model.MultiSchemaInfo, job *model.Job) error { err := fillMultiSchemaInfo(m, job) if err != nil { @@ -189,8 +218,47 @@ func fillMultiSchemaInfo(info *model.MultiSchemaInfo, job *model.Job) (err error case model.ActionDropIndex, model.ActionDropPrimaryKey: indexName := job.Args[0].(model.CIStr) info.DropIndexes = append(info.DropIndexes, indexName) + case model.ActionAddIndex, model.ActionAddPrimaryKey: + indexName := job.Args[1].(model.CIStr) + indexPartSpecifications := job.Args[2].([]*ast.IndexPartSpecification) + info.AddIndexes = append(info.AddIndexes, indexName) + for _, indexPartSpecification := range indexPartSpecifications { + info.RelativeColumns = append(info.RelativeColumns, indexPartSpecification.Column.Name) + } + if hiddenCols, ok := job.Args[4].([]*model.ColumnInfo); ok { + for _, c := range hiddenCols { + for depColName := range c.Dependences { + info.RelativeColumns = append(info.RelativeColumns, model.NewCIStr(depColName)) + } + } + } + case model.ActionRenameIndex: + from := job.Args[0].(model.CIStr) + to := job.Args[1].(model.CIStr) + info.AddIndexes = append(info.AddIndexes, to) + info.DropIndexes = append(info.DropIndexes, from) + case model.ActionModifyColumn: + newCol := *job.Args[0].(**model.ColumnInfo) + oldColName := job.Args[1].(model.CIStr) + pos := job.Args[2].(*ast.ColumnPosition) + if newCol.Name.L != oldColName.L { + info.AddColumns = append(info.AddColumns, newCol.Name) + info.DropColumns = append(info.DropColumns, oldColName) + } else { + info.ModifyColumns = append(info.ModifyColumns, newCol.Name) + } + if pos != nil && pos.Tp == ast.ColumnPositionAfter { + info.PositionColumns = append(info.PositionColumns, pos.RelativeColumn.Name) + } + case model.ActionSetDefaultValue: + col := job.Args[0].(*table.Column) + info.ModifyColumns = append(info.ModifyColumns, col.Name) + case model.ActionAlterIndexVisibility: + idxName := job.Args[0].(model.CIStr) + info.AlterIndexes = append(info.AlterIndexes, idxName) + case model.ActionRebaseAutoID, model.ActionModifyTableComment, model.ActionModifyTableCharsetAndCollate: default: - return dbterror.ErrRunMultiSchemaChanges + return dbterror.ErrRunMultiSchemaChanges.FastGenByArgs(job.Type.String()) } return nil } @@ -265,20 +333,14 @@ func checkMultiSchemaInfo(info *model.MultiSchemaInfo, t table.Table) error { } func appendMultiChangeWarningsToOwnerCtx(ctx sessionctx.Context, job *model.Job) { - if job.MultiSchemaInfo == nil { + if job.MultiSchemaInfo == nil || job.Type != model.ActionMultiSchemaChange { return } - if job.Type == model.ActionMultiSchemaChange { - for _, sub := range job.MultiSchemaInfo.SubJobs { - if sub.Warning != nil { - ctx.GetSessionVars().StmtCtx.AppendNote(sub.Warning) - } + for _, sub := range job.MultiSchemaInfo.SubJobs { + if sub.Warning != nil { + ctx.GetSessionVars().StmtCtx.AppendNote(sub.Warning) } } - for _, w := range job.MultiSchemaInfo.Warnings { - ctx.GetSessionVars().StmtCtx.AppendNote(w) - } - } // rollingBackMultiSchemaChange updates a multi-schema change job @@ -302,3 +364,17 @@ func rollingBackMultiSchemaChange(job *model.Job) error { job.State = model.JobStateRollingback return dbterror.ErrCancelledDDLJob } + +func finishMultiSchemaJob(job *model.Job, t *meta.Meta) (ver int64, err error) { + for _, sub := range job.MultiSchemaInfo.SubJobs { + if ver < sub.SchemaVer { + ver = sub.SchemaVer + } + } + tblInfo, err := t.GetTable(job.SchemaID, job.TableID) + if err != nil { + return ver, err + } + job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) + return ver, err +} diff --git a/ddl/multi_schema_change_test.go b/ddl/multi_schema_change_test.go index 73f286a67efd1..4c65431a426e8 100644 --- a/ddl/multi_schema_change_test.go +++ b/ddl/multi_schema_change_test.go @@ -15,7 +15,6 @@ package ddl_test import ( - "context" "strconv" "testing" @@ -25,7 +24,9 @@ import ( "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -41,7 +42,7 @@ func TestMultiSchemaChangeAddColumns(t *testing.T) { tk.MustExec("alter table t add column b int default 2, add column c int default 3;") tk.MustQuery("select * from t;").Check(testkit.Rows("1 2 3")) - // Test add multiple columns in one spec. + // Test add multiple columns and constraints in one spec. tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int);") tk.MustExec("insert into t values (1);") @@ -54,6 +55,31 @@ func TestMultiSchemaChangeAddColumns(t *testing.T) { tk.MustExec("alter table t add column (d int default 4, e int default 5);") tk.MustQuery("select * from t;").Check(testkit.Rows("1 2 3 4 5")) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int);") + tk.MustExec("insert into t values (1);") + tk.MustExec("alter table t add column (index i(a), index i1(a));") + tk.MustQuery("select * from t use index (i, i1);").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int);") + tk.MustExec("insert into t values (1);") + tk.MustExec("alter table t add column (b int default 2, index i(a), primary key (a));") + tk.MustQuery("select * from t use index (i, primary)").Check(testkit.Rows("1 2")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int);") + tk.MustExec("insert into t values (1);") + tk.MustExec("alter table t add column (index i(a));") + tk.MustQuery("select * from t use index (i)").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int);") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t add column (index i1(a, b, c), index i2(c, b, a), index i3((a + 1)), index i4((c - 1)));") + tk.MustQuery("select * from t use index (i1, i2);").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") + tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int default 1);") tk.MustExec("insert into t values ();") @@ -115,7 +141,7 @@ func TestMultiSchemaChangeAddColumnsCancelled(t *testing.T) { tk.MustExec("create table t (a int);") tk.MustExec("insert into t values (1);") - hook := newCancelJobHook(store, dom, func(job *model.Job) bool { + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'c' is in write-reorg. return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateWriteReorganization }) @@ -197,7 +223,7 @@ func TestMultiSchemaChangeDropColumnsCancelled(t *testing.T) { // Test for cancelling the job in a middle state. tk.MustExec("create table t (a int default 1, b int default 2, c int default 3, d int default 4);") tk.MustExec("insert into t values ();") - hook := newCancelJobHook(store, dom, func(job *model.Job) bool { + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in delete-reorg. return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateDeleteReorganization }) @@ -211,7 +237,7 @@ func TestMultiSchemaChangeDropColumnsCancelled(t *testing.T) { tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int default 1, b int default 2, c int default 3, d int default 4);") tk.MustExec("insert into t values ();") - hook = newCancelJobHook(store, dom, func(job *model.Job) bool { + hook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in public. return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StatePublic }) @@ -233,7 +259,7 @@ func TestMultiSchemaChangeDropIndexedColumnsCancelled(t *testing.T) { tk.MustExec("create table t (a int default 1, b int default 2, c int default 3, d int default 4, " + "index(a), index(b), index(c), index(d));") tk.MustExec("insert into t values ();") - hook := newCancelJobHook(store, dom, func(job *model.Job) bool { + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { // Cancel job when the column 'a' is in delete-reorg. return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateDeleteReorganization }) @@ -289,6 +315,280 @@ func TestMultiSchemaChangeAddDropColumns(t *testing.T) { tk.MustGetErrCode("alter table t add column c int default 3 after a, add column d int default 4 first, drop column a, drop column b;", errno.ErrUnsupportedDDLOperation) } +func TestMultiSchemaChangeRenameColumns(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + originHook := dom.DDL().GetHook() + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // unsupported ddl operations + { + // Test add and rename to same column name + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t rename column b to c, add column c int", errno.ErrUnsupportedDDLOperation) + + // Test add column related with rename column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t rename column b to c, add column e int after b", errno.ErrUnsupportedDDLOperation) + + // Test drop and rename with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t drop column b, rename column b to c", errno.ErrUnsupportedDDLOperation) + + // Test add index and rename with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2, index t(a, b));") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t rename column b to c, add index t1(a, b)", errno.ErrUnsupportedDDLOperation) + } + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2, index t(a, b));") + tk.MustExec("insert into t values ();") + tk.MustExec("alter table t rename column b to c, add column e int default 3") + tk.MustQuery("select c from t").Check(testkit.Rows("2")) + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 3")) + + // Test cancel job with rename columns + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2)") + tk.MustExec("insert into t values ()") + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + // Cancel job when the column 'c' is in write-reorg. + return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(hook) + tk.MustGetErrCode("alter table t add column c int default 3, rename column b to d;", errno.ErrCancelledDDLJob) + dom.DDL().SetHook(originHook) + tk.MustQuery("select b from t").Check(testkit.Rows("2")) + tk.MustGetErrCode("select d from t", errno.ErrBadField) + + // Test dml stmts when do rename + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2)") + tk.MustExec("insert into t values ()") + hook1 := &ddl.TestDDLCallback{Do: dom} + hook1.OnJobRunBeforeExported = func(job *model.Job) { + assert.Equal(t, model.ActionMultiSchemaChange, job.Type) + if job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization { + rs, _ := tk.Exec("select b from t") + assert.Equal(t, tk.ResultSetToResult(rs, "").Rows()[0][0], "2") + } + } + dom.DDL().SetHook(hook1) + tk.MustExec("alter table t add column c int default 3, rename column b to d;") + dom.DDL().SetHook(originHook) + tk.MustQuery("select d from t").Check(testkit.Rows("2")) + tk.MustGetErrCode("select b from t", errno.ErrBadField) +} + +func TestMultiSchemaChangeAlterColumns(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + originHook := dom.DDL().GetHook() + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // unsupported ddl operations + { + // Test alter and drop with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t alter column b set default 3, drop column b", errno.ErrUnsupportedDDLOperation) + + // Test alter and rename with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t alter column b set default 3, rename column b to c", errno.ErrUnsupportedDDLOperation) + + // Test alter and drop modify same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t alter column b set default 3, modify column b double", errno.ErrUnsupportedDDLOperation) + } + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2, index t(a, b));") + tk.MustExec("insert into t values ();") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2")) + tk.MustExec("alter table t rename column a to c, alter column b set default 3;") + tk.MustExec("truncate table t;") + tk.MustExec("insert into t values ();") + tk.MustQuery("select * from t").Check(testkit.Rows("1 3")) + + // Test cancel job with alter columns + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2)") + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + // Cancel job when the column 'a' is in write-reorg. + return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(hook) + tk.MustGetErrCode("alter table t add column c int default 3, alter column b set default 3;", errno.ErrCancelledDDLJob) + dom.DDL().SetHook(originHook) + tk.MustExec("insert into t values ()") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2")) + + // Test dml stmts when do alter + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2)") + hook1 := &ddl.TestDDLCallback{Do: dom} + hook1.OnJobRunBeforeExported = func(job *model.Job) { + assert.Equal(t, model.ActionMultiSchemaChange, job.Type) + if job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteOnly { + tk.Exec("insert into t values ()") + } + } + dom.DDL().SetHook(hook1) + tk.MustExec("alter table t add column c int default 3, alter column b set default 3;") + dom.DDL().SetHook(originHook) + tk.MustQuery("select * from t").Check(testkit.Rows("1 2 3")) +} + +func TestMultiSchemaChangeChangeColumns(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + originHook := dom.DDL().GetHook() + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // unsupported ddl operations + { + // Test change and drop with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t change column b c double, drop column b", errno.ErrUnsupportedDDLOperation) + + // Test change and add with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t change column b c double, add column c int", errno.ErrUnsupportedDDLOperation) + + // Test add index and rename with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2, index t(a, b));") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t change column b c double, add index t1(a, b)", errno.ErrUnsupportedDDLOperation) + } + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2, index t(a, b));") + tk.MustExec("insert into t values ();") + tk.MustExec("alter table t rename column b to c, change column a e bigint default 3;") + tk.MustQuery("select e,c from t").Check(testkit.Rows("1 2")) + tk.MustExec("truncate table t;") + tk.MustExec("insert into t values ();") + tk.MustQuery("select e,c from t").Check(testkit.Rows("3 2")) + + // Test cancel job with change columns + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2)") + tk.MustExec("insert into t values ()") + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + // Cancel job when the column 'c' is in write-reorg. + return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(hook) + tk.MustGetErrCode("alter table t add column c int default 3, change column b d bigint default 4;", errno.ErrCancelledDDLJob) + dom.DDL().SetHook(originHook) + tk.MustQuery("select b from t").Check(testkit.Rows("2")) + tk.MustGetErrCode("select d from t", errno.ErrBadField) +} + +func TestMultiSchemaChangeAddIndexes(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // Test add multiple indexes with same column. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int);") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t add index t(a, b), add index t1(a);") + tk.MustExec("alter table t add index t2(a), add index t3(a, b);") + tk.MustQuery("select * from t use index (t, t1, t2, t3);").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") + + // Test add multiple indexes with same name. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int)") + tk.MustGetErrCode("alter table t add index t(a), add index t(b)", errno.ErrUnsupportedDDLOperation) + tk.MustQuery("show index from t;").Check(testkit.Rows( /* no index */ )) + + // Test add indexes with drop column. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int)") + tk.MustGetErrCode("alter table t add index t(a), drop column a", errno.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t add index t(a, b), drop column a", errno.ErrUnsupportedDDLOperation) + tk.MustQuery("show index from t;").Check(testkit.Rows( /* no index */ )) + + // Test add index failed. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int);") + tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 1);") + tk.MustGetErrCode("alter table t add unique index i1(a), add unique index i2(a, b), add unique index i3(c);", + errno.ErrDupEntry) + tk.MustQuery("show index from t;").Check(testkit.Rows( /* no index */ )) + tk.MustExec("alter table t add index i1(a), add index i2(a, b), add index i3(c);") +} + +func TestMultiSchemaChangeAddIndexesCancelled(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + originHook := dom.DDL().GetHook() + + // Test cancel successfully. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int);") + tk.MustExec("insert into t values (1, 2, 3);") + cancelHook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + // Cancel the job when index 't2' is in write-reorg. + return job.MultiSchemaInfo.SubJobs[2].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(cancelHook) + tk.MustGetErrCode("alter table t "+ + "add index t(a, b), add index t1(a), "+ + "add index t2(a), add index t3(a, b);", errno.ErrCancelledDDLJob) + dom.DDL().SetHook(originHook) + cancelHook.MustCancelDone(t) + tk.MustQuery("show index from t;").Check(testkit.Rows( /* no index */ )) + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") + + // Test cancel failed when some sub-jobs have been finished. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int);") + tk.MustExec("insert into t values (1, 2, 3);") + cancelHook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { + // Cancel the job when index 't1' is in public. + return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StatePublic + }) + dom.DDL().SetHook(cancelHook) + tk.MustExec("alter table t add index t(a, b), add index t1(a), " + + "add index t2(a), add index t3(a, b);") + dom.DDL().SetHook(originHook) + cancelHook.MustCancelFailed(t) + tk.MustQuery("select * from t use index(t, t1, t2, t3);").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") +} + func TestMultiSchemaChangeDropIndexes(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -327,7 +627,7 @@ func TestMultiSchemaChangeDropIndexesCancelled(t *testing.T) { // Test for cancelling the job in a middle state. tk.MustExec("create table t (a int, b int, index(a), unique index(b), index idx(a, b));") - hook := newCancelJobHook(store, dom, func(job *model.Job) bool { + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateDeleteOnly }) dom.DDL().SetHook(hook) @@ -341,7 +641,7 @@ func TestMultiSchemaChangeDropIndexesCancelled(t *testing.T) { // Test for cancelling the job in none state. tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int, b int, index(a), unique index(b), index idx(a, b));") - hook = newCancelJobHook(store, dom, func(job *model.Job) bool { + hook = newCancelJobHook(t, store, dom, func(job *model.Job) bool { return job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StatePublic }) dom.DDL().SetHook(hook) @@ -372,11 +672,495 @@ func TestMultiSchemaChangeDropIndexesParallel(t *testing.T) { }) } +func TestMultiSchemaChangeAddDropIndexes(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // Test add and drop same index. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, index t(a))") + tk.MustGetErrCode("alter table t drop index t, add index t(b)", errno.ErrDupKeyName) + + // Test add and drop same index. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, index t(a))") + tk.MustGetErrCode("alter table t add index t1(b), drop index t1", errno.ErrCantDropFieldOrKey) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int, index (a), index(b), index(c));") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t add index aa(a), drop index a, add index cc(c), drop index b, drop index c, add index bb(b);") + tk.MustQuery("select * from t use index(aa, bb, cc);").Check(testkit.Rows("1 2 3")) + tk.MustGetErrCode("select * from t use index(a);", errno.ErrKeyDoesNotExist) + tk.MustGetErrCode("select * from t use index(b);", errno.ErrKeyDoesNotExist) + tk.MustGetErrCode("select * from t use index(c);", errno.ErrKeyDoesNotExist) + tk.MustExec("admin check table t;") +} + +func TestMultiSchemaChangeRenameIndexes(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + originHook := dom.DDL().GetHook() + + // Test rename index. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, index t(a), index t1(b))") + tk.MustExec("alter table t rename index t to x, rename index t1 to x1") + tk.MustExec("select * from t use index (x);") + tk.MustExec("select * from t use index (x1);") + tk.MustGetErrCode("select * from t use index (t);", errno.ErrKeyDoesNotExist) + tk.MustGetErrCode("select * from t use index (t1);", errno.ErrKeyDoesNotExist) + + // Test drop and rename same index. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, index t(a))") + tk.MustGetErrCode("alter table t drop index t, rename index t to t1", errno.ErrUnsupportedDDLOperation) + + // Test add and rename to same index name. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, index t(a))") + tk.MustGetErrCode("alter table t add index t1(b), rename index t to t1", errno.ErrUnsupportedDDLOperation) + + // Test drop column with rename index. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2, c int default 3, index t(a))") + tk.MustExec("insert into t values ();") + tk.MustExec("alter table t drop column a, rename index t to x") + tk.MustGetErrCode("select * from t use index (x);", errno.ErrKeyDoesNotExist) + tk.MustQuery("select * from t;").Check(testkit.Rows("2 3")) + + // Test cancel job with renameIndex + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int default 1, b int default 2, index t(a))") + tk.MustExec("insert into t values ()") + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + // Cancel job when the column 'c' is in write-reorg. + return job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(hook) + tk.MustGetErrCode("alter table t add column c int default 3, rename index t to t1;", errno.ErrCancelledDDLJob) + dom.DDL().SetHook(originHook) + tk.MustQuery("select * from t use index (t);").Check(testkit.Rows("1 2")) + tk.MustGetErrCode("select * from t use index (t1);", errno.ErrKeyDoesNotExist) +} + +func TestMultiSchemaChangeModifyColumns(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + // unsupported ddl operations + { + // Test modify the same column twice. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t modify column a int default 2, modify column a bigint;", errno.ErrUnsupportedDDLOperation) + + // Test modify and drop with same column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t modify column b double, drop column b", errno.ErrUnsupportedDDLOperation) + + // Test modify column related with dropped column + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2, c int default 3);") + tk.MustExec("insert into t values ();") + tk.MustGetErrCode("alter table t modify column b double after c, drop column c", errno.ErrUnsupportedDDLOperation) + + // Test modify column related with add index + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int);") + tk.MustExec("insert into t values (1, 2);") + tk.MustGetErrCode("alter table t add index i(a), modify column a int null default 1 after a;", errno.ErrUnsupportedDDLOperation) + + // Test modify column related with add primary index + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int);") + tk.MustExec("insert into t values (1, 2);") + tk.MustGetErrCode("alter table t add primary key(a), modify column a int null default 1 after a;", errno.ErrUnsupportedDDLOperation) + + // Test modify column related with expression index + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int);") + tk.MustExec("insert into t values (1, 2);") + tk.MustGetErrCode("alter table t modify column b double, add index idx((a + b));", errno.ErrUnsupportedDDLOperation) + } + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int default 1, b int default 2);") + tk.MustExec("insert into t values ();") + tk.MustExec("alter table t modify column b double default 2 after a, add column c int default 3 after a;") + tk.MustQuery("select * from t").Check(testkit.Rows("1 3 2")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int);") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t modify column a bigint, modify column b bigint;") + tk.MustExec("insert into t values (9223372036854775807, 9223372036854775807, 1);") + tk.MustQuery("select * from t;").Check( + testkit.Rows("1 2 3", "9223372036854775807 9223372036854775807 1")) + + // Modify index-covered columns. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int, index i1(a), index i2(b), index i3(c), index i4(a, b), index i5(a, b, c));") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t modify column a tinyint, modify column b tinyint, modify column c tinyint;") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2 3")) + tk.MustQuery("select * from t use index(i1, i2, i3, i4, i5);").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") + + // Modify index-covered columns with position change. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int, index i1(a), index i2(b), index i3(c), index i4(a, b), index i5(a, b, c));") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t modify column a tinyint after c, modify column b tinyint, modify column c tinyint first;") + tk.MustQuery("select * from t;").Check(testkit.Rows("3 2 1")) + tk.MustQuery("select * from t use index(i1, i2, i3, i4, i5);").Check(testkit.Rows("3 2 1")) + tk.MustExec("admin check table t;") + + // Modify columns that require and don't require reorganization of data. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int, index i1(a), index i2(c, b));") + tk.MustExec("insert into t values (1, 2, 3), (11, 22, 33);") + tk.MustExec("alter table t modify column b char(255) after c, modify column a bigint;") + tk.MustQuery("select * from t;").Check(testkit.Rows("1 3 2", "11 33 22")) + tk.MustQuery("select * from t use index(i1, i2);").Check(testkit.Rows("1 3 2", "11 33 22")) + tk.MustExec("admin check table t;") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a bigint null default '1761233443433596323', index t(a));") + tk.MustExec("insert into t set a = '-7184819032643664798';") + tk.MustGetErrCode("alter table t change column a b datetime null default '8972-12-24 10:56:03', rename index t to t1;", errno.ErrTruncatedWrongValue) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b double, index i(a, b));") + tk.MustExec("alter table t rename index i to i1, change column b c int;") + tk.MustQuery("select count(*) from information_schema.TIDB_INDEXES where TABLE_NAME='t' and COLUMN_NAME='c' and KEY_NAME='i1';").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b double, index i(a, b), index _Idx$_i(a, b));") + tk.MustExec("alter table t rename index i to i1, change column b c int;") + tk.MustQuery("select count(*) from information_schema.TIDB_INDEXES where TABLE_NAME='t' and COLUMN_NAME='c' and KEY_NAME='i1';").Check(testkit.Rows("1")) + tk.MustQuery("select count(*) from information_schema.TIDB_INDEXES where TABLE_NAME='t' and COLUMN_NAME='c' and KEY_NAME='_Idx$_i';").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, _Col$_a double, index _Idx$_i(a, _Col$_a), index i(a, _Col$_a));") + tk.MustExec("alter table t modify column a tinyint;") + tk.MustQuery("select count(distinct KEY_NAME) from information_schema.TIDB_INDEXES where TABLE_NAME='t';").Check(testkit.Rows("2")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a BIGINT NULL DEFAULT '-283977870758975838', b double);") + tk.MustExec("insert into t values (-283977870758975838, 0);") + tk.MustGetErrCode("alter table t change column a c tinyint null default '111' after b, modify column b time null default '13:51:02' FIRST;", errno.ErrDataOutOfRange) + rows := tk.MustQuery("admin show ddl jobs 1").Rows() + require.Equal(t, rows[0][11], "rollback done") + require.Equal(t, rows[1][11], "rollback done") + require.Equal(t, rows[2][11], "cancelled") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int);") + tk.MustExec("insert into t values (1, 2);") + tk.MustGetErrCode("alter table t add index i(b), modify column a int null default 1 after a;", errno.ErrBadField) + + // Test rolling back modify column with reorganization. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a char(3), b int, unique index i1(a), index i2(a, b));") + tk.MustExec("insert into t values ('aaa', 1), ('aa', 2);") + tk.MustExec("set @@sql_mode = '';") // Make it possible to truncate 'aaa' to 'aa'. + tk.MustGetErrCode("alter table t modify column b tinyint, modify column a char(2);", errno.ErrDupEntry) +} + +func TestMultiSchemaChangeModifyColumnsCancelled(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + originHook := dom.DDL().GetHook() + + // Test for cancelling the job in a middle state. + tk.MustExec("create table t (a int, b int, c int, index i1(a), unique index i2(b), index i3(a, b));") + tk.MustExec("insert into t values (1, 2, 3);") + hook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + return job.MultiSchemaInfo.SubJobs[2].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(hook) + sql := "alter table t modify column a tinyint, modify column b bigint, modify column c char(20);" + tk.MustGetErrCode(sql, errno.ErrCancelledDDLJob) + dom.DDL().SetHook(originHook) + hook.MustCancelDone(t) + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2 3")) + tk.MustQuery("select * from t use index (i1, i2, i3);").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") + tk.MustQuery("select data_type from information_schema.columns where table_name = 't' and column_name = 'c';"). + Check(testkit.Rows("int")) +} + +func TestMultiSchemaChangeAlterIndex(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + // unsupported ddl operations + { + // Test alter the same index + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, index idx(a, b));") + tk.MustGetErrCode("alter table t alter index idx visible, alter index idx invisible;", errno.ErrUnsupportedDDLOperation) + + // Test drop and alter the same index + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, index idx(a, b));") + tk.MustGetErrCode("alter table t drop index idx, alter index idx visible;", errno.ErrUnsupportedDDLOperation) + + // Test add and alter the same index + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int);") + tk.MustGetErrCode("alter table t add index idx(a, b), alter index idx invisible", errno.ErrKeyDoesNotExist) + } + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a int, b int, index i1(a, b), index i2(b));") + tk.MustExec("insert into t values (1, 2);") + tk.MustExec("alter table t modify column a tinyint, alter index i2 invisible, alter index i1 invisible;") + tk.MustGetErrCode("select * from t use index (i1);", errno.ErrKeyDoesNotExist) + tk.MustGetErrCode("select * from t use index (i2);", errno.ErrKeyDoesNotExist) + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2")) + tk.MustExec("admin check table t;") + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a int, b int, index i1(a, b), index i2(b));") + tk.MustExec("insert into t values (1, 2);") + originHook := dom.DDL().GetHook() + var checked bool + dom.DDL().SetHook(&ddl.TestDDLCallback{Do: dom, + OnJobUpdatedExported: func(job *model.Job) { + assert.NotNil(t, job.MultiSchemaInfo) + // "modify column a tinyint" in write-reorg. + if job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateWriteReorganization { + checked = true + rs, err := tk.Exec("select * from t use index(i1);") + assert.NoError(t, err) + assert.NoError(t, rs.Close()) + } + }}) + tk.MustExec("alter table t alter index i1 invisible, modify column a tinyint, alter index i2 invisible;") + dom.DDL().SetHook(originHook) + require.True(t, checked) + tk.MustGetErrCode("select * from t use index (i1);", errno.ErrKeyDoesNotExist) + tk.MustGetErrCode("select * from t use index (i2);", errno.ErrKeyDoesNotExist) + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2")) + tk.MustExec("admin check table t;") +} + +func TestMultiSchemaChangeMix(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + tk.MustExec("create table t (a int, b int, c int, index i1(c), index i2(c));") + tk.MustExec("insert into t values (1, 2, 3);") + tk.MustExec("alter table t add column d int default 4, add index i3(c), " + + "drop column a, drop column if exists z, add column if not exists e int default 5, " + + "drop index i2, add column f int default 6, drop column b, drop index i1, add column if not exists c int;") + tk.MustQuery("select * from t;").Check(testkit.Rows("3 4 5 6")) + tk.MustGetErrCode("select * from t use index (i1);", errno.ErrKeyDoesNotExist) + tk.MustGetErrCode("select * from t use index (i2);", errno.ErrKeyDoesNotExist) + tk.MustQuery("select * from t use index (i3);").Check(testkit.Rows("3 4 5 6")) +} + +func TestMultiSchemaChangeMixCancelled(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + tk.MustExec("create table t (a int, b int, c int, index i1(c), index i2(c));") + tk.MustExec("insert into t values (1, 2, 3);") + origin := dom.DDL().GetHook() + cancelHook := newCancelJobHook(t, store, dom, func(job *model.Job) bool { + return job.MultiSchemaInfo != nil && + len(job.MultiSchemaInfo.SubJobs) > 8 && + job.MultiSchemaInfo.SubJobs[8].SchemaState == model.StateWriteReorganization + }) + dom.DDL().SetHook(cancelHook) + tk.MustGetErrCode("alter table t add column d int default 4, add index i3(c), "+ + "drop column a, drop column if exists z, add column if not exists e int default 5, "+ + "drop index i2, add column f int default 6, drop column b, drop index i1, add column if not exists g int;", + errno.ErrCancelledDDLJob) + dom.DDL().SetHook(origin) + cancelHook.MustCancelDone(t) + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2 3")) + tk.MustQuery("select * from t use index(i1, i2);").Check(testkit.Rows("1 2 3")) + tk.MustExec("admin check table t;") +} + +func TestMultiSchemaChangeAdminShowDDLJobs(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + originHook := dom.DDL().GetHook() + hook := &ddl.TestDDLCallback{Do: dom} + hook.OnJobRunBeforeExported = func(job *model.Job) { + assert.Equal(t, model.ActionMultiSchemaChange, job.Type) + if job.MultiSchemaInfo.SubJobs[0].SchemaState == model.StateDeleteOnly { + newTk := testkit.NewTestKit(t, store) + rows := newTk.MustQuery("admin show ddl jobs 1").Rows() + // 1 history job and 1 running job with 2 subjobs + assert.Equal(t, len(rows), 4) + assert.Equal(t, rows[1][1], "test") + assert.Equal(t, rows[1][2], "t") + assert.Equal(t, rows[1][3], "add index /* subjob */") + assert.Equal(t, rows[1][4], "delete only") + assert.Equal(t, rows[1][len(rows[1])-1], "running") + + assert.Equal(t, rows[2][3], "add index /* subjob */") + assert.Equal(t, rows[2][4], "none") + assert.Equal(t, rows[2][len(rows[2])-1], "queueing") + } + } + + tk.MustExec("create table t (a int, b int, c int)") + tk.MustExec("insert into t values (1, 2, 3)") + + dom.DDL().SetHook(hook) + tk.MustExec("alter table t add index t(a), add index t1(b)") + dom.DDL().SetHook(originHook) +} + +func TestMultiSchemaChangeTableOption(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + tk.MustExec("create table t (a int auto_increment primary key, b int);") + tk.MustExec("alter table t modify column b tinyint, auto_increment = 100;") + tk.MustExec("insert into t (b) values (1);") + tk.MustQuery("select * from t;").Check(testkit.Rows("100 1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int auto_increment primary key, b int);") + tk.MustExec("alter table t auto_increment = 110, auto_increment = 90;") + tk.MustQuery("show warnings;").Check(testkit.Rows("Note 1105 Can't reset AUTO_INCREMENT to 90 without FORCE option, using 110 instead")) + tk.MustExec("insert into t (b) values (1);") + tk.MustQuery("select * from t;").Check(testkit.Rows("110 1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int) charset = utf8 shard_row_id_bits=2;") + tk.MustExec("alter table t modify column a tinyint, comment = 'abc', charset = utf8mb4;") + tk.MustQuery("select TIDB_ROW_ID_SHARDING_INFO, TABLE_COMMENT, TABLE_COLLATION from information_schema.tables where table_name = 't';"). + Check(testkit.Rows("SHARD_BITS=2 abc utf8mb4_bin")) +} + +func TestMultiSchemaChangeNonPublicDefaultValue(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("create table t (a tinyint);") + tk.MustExec("insert into t set a = 10;") + tk.MustExec("alter table t add column b int not null, change column a c char(5) first;") + tk.MustQuery("select * from t;").Check(testkit.Rows("10 0")) +} + +func TestMultiSchemaChangeAlterIndexVisibility(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("create table t (a int, b int, index idx(b));") + tk.MustExec("alter table t add index idx2(a), alter index idx visible;") + tk.MustQuery("select * from t use index (idx, idx2);").Check(testkit.Rows( /* no rows */ )) + tk.MustGetErrCode("alter table t drop column b, alter index idx invisible;", errno.ErrKeyDoesNotExist) + tk.MustQuery("select a, b from t;").Check(testkit.Rows( /* no rows */ )) +} + +func TestMultiSchemaChangeWithExpressionIndex(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("create table t (a int, b int);") + tk.MustExec("insert into t values (1, 2), (2, 1);") + tk.MustGetErrCode("alter table t drop column a, add unique index idx((a + b));", errno.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t add column c int, change column a d bigint, add index idx((a + a));", errno.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t add column c int default 10, add index idx1((a + b)), add unique index idx2((a + b));", + errno.ErrDupEntry) + tk.MustQuery("select * from t;").Check(testkit.Rows("1 2", "2 1")) + + originHook := dom.DDL().GetHook() + hook := &ddl.TestDDLCallback{Do: dom} + var checkErr error + hook.OnJobRunBeforeExported = func(job *model.Job) { + if checkErr != nil { + return + } + assert.Equal(t, model.ActionMultiSchemaChange, job.Type) + if job.MultiSchemaInfo.SubJobs[1].SchemaState == model.StateWriteOnly { + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test;") + _, checkErr = tk2.Exec("update t set a = 3 where a = 1;") + if checkErr != nil { + return + } + _, checkErr = tk2.Exec("insert into t values (10, 10);") + } + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t add column c int default 10, add index idx1((a + b)), add unique index idx2((a + b));") + require.NoError(t, checkErr) + dom.DDL().SetHook(originHook) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int);") + tk.MustExec("insert into t values (1, 2), (2, 1);") + tk.MustExec("alter table t add column c int default 10, add index idx1((a + b)), add unique index idx2((a*10 + b));") + tk.MustQuery("select * from t use index(idx1, idx2);").Check(testkit.Rows("1 2 10", "2 1 10")) +} + +func TestMultiSchemaChangeNoSubJobs(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + tk.MustExec("create table t (a int, b int);") + tk.MustExec("alter table t add column if not exists a int, add column if not exists b int;") + tk.MustQuery("show warnings;").Check(testkit.Rows( + "Note 1060 Duplicate column name 'a'", "Note 1060 Duplicate column name 'b'")) + rs := tk.MustQuery("admin show ddl jobs 1;").Rows() + require.Equal(t, "create table", rs[0][3]) +} + +func TestMultiSchemaChangeUnsupportedType(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + tk.MustExec("create table t (a int, b int);") + tk.MustGetErrMsg("alter table t add column c int, auto_id_cache = 1;", + "[ddl:8200]Unsupported multi schema change for modify auto id cache") +} + type cancelOnceHook struct { store kv.Storage triggered bool cancelErr error pred func(job *model.Job) bool + s sessionctx.Context ddl.TestDDLCallback } @@ -386,15 +1170,12 @@ func (c *cancelOnceHook) OnJobUpdated(job *model.Job) { return } c.triggered = true - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - c.cancelErr = kv.RunInNewTxn(ctx, c.store, false, - func(ctx context.Context, txn kv.Transaction) error { - errs, err := ddl.CancelJobs(txn, []int64{job.ID}) - if errs[0] != nil { - return errs[0] - } - return err - }) + errs, err := ddl.CancelJobs(c.s, c.store, []int64{job.ID}) + if errs[0] != nil { + c.cancelErr = errs[0] + return + } + c.cancelErr = err } func (c *cancelOnceHook) MustCancelDone(t *testing.T) { @@ -407,12 +1188,15 @@ func (c *cancelOnceHook) MustCancelFailed(t *testing.T) { require.Contains(t, c.cancelErr.Error(), strconv.Itoa(errno.ErrCannotCancelDDLJob)) } -func newCancelJobHook(store kv.Storage, dom *domain.Domain, +func newCancelJobHook(t *testing.T, store kv.Storage, dom *domain.Domain, pred func(job *model.Job) bool) *cancelOnceHook { + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") return &cancelOnceHook{ store: store, pred: pred, TestDDLCallback: ddl.TestDDLCallback{Do: dom}, + s: tk.Session(), } } diff --git a/ddl/partition.go b/ddl/partition.go index 3ab281c7f1afc..41810d33fdc77 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -1166,7 +1166,7 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( elements = append(elements, &meta.Element{ID: idxInfo.ID, TypeKey: meta.IndexElementKey}) } } - rh := newReorgHandler(t) + rh := newReorgHandler(t, w.sess, w.concurrentDDL) reorgInfo, err := getReorgInfoFromPartitions(d.jobContext(job), d, rh, job, tbl, physicalTableIDs, elements) if err != nil || reorgInfo.first { @@ -1388,6 +1388,18 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo if err != nil { return ver, errors.Trace(err) } + if nt.ExchangePartitionInfo == nil || !nt.ExchangePartitionInfo.ExchangePartitionFlag { + nt.ExchangePartitionInfo = &model.ExchangePartitionInfo{ + ExchangePartitionFlag: true, + ExchangePartitionID: ptID, + ExchangePartitionDefID: defID, + } + return updateVersionAndTableInfoWithCheck(d, t, job, nt, true) + } + + if d.lease > 0 { + delayForAsyncCommit() + } if withValidation { err = checkExchangePartitionRecordValidation(w, pt, index, ntDbInfo.Name, nt.Name) @@ -1471,6 +1483,12 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo return ver, errors.Trace(err) } + err = checkExchangePartitionPlacementPolicy(t, partDef.PlacementPolicyRef, nt.PlacementPolicyRef) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + // the follow code is a swap function for rules of two partitions // though partitions has exchanged their ID, swap still take effect @@ -1521,7 +1539,8 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo return ver, errors.Wrapf(err, "failed to notify PD the label rules") } - ver, err = updateSchemaVersion(d, t, job) + nt.ExchangePartitionInfo = nil + ver, err = updateVersionAndTableInfoWithCheck(d, t, job, nt, true) if err != nil { return ver, errors.Trace(err) } @@ -1603,7 +1622,7 @@ func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, inde case model.PartitionTypeList: if len(pi.Columns) == 0 { sql, paramList = buildCheckSQLForListPartition(pi, index, schemaName, tableName) - } else if len(pi.Columns) == 1 { + } else { sql, paramList = buildCheckSQLForListColumnsPartition(pi, index, schemaName, tableName) } default: @@ -1628,6 +1647,29 @@ func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, inde return nil } +func checkExchangePartitionPlacementPolicy(t *meta.Meta, ntPlacementPolicyRef *model.PolicyRefInfo, ptPlacementPolicyRef *model.PolicyRefInfo) error { + if ntPlacementPolicyRef == nil && ptPlacementPolicyRef == nil { + return nil + } + if ntPlacementPolicyRef == nil || ptPlacementPolicyRef == nil { + return dbterror.ErrTablesDifferentMetadata + } + + ptPlacementPolicyInfo, _ := getPolicyInfo(t, ptPlacementPolicyRef.ID) + ntPlacementPolicyInfo, _ := getPolicyInfo(t, ntPlacementPolicyRef.ID) + if ntPlacementPolicyInfo == nil && ptPlacementPolicyInfo == nil { + return nil + } + if ntPlacementPolicyInfo == nil || ptPlacementPolicyInfo == nil { + return dbterror.ErrTablesDifferentMetadata + } + if ntPlacementPolicyInfo.Name.L != ptPlacementPolicyInfo.Name.L { + return dbterror.ErrTablesDifferentMetadata + } + + return nil +} + func buildCheckSQLForRangeExprPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) (string, []interface{}) { var buf strings.Builder paramList := make([]interface{}, 0, 4) diff --git a/ddl/placement/bundle.go b/ddl/placement/bundle.go index 5b53bb3758109..83e2eff7b91e8 100644 --- a/ddl/placement/bundle.go +++ b/ddl/placement/bundle.go @@ -63,68 +63,68 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, } constraints := options.Constraints - leaderConstraints := options.LeaderConstraints + leaderConst := options.LeaderConstraints learnerConstraints := options.LearnerConstraints followerConstraints := options.FollowerConstraints followerCount := options.Followers learnerCount := options.Learners - CommonConstraints, err := NewConstraintsFromYaml([]byte(constraints)) + commonConstraints, err := NewConstraintsFromYaml([]byte(constraints)) if err != nil { return nil, fmt.Errorf("%w: 'Constraints' should be [constraint1, ...] or any yaml compatible array representation", err) } - Rules := []*Rule{} + rules := []*Rule{} - LeaderConstraints, err := NewConstraintsFromYaml([]byte(leaderConstraints)) + leaderConstraints, err := NewConstraintsFromYaml([]byte(leaderConst)) if err != nil { 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 { + for _, cnst := range commonConstraints { + if err := leaderConstraints.Add(cnst); err != nil { return nil, fmt.Errorf("%w: LeaderConstraints conflicts with Constraints", err) } } - Rules = append(Rules, NewRule(Leader, 1, LeaderConstraints)) + rules = append(rules, NewRule(Leader, 1, leaderConstraints)) - FollowerRules, err := NewRules(Voter, followerCount, followerConstraints) + followerRules, err := NewRules(Voter, followerCount, followerConstraints) if err != nil { return nil, fmt.Errorf("%w: invalid FollowerConstraints", err) } - for _, rule := range FollowerRules { + for _, rule := range followerRules { // give a default of 2 followers if rule.Count == 0 { rule.Count = 2 } - for _, cnst := range CommonConstraints { + for _, cnst := range commonConstraints { if err := rule.Constraints.Add(cnst); err != nil { return nil, fmt.Errorf("%w: FollowerConstraints conflicts with Constraints", err) } } } - Rules = append(Rules, FollowerRules...) + rules = append(rules, followerRules...) - LearnerRules, err := NewRules(Learner, learnerCount, learnerConstraints) + learnerRules, err := NewRules(Learner, learnerCount, learnerConstraints) if err != nil { return nil, fmt.Errorf("%w: invalid LearnerConstraints", err) } - for _, rule := range LearnerRules { + for _, rule := range learnerRules { if rule.Count == 0 { if len(rule.Constraints) > 0 { return nil, fmt.Errorf("%w: specify learner constraints without specify how many learners to be placed", ErrInvalidPlacementOptions) } } - for _, cnst := range CommonConstraints { + for _, cnst := range commonConstraints { if err := rule.Constraints.Add(cnst); err != nil { return nil, fmt.Errorf("%w: LearnerConstraints conflicts with Constraints", err) } } if rule.Count > 0 { - Rules = append(Rules, rule) + rules = append(rules, rule) } } - return &Bundle{Rules: Rules}, nil + return &Bundle{Rules: rules}, nil } // NewBundleFromSugarOptions will transform syntax sugar options into the bundle. @@ -153,12 +153,12 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error } schedule := options.Schedule - var Rules []*Rule + var rules []*Rule // in case empty primaryRegion and regions, just return an empty bundle if primaryRegion == "" && len(regions) == 0 { - Rules = append(Rules, NewRule(Voter, followers+1, NewConstraintsDirect())) - return &Bundle{Rules: Rules}, nil + rules = append(rules, NewRule(Voter, followers+1, NewConstraintsDirect())) + return &Bundle{Rules: rules}, nil } // regions must include the primary @@ -181,19 +181,19 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error return nil, fmt.Errorf("%w: unsupported schedule %s", ErrInvalidPlacementOptions, schedule) } - Rules = append(Rules, NewRule(Voter, primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, primaryRegion)))) + rules = append(rules, NewRule(Voter, primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, primaryRegion)))) if followers+1 > primaryCount { // delete primary from regions regions = regions[:primaryIndex+copy(regions[primaryIndex:], regions[primaryIndex+1:])] if len(regions) > 0 { - Rules = append(Rules, NewRule(Follower, followers+1-primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, regions...)))) + rules = append(rules, NewRule(Follower, followers+1-primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, regions...)))) } else { - Rules = append(Rules, NewRule(Follower, followers+1-primaryCount, NewConstraintsDirect())) + rules = append(rules, NewRule(Follower, followers+1-primaryCount, NewConstraintsDirect())) } } - return &Bundle{Rules: Rules}, nil + return &Bundle{Rules: rules}, nil } // Non-Exported functionality function, do not use it directly but NewBundleFromOptions diff --git a/ddl/placement_policy_test.go b/ddl/placement_policy_test.go index 3c4c1b4cd3109..0a1663abd85cd 100644 --- a/ddl/placement_policy_test.go +++ b/ddl/placement_policy_test.go @@ -1928,9 +1928,6 @@ func TestExchangePartitionWithPlacement(t *testing.T) { policy1, ok := dom.InfoSchema().PolicyByName(model.NewCIStr("p1")) require.True(t, ok) - policy2, ok := dom.InfoSchema().PolicyByName(model.NewCIStr("p2")) - require.True(t, ok) - tk.MustExec(`CREATE TABLE t1 (id INT) placement policy p1`) defer tk.MustExec("drop table t1") @@ -1941,12 +1938,8 @@ func TestExchangePartitionWithPlacement(t *testing.T) { require.NoError(t, err) t1ID := t1.Meta().ID - t2, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) - require.NoError(t, err) - t2ID := t2.Meta().ID - tk.MustExec(`CREATE TABLE tp (id INT) placement policy p3 PARTITION BY RANGE (id) ( - PARTITION p0 VALUES LESS THAN (100), + PARTITION p0 VALUES LESS THAN (100) placement policy p1, PARTITION p1 VALUES LESS THAN (1000) placement policy p2, PARTITION p2 VALUES LESS THAN (10000) );`) @@ -1956,7 +1949,6 @@ func TestExchangePartitionWithPlacement(t *testing.T) { require.NoError(t, err) tpID := tp.Meta().ID par0ID := tp.Meta().Partition.Definitions[0].ID - par1ID := tp.Meta().Partition.Definitions[1].ID // exchange par0, t1 tk.MustExec("alter table tp exchange partition p0 with table t1") @@ -1969,14 +1961,14 @@ func TestExchangePartitionWithPlacement(t *testing.T) { " `id` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p3` */\n" + "PARTITION BY RANGE (`id`)\n" + - "(PARTITION `p0` VALUES LESS THAN (100),\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + " PARTITION `p2` VALUES LESS THAN (10000))")) tp, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) require.NoError(t, err) require.Equal(t, tpID, tp.Meta().ID) require.Equal(t, t1ID, tp.Meta().Partition.Definitions[0].ID) - require.Nil(t, tp.Meta().Partition.Definitions[0].PlacementPolicyRef) + require.NotNil(t, tp.Meta().Partition.Definitions[0].PlacementPolicyRef) t1, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) require.NoError(t, err) require.Equal(t, par0ID, t1.Meta().ID) @@ -1984,54 +1976,10 @@ func TestExchangePartitionWithPlacement(t *testing.T) { checkExistTableBundlesInPD(t, dom, "test", "tp") // exchange par0, t2 - tk.MustExec("alter table tp exchange partition p0 with table t2") - tk.MustQuery("show create table t2").Check(testkit.Rows("" + - "t2 CREATE TABLE `t2` (\n" + - " `id` int(11) DEFAULT NULL\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) - tk.MustQuery("show create table tp").Check(testkit.Rows("" + - "tp CREATE TABLE `tp` (\n" + - " `id` int(11) DEFAULT NULL\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p3` */\n" + - "PARTITION BY RANGE (`id`)\n" + - "(PARTITION `p0` VALUES LESS THAN (100),\n" + - " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + - " PARTITION `p2` VALUES LESS THAN (10000))")) - tp, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) - require.NoError(t, err) - require.Equal(t, tpID, tp.Meta().ID) - require.Equal(t, t2ID, tp.Meta().Partition.Definitions[0].ID) - require.Nil(t, tp.Meta().Partition.Definitions[0].PlacementPolicyRef) - t2, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) - require.NoError(t, err) - require.Equal(t, t1ID, t2.Meta().ID) - require.Nil(t, t2.Meta().PlacementPolicyRef) - checkExistTableBundlesInPD(t, dom, "test", "tp") + tk.MustGetErrCode("alter table tp exchange partition p0 with table t2", mysql.ErrTablesDifferentMetadata) - // exchange par1, t1 - tk.MustExec("alter table tp exchange partition p1 with table t1") - tk.MustQuery("show create table t1").Check(testkit.Rows("" + - "t1 CREATE TABLE `t1` (\n" + - " `id` int(11) DEFAULT NULL\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */")) - tk.MustQuery("show create table tp").Check(testkit.Rows("" + - "tp CREATE TABLE `tp` (\n" + - " `id` int(11) DEFAULT NULL\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p3` */\n" + - "PARTITION BY RANGE (`id`)\n" + - "(PARTITION `p0` VALUES LESS THAN (100),\n" + - " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + - " PARTITION `p2` VALUES LESS THAN (10000))")) - tp, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) - require.NoError(t, err) - require.Equal(t, tpID, tp.Meta().ID) - require.Equal(t, par0ID, tp.Meta().Partition.Definitions[1].ID) - require.Equal(t, policy2.ID, tp.Meta().Partition.Definitions[1].PlacementPolicyRef.ID) - t1, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - require.NoError(t, err) - require.Equal(t, par1ID, t1.Meta().ID) - require.Equal(t, policy1.ID, t1.Meta().PlacementPolicyRef.ID) - checkExistTableBundlesInPD(t, dom, "test", "tp") + // exchange par1, t2 + tk.MustGetErrCode("alter table tp exchange partition p1 with table t2", mysql.ErrTablesDifferentMetadata) } func TestPDFail(t *testing.T) { diff --git a/ddl/reorg.go b/ddl/reorg.go index f3c87213c684d..f6d2e135352b3 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -15,7 +15,6 @@ package ddl import ( - "context" "fmt" "strconv" "sync" @@ -33,6 +32,7 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -253,9 +253,9 @@ func (w *worker) runReorgJob(rh *reorgHandler, reorgInfo *reorgInfo, tblInfo *mo switch reorgInfo.Type { case model.ActionAddIndex, model.ActionAddPrimaryKey: - metrics.GetBackfillProgressByLabel(metrics.LblAddIndex).Set(100) + metrics.GetBackfillProgressByLabel(metrics.LblAddIndex, job.SchemaName, tblInfo.Name.String()).Set(0) case model.ActionModifyColumn: - metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn).Set(100) + metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn, job.SchemaName, tblInfo.Name.String()).Set(0) } if err1 := rh.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { logutil.BgLogger().Warn("[ddl] run reorg job done, removeDDLReorgHandle failed", zap.Error(err1)) @@ -321,9 +321,9 @@ func updateBackfillProgress(w *worker, reorgInfo *reorgInfo, tblInfo *model.Tabl } switch reorgInfo.Type { case model.ActionAddIndex, model.ActionAddPrimaryKey: - metrics.GetBackfillProgressByLabel(metrics.LblAddIndex).Set(progress * 100) + metrics.GetBackfillProgressByLabel(metrics.LblAddIndex, reorgInfo.SchemaName, tblInfo.Name.String()).Set(progress * 100) case model.ActionModifyColumn: - metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn).Set(progress * 100) + metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn, reorgInfo.SchemaName, tblInfo.Name.String()).Set(progress * 100) } } @@ -591,7 +591,7 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, // Third step, we need to remove the element information to make sure we can save the reorganized information to storage. failpoint.Inject("MockGetIndexRecordErr", func(val failpoint.Value) { if val.(string) == "addIdxNotOwnerErr" && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 3, 4) { - if err := rh.RemoveReorgElement(job); err != nil { + if err := rh.RemoveReorgElementFailPoint(job); err != nil { failpoint.Return(nil, errors.Trace(err)) } info.first = true @@ -626,7 +626,7 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, failpoint.Inject("errorUpdateReorgHandle", func() (*reorgInfo, error) { return &info, errors.New("occur an error when update reorg handle") }) - err = rh.UpdateDDLReorgHandle(job, start, end, pid, elements[0]) + err = rh.InitDDLReorgHandle(job, start, end, pid, elements[0]) if err != nil { return &info, errors.Trace(err) } @@ -639,7 +639,7 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, // Second step, we need to remove the element information to make sure we can get the error of "ErrDDLReorgElementNotExist". // However, since "txn.Reset()" will be called later, the reorganized information cannot be saved to storage. if val.(string) == "addIdxNotOwnerErr" && atomic.CompareAndSwapUint32(&mockNotOwnerErrOnce, 2, 3) { - if err := rh.RemoveReorgElement(job); err != nil { + if err := rh.RemoveReorgElementFailPoint(job); err != nil { failpoint.Return(nil, errors.Trace(err)) } } @@ -653,7 +653,7 @@ func getReorgInfo(ctx *JobContext, d *ddlCtx, rh *reorgHandler, job *model.Job, // We'll try to remove it in the next major TiDB version. if meta.ErrDDLReorgElementNotExist.Equal(err) { job.SnapshotVer = 0 - logutil.BgLogger().Warn("[ddl] get reorg info, the element does not exist", zap.String("job", job.String())) + logutil.BgLogger().Warn("[ddl] get reorg info, the element does not exist", zap.String("job", job.String()), zap.Bool("enableConcurrentDDL", rh.enableConcurrentDDL)) } return &info, errors.Trace(err) } @@ -695,7 +695,7 @@ func getReorgInfoFromPartitions(ctx *JobContext, d *ddlCtx, rh *reorgHandler, jo zap.String("startHandle", tryDecodeToHandleString(start)), zap.String("endHandle", tryDecodeToHandleString(end))) - err = rh.UpdateDDLReorgHandle(job, start, end, pid, elements[0]) + err = rh.InitDDLReorgHandle(job, start, end, pid, elements[0]) if err != nil { return &info, errors.Trace(err) } @@ -727,52 +727,96 @@ func getReorgInfoFromPartitions(ctx *JobContext, d *ddlCtx, rh *reorgHandler, jo return &info, nil } -func (r *reorgInfo) UpdateReorgMeta(startKey kv.Key) error { +func (r *reorgInfo) UpdateReorgMeta(startKey kv.Key, pool *sessionPool) (err error) { if startKey == nil && r.EndKey == nil { return nil } + se, err := pool.get() + if err != nil { + return + } + defer pool.put(se) - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - err := kv.RunInNewTxn(ctx, r.d.store, true, func(ctx context.Context, txn kv.Transaction) error { - rh := newReorgHandler(meta.NewMeta(txn)) - return errors.Trace(rh.UpdateDDLReorgHandle(r.Job, startKey, r.EndKey, r.PhysicalTableID, r.currElement)) - }) + sess := newSession(se) + err = sess.begin() + if err != nil { + return + } + txn, err := sess.txn() if err != nil { - return errors.Trace(err) + sess.rollback() + return err } - return nil + rh := newReorgHandler(meta.NewMeta(txn), sess, variable.EnableConcurrentDDL.Load()) + err = rh.UpdateDDLReorgHandle(r.Job, startKey, r.EndKey, r.PhysicalTableID, r.currElement) + err1 := sess.commit() + if err == nil { + err = err1 + } + return errors.Trace(err) } // reorgHandler is used to handle the reorg information duration reorganization DDL job. type reorgHandler struct { m *meta.Meta + s *session + + enableConcurrentDDL bool } -func newReorgHandler(t *meta.Meta) *reorgHandler { - return &reorgHandler{m: t} +// NewReorgHandlerForTest creates a new reorgHandler, only used in test. +func NewReorgHandlerForTest(t *meta.Meta, sess sessionctx.Context) *reorgHandler { + return newReorgHandler(t, newSession(sess), variable.EnableConcurrentDDL.Load()) +} + +func newReorgHandler(t *meta.Meta, sess *session, enableConcurrentDDL bool) *reorgHandler { + return &reorgHandler{m: t, s: sess, enableConcurrentDDL: enableConcurrentDDL} } // UpdateDDLReorgStartHandle saves the job reorganization latest processed element and start handle for later resuming. func (r *reorgHandler) UpdateDDLReorgStartHandle(job *model.Job, element *meta.Element, startKey kv.Key) error { + if r.enableConcurrentDDL { + return updateDDLReorgStartHandle(r.s, job, element, startKey) + } return r.m.UpdateDDLReorgStartHandle(job, element, startKey) } // UpdateDDLReorgHandle saves the job reorganization latest processed information for later resuming. func (r *reorgHandler) UpdateDDLReorgHandle(job *model.Job, startKey, endKey kv.Key, physicalTableID int64, element *meta.Element) error { - return r.m.UpdateDDLReorgHandle(job, startKey, endKey, physicalTableID, element) + if r.enableConcurrentDDL { + return updateDDLReorgHandle(r.s, job.ID, startKey, endKey, physicalTableID, element) + } + return r.m.UpdateDDLReorgHandle(job.ID, startKey, endKey, physicalTableID, element) +} + +// InitDDLReorgHandle initializes the job reorganization information. +func (r *reorgHandler) InitDDLReorgHandle(job *model.Job, startKey, endKey kv.Key, physicalTableID int64, element *meta.Element) error { + if r.enableConcurrentDDL { + return initDDLReorgHandle(r.s, job.ID, startKey, endKey, physicalTableID, element) + } + return r.m.UpdateDDLReorgHandle(job.ID, startKey, endKey, physicalTableID, element) } -// RemoveReorgElement removes the element of the reorganization information. -func (r *reorgHandler) RemoveReorgElement(job *model.Job) error { +// RemoveReorgElementFailPoint removes the element of the reorganization information. +func (r *reorgHandler) RemoveReorgElementFailPoint(job *model.Job) error { + if r.enableConcurrentDDL { + return removeReorgElement(r.s, job) + } return r.m.RemoveReorgElement(job) } // RemoveDDLReorgHandle removes the job reorganization related handles. func (r *reorgHandler) RemoveDDLReorgHandle(job *model.Job, elements []*meta.Element) error { + if r.enableConcurrentDDL { + return removeDDLReorgHandle(r.s, job, elements) + } return r.m.RemoveDDLReorgHandle(job, elements) } // GetDDLReorgHandle gets the latest processed DDL reorganize position. func (r *reorgHandler) GetDDLReorgHandle(job *model.Job) (element *meta.Element, startKey, endKey kv.Key, physicalTableID int64, err error) { + if r.enableConcurrentDDL { + return getDDLReorgHandle(r.s, job) + } return r.m.GetDDLReorgHandle(job) } diff --git a/ddl/restart_test.go b/ddl/restart_test.go index bbec12b40ca6f..293ce76d50642 100644 --- a/ddl/restart_test.go +++ b/ddl/restart_test.go @@ -11,75 +11,63 @@ // 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. -//go:build !race -package ddl +package ddl_test import ( "context" "errors" - "fmt" "testing" "time" + "github.com/ngaut/pools" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" ) // this test file include some test that will cause data race, mainly because restartWorkers modify d.ctx -func getDDLSchemaVer(t *testing.T, d *ddl) int64 { +func getDDLSchemaVer(t *testing.T, d ddl.DDL) int64 { m, err := d.Stats(nil) require.NoError(t, err) - v := m[ddlSchemaVersion] + v := m["ddl_schema_version"] return v.(int64) } -// restartWorkers is like the function of d.start. But it won't initialize the "workers" and create a new worker. -// It only starts the original workers. -func (d *ddl) restartWorkers(ctx context.Context) { - d.ctx, d.cancel = context.WithCancel(ctx) - - d.wg.Run(d.limitDDLJobs) - if !RunWorker { - return - } - - err := d.ownerManager.CampaignOwner() - terror.Log(err) - for _, worker := range d.workers { - worker.wg.Add(1) - worker.ctx = d.ctx - w := worker - go w.start(d.ddlCtx) - asyncNotify(worker.ddlJobCh) - } +// restartWorkers will stop the old DDL and create a new DDL and start it. +func restartWorkers(t *testing.T, store kv.Storage, d *domain.Domain) { + err := d.DDL().Stop() + require.NoError(t, err) + newDDL := ddl.NewDDL(context.Background(), ddl.WithStore(d.Store()), ddl.WithInfoCache(d.InfoCache()), ddl.WithLease(d.DDL().GetLease())) + d.SetDDL(newDDL) + err = newDDL.Start(pools.NewResourcePool(func() (pools.Resource, error) { + session := testkit.NewTestKit(t, store).Session() + session.GetSessionVars().CommonGlobalLoaded = true + return session, nil + }, 128, 128, 5)) + require.NoError(t, err) } // runInterruptedJob should be called concurrently with restartWorkers -func runInterruptedJob(d *ddl, job *model.Job, doneCh chan error) { - ctx := mock.NewContext() - ctx.Store = d.store - +func runInterruptedJob(t *testing.T, store kv.Storage, d ddl.DDL, job *model.Job, doneCh chan error) { var ( history *model.Job err error ) + ctx := testkit.NewTestKit(t, store).Session() ctx.SetValue(sessionctx.QueryString, "skip") err = d.DoDDLJob(ctx, job) if errors.Is(err, context.Canceled) { endlessLoopTime := time.Now().Add(time.Minute) for history == nil { // imitate DoDDLJob's logic, quit only find history - history, _ = d.getHistoryDDLJob(job.ID) + history, _ = ddl.GetHistoryJobByID(testkit.NewTestKit(t, store).Session(), job.ID) if history != nil { err = history.Error } @@ -94,18 +82,16 @@ func runInterruptedJob(d *ddl, job *model.Job, doneCh chan error) { doneCh <- err } -func testRunInterruptedJob(t *testing.T, d *ddl, job *model.Job) { +func testRunInterruptedJob(t *testing.T, store kv.Storage, d *domain.Domain, job *model.Job) { done := make(chan error, 1) - go runInterruptedJob(d, job, done) + go runInterruptedJob(t, store, d.DDL(), job, done) - ticker := time.NewTicker(d.lease * 1) + ticker := time.NewTicker(d.DDL().GetLease()) defer ticker.Stop() for { select { case <-ticker.C: - err := d.Stop() - require.NoError(t, err) - d.restartWorkers(context.Background()) + restartWorkers(t, store, d) time.Sleep(time.Millisecond * 20) case err := <-done: require.Nil(t, err) @@ -115,24 +101,12 @@ func testRunInterruptedJob(t *testing.T, d *ddl, job *model.Job) { } func TestSchemaResume(t *testing.T) { - store := createMockStore(t) - defer func() { - require.NoError(t, store.Close()) - }() - - d1, err := testNewDDLAndStart( - context.Background(), - WithStore(store), - WithLease(testLease), - ) - require.NoError(t, err) - defer func() { - require.NoError(t, d1.Stop()) - }() + store, dom, clean := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) + defer clean() - require.True(t, d1.OwnerManager().IsOwner()) + require.True(t, dom.DDL().OwnerManager().IsOwner()) - dbInfo, err := testSchemaInfo(d1, "test_restart") + dbInfo, err := testSchemaInfo(store, "test_restart") require.NoError(t, err) job := &model.Job{ SchemaID: dbInfo.ID, @@ -140,37 +114,25 @@ func TestSchemaResume(t *testing.T) { BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{dbInfo}, } - testRunInterruptedJob(t, d1, job) - testCheckSchemaState(t, d1, dbInfo, model.StatePublic) + testRunInterruptedJob(t, store, dom, job) + testCheckSchemaState(t, store, dbInfo, model.StatePublic) job = &model.Job{ SchemaID: dbInfo.ID, Type: model.ActionDropSchema, BinlogInfo: &model.HistoryInfo{}, } - testRunInterruptedJob(t, d1, job) - testCheckSchemaState(t, d1, dbInfo, model.StateNone) + testRunInterruptedJob(t, store, dom, job) + testCheckSchemaState(t, store, dbInfo, model.StateNone) } func TestStat(t *testing.T) { - store := createMockStore(t) - defer func() { - require.NoError(t, store.Close()) - }() + store, dom, clean := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) + defer clean() - d, err := testNewDDLAndStart( - context.Background(), - WithStore(store), - WithLease(testLease), - ) + dbInfo, err := testSchemaInfo(store, "test_restart") require.NoError(t, err) - defer func() { - require.NoError(t, d.Stop()) - }() - - dbInfo, err := testSchemaInfo(d, "test_restart") - require.NoError(t, err) - testCreateSchema(t, testNewContext(d), d, dbInfo) + testCreateSchema(t, testkit.NewTestKit(t, store).Session(), dom.DDL(), dbInfo) // TODO: Get this information from etcd. // m, err := d.Stats(nil) @@ -185,19 +147,17 @@ func TestStat(t *testing.T) { } done := make(chan error, 1) - go runInterruptedJob(d, job, done) + go runInterruptedJob(t, store, dom.DDL(), job, done) - ticker := time.NewTicker(d.lease * 1) + ticker := time.NewTicker(dom.DDL().GetLease() * 1) defer ticker.Stop() - ver := getDDLSchemaVer(t, d) + ver := getDDLSchemaVer(t, dom.DDL()) LOOP: for { select { case <-ticker.C: - err := d.Stop() - require.Nil(t, err) - require.GreaterOrEqual(t, getDDLSchemaVer(t, d), ver) - d.restartWorkers(context.Background()) + require.GreaterOrEqual(t, getDDLSchemaVer(t, dom.DDL()), ver) + restartWorkers(t, store, dom) time.Sleep(time.Millisecond * 20) case err := <-done: // TODO: Get this information from etcd. @@ -209,31 +169,19 @@ LOOP: } func TestTableResume(t *testing.T) { - store := createMockStore(t) - defer func() { - require.NoError(t, store.Close()) - }() + store, dom, clean := testkit.CreateMockStoreAndDomainWithSchemaLease(t, testLease) + defer clean() - d, err := testNewDDLAndStart( - context.Background(), - WithStore(store), - WithLease(testLease), - ) + dbInfo, err := testSchemaInfo(store, "test_table") require.NoError(t, err) + testCreateSchema(t, testkit.NewTestKit(t, store).Session(), dom.DDL(), dbInfo) defer func() { - require.NoError(t, d.Stop()) + testDropSchema(t, testkit.NewTestKit(t, store).Session(), dom.DDL(), dbInfo) }() - dbInfo, err := testSchemaInfo(d, "test_table") - require.NoError(t, err) - testCreateSchema(t, testNewContext(d), d, dbInfo) - defer func() { - testDropSchema(t, testNewContext(d), d, dbInfo) - }() + require.True(t, dom.DDL().OwnerManager().IsOwner()) - require.True(t, d.OwnerManager().IsOwner()) - - tblInfo, err := testTableInfo(d, "t1", 3) + tblInfo, err := testTableInfo(store, "t1", 3) require.NoError(t, err) job := &model.Job{ SchemaID: dbInfo.ID, @@ -242,8 +190,8 @@ func TestTableResume(t *testing.T) { BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{tblInfo}, } - testRunInterruptedJob(t, d, job) - testCheckTableState(t, d, dbInfo, tblInfo, model.StatePublic) + testRunInterruptedJob(t, store, dom, job) + testCheckTableState(t, store, dbInfo, tblInfo, model.StatePublic) job = &model.Job{ SchemaID: dbInfo.ID, @@ -251,55 +199,6 @@ func TestTableResume(t *testing.T) { Type: model.ActionDropTable, BinlogInfo: &model.HistoryInfo{}, } - testRunInterruptedJob(t, d, job) - testCheckTableState(t, d, dbInfo, tblInfo, model.StateNone) -} - -// testTableInfo creates a test table with num int columns and with no index. -func testTableInfo(d *ddl, name string, num int) (*model.TableInfo, error) { - tblInfo := &model.TableInfo{ - Name: model.NewCIStr(name), - } - genIDs, err := d.genGlobalIDs(1) - - if err != nil { - return nil, err - } - tblInfo.ID = genIDs[0] - - cols := make([]*model.ColumnInfo, num) - for i := range cols { - col := &model.ColumnInfo{ - Name: model.NewCIStr(fmt.Sprintf("c%d", i+1)), - Offset: i, - DefaultValue: i + 1, - State: model.StatePublic, - } - - col.FieldType = *types.NewFieldType(mysql.TypeLong) - col.ID = allocateColumnID(tblInfo) - cols[i] = col - } - tblInfo.Columns = cols - tblInfo.Charset = "utf8" - tblInfo.Collate = "utf8_bin" - return tblInfo, nil -} - -func testCheckTableState(t *testing.T, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) { - ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL) - require.NoError(t, kv.RunInNewTxn(ctx, d.store, false, func(ctx context.Context, txn kv.Transaction) error { - m := meta.NewMeta(txn) - info, err := m.GetTable(dbInfo.ID, tblInfo.ID) - require.NoError(t, err) - - if state == model.StateNone { - require.NoError(t, err) - return nil - } - - require.Equal(t, info.Name, tblInfo.Name) - require.Equal(t, info.State, state) - return nil - })) + testRunInterruptedJob(t, store, dom, job) + testCheckTableState(t, store, dbInfo, tblInfo, model.StateNone) } diff --git a/ddl/rollingback.go b/ddl/rollingback.go index e13a73742bc89..025a566d657e9 100644 --- a/ddl/rollingback.go +++ b/ddl/rollingback.go @@ -77,9 +77,9 @@ func convertAddIdxJob2RollbackJob(d *ddlCtx, t *meta.Meta, job *model.Job, tblIn return ver, errors.Trace(err) } -// convertNotStartAddIdxJob2RollbackJob converts the add index job that are not started workers to rollingbackJob, +// convertNotReorgAddIdxJob2RollbackJob converts the add index job that are not started workers to rollingbackJob, // to rollback add index operations. job.SnapshotVer == 0 indicates the workers are not started. -func convertNotStartAddIdxJob2RollbackJob(d *ddlCtx, t *meta.Meta, job *model.Job, occuredErr error) (ver int64, err error) { +func convertNotReorgAddIdxJob2RollbackJob(d *ddlCtx, t *meta.Meta, job *model.Job, occuredErr error) (ver int64, err error) { schemaID := job.SchemaID tblInfo, err := GetTableInfoAndCancelFaultJob(t, job, schemaID) if err != nil { @@ -111,8 +111,7 @@ func convertNotStartAddIdxJob2RollbackJob(d *ddlCtx, t *meta.Meta, job *model.Jo // normal-type has only two states: None -> Public // reorg-type has five states: None -> Delete-only -> Write-only -> Write-org -> Public func rollingbackModifyColumn(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) { - // If the value of SnapshotVer isn't zero, it means the reorg workers have been started. - if job.SchemaState == model.StateWriteReorganization && job.SnapshotVer != 0 { + if needNotifyAndStopReorgWorker(job) { // column type change workers are started. we have to ask them to exit. logutil.Logger(w.logCtx).Info("[ddl] run the cancelling DDL job", zap.String("job", job.String())) d.notifyReorgCancel(job) @@ -228,19 +227,31 @@ func rollingbackDropIndex(t *meta.Meta, job *model.Job) (ver int64, err error) { } func rollingbackAddIndex(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job, isPK bool) (ver int64, err error) { - // If the value of SnapshotVer isn't zero, it means the work is backfilling the indexes. - if job.SchemaState == model.StateWriteReorganization && job.SnapshotVer != 0 { + if needNotifyAndStopReorgWorker(job) { // add index workers are started. need to ask them to exit. logutil.Logger(w.logCtx).Info("[ddl] run the cancelling DDL job", zap.String("job", job.String())) d.notifyReorgCancel(job) ver, err = w.onCreateIndex(d, t, job, isPK) } else { - // add index workers are not started, remove the indexInfo in tableInfo. - ver, err = convertNotStartAddIdxJob2RollbackJob(d, t, job, dbterror.ErrCancelledDDLJob) + // add index's reorg workers are not running, remove the indexInfo in tableInfo. + ver, err = convertNotReorgAddIdxJob2RollbackJob(d, t, job, dbterror.ErrCancelledDDLJob) } return } +func needNotifyAndStopReorgWorker(job *model.Job) bool { + if job.SchemaState == model.StateWriteReorganization && job.SnapshotVer != 0 { + // If the value of SnapshotVer isn't zero, it means the reorg workers have been started. + if job.MultiSchemaInfo != nil { + // However, if the sub-job is non-revertible, it means the reorg process is finished. + // We don't need to start another round to notify reorg workers to exit. + return job.MultiSchemaInfo.Revertible + } + return true + } + return false +} + func convertAddTablePartitionJob2RollbackJob(d *ddlCtx, t *meta.Meta, job *model.Job, otherwiseErr error, tblInfo *model.TableInfo) (ver int64, err error) { addingDefinitions := tblInfo.Partition.AddingDefinitions partNames := make([]string, 0, len(addingDefinitions)) diff --git a/ddl/sanity_check.go b/ddl/sanity_check.go index 9f0f540b20793..304577f9a6fe7 100644 --- a/ddl/sanity_check.go +++ b/ddl/sanity_check.go @@ -41,7 +41,7 @@ func (d *ddl) checkDeleteRangeCnt(job *model.Job) { logutil.BgLogger().Error("query delete range count failed", zap.Error(err)) panic(err) } - expectedCnt, err := expectedDeleteRangeCnt(job) + expectedCnt, err := expectedDeleteRangeCnt(delRangeCntCtx{idxIDs: map[int64]struct{}{}}, job) if err != nil { logutil.BgLogger().Error("decode job's delete range count failed", zap.Error(err)) panic(err) @@ -78,7 +78,11 @@ func queryDeleteRangeCnt(sessPool *sessionPool, jobID int64) (int, error) { return int(cnt), nil } -func expectedDeleteRangeCnt(job *model.Job) (int, error) { +func expectedDeleteRangeCnt(ctx delRangeCntCtx, job *model.Job) (int, error) { + if job.State == model.JobStateCancelled { + // Cancelled job should not have any delete range. + return 0, nil + } switch job.Type { case model.ActionDropSchema: var tableIDs []int64 @@ -101,6 +105,10 @@ func expectedDeleteRangeCnt(job *model.Job) (int, error) { } return len(physicalTableIDs), nil case model.ActionAddIndex, model.ActionAddPrimaryKey: + hasDelRange := job.State == model.JobStateRollbackDone + if !hasDelRange { + return 0, nil + } var indexID int64 var ifExists bool var partitionIDs []int64 @@ -134,12 +142,12 @@ func expectedDeleteRangeCnt(job *model.Job) (int, error) { return 0, errors.Trace(err) } physicalCnt := mathutil.Max(len(partitionIDs), 1) - return physicalCnt * len(indexIDs), nil + return physicalCnt * ctx.deduplicateIdxCnt(indexIDs), nil case model.ActionMultiSchemaChange: totalExpectedCnt := 0 for _, sub := range job.MultiSchemaInfo.SubJobs { p := sub.ToProxyJob(job) - cnt, err := expectedDeleteRangeCnt(&p) + cnt, err := expectedDeleteRangeCnt(ctx, &p) if err != nil { return 0, err } @@ -150,6 +158,21 @@ func expectedDeleteRangeCnt(job *model.Job) (int, error) { return 0, nil } +type delRangeCntCtx struct { + idxIDs map[int64]struct{} +} + +func (ctx *delRangeCntCtx) deduplicateIdxCnt(indexIDs []int64) int { + cnt := 0 + for _, id := range indexIDs { + if _, ok := ctx.idxIDs[id]; !ok { + ctx.idxIDs[id] = struct{}{} + cnt++ + } + } + return cnt +} + // checkHistoryJobInTest does some sanity check to make sure something is correct after DDL complete. // It's only check during the test environment, so it would panic directly. // These checks may be controlled by configuration in the future. diff --git a/ddl/schematracker/BUILD.bazel b/ddl/schematracker/BUILD.bazel new file mode 100644 index 0000000000000..a61470a7a1192 --- /dev/null +++ b/ddl/schematracker/BUILD.bazel @@ -0,0 +1,51 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "schematracker", + srcs = [ + "checker.go", + "dm_tracker.go", + "info_store.go", + ], + importpath = "github.com/pingcap/tidb/ddl/schematracker", + visibility = ["//visibility:public"], + deps = [ + "//ddl", + "//ddl/util", + "//executor", + "//infoschema", + "//kv", + "//meta/autoid", + "//owner", + "//parser/ast", + "//parser/charset", + "//parser/model", + "//sessionctx", + "//sessionctx/variable", + "//statistics/handle", + "//table", + "//table/tables", + "//tidb-binlog/pump_client", + "//util/collate", + "//util/dbterror", + "@com_github_ngaut_pools//:pools", + "@com_github_pingcap_errors//:errors", + ], +) + +go_test( + name = "schematracker_test", + srcs = [ + "dm_tracker_test.go", + "info_store_test.go", + ], + embed = [":schematracker"], + deps = [ + "//infoschema", + "//parser", + "//parser/ast", + "//parser/model", + "//util/mock", + "@com_github_stretchr_testify//require", + ], +) diff --git a/ddl/schematracker/checker.go b/ddl/schematracker/checker.go new file mode 100644 index 0000000000000..be5314ec85343 --- /dev/null +++ b/ddl/schematracker/checker.go @@ -0,0 +1,478 @@ +// 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 schematracker + +import ( + "bytes" + "context" + "fmt" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/executor" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/owner" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/table" + pumpcli "github.com/pingcap/tidb/tidb-binlog/pump_client" +) + +// Checker is used to check the result of SchemaTracker is same as real DDL. +type Checker struct { + realDDL ddl.DDL + tracker SchemaTracker + + closed bool +} + +// NewChecker creates a Checker. +func NewChecker(realDDL ddl.DDL) *Checker { + return &Checker{ + realDDL: realDDL, + tracker: NewSchemaTracker(2), + } +} + +// Disable turns off check. +func (d *Checker) Disable() { + d.closed = true +} + +// Enable turns on check. +func (d *Checker) Enable() { + d.closed = false +} + +// CreateTestDB creates a `test` database like the default behaviour of TiDB. +func (d Checker) CreateTestDB() { + d.tracker.createTestDB() +} + +func (d Checker) checkDBInfo(ctx sessionctx.Context, dbName model.CIStr) { + if d.closed { + return + } + dbInfo, _ := d.realDDL.GetInfoSchemaWithInterceptor(ctx).SchemaByName(dbName) + dbInfo2 := d.tracker.SchemaByName(dbName) + + if dbInfo == nil || dbInfo2 == nil { + if dbInfo == nil && dbInfo2 == nil { + return + } + errStr := fmt.Sprintf("inconsistent dbInfo, dbName: %s, real ddl: %p, schematracker:%p", dbName, dbInfo, dbInfo2) + panic(errStr) + } + + result := bytes.NewBuffer(make([]byte, 0, 512)) + err := executor.ConstructResultOfShowCreateDatabase(ctx, dbInfo, false, result) + if err != nil { + panic(err) + } + result2 := bytes.NewBuffer(make([]byte, 0, 512)) + err = executor.ConstructResultOfShowCreateDatabase(ctx, dbInfo2, false, result2) + if err != nil { + panic(err) + } + s1 := result.String() + s2 := result2.String() + if s1 != s2 { + errStr := fmt.Sprintf("%s != %s", s1, s2) + panic(errStr) + } +} + +func (d Checker) checkTableInfo(ctx sessionctx.Context, dbName, tableName model.CIStr) { + if d.closed { + return + } + + tableInfo, _ := d.realDDL.GetInfoSchemaWithInterceptor(ctx).TableByName(dbName, tableName) + tableInfo2, _ := d.tracker.TableByName(dbName, tableName) + + if tableInfo == nil || tableInfo2 == nil { + if tableInfo == nil && tableInfo2 == nil { + return + } + errStr := fmt.Sprintf("inconsistent tableInfo, dbName: %s, tableName: %s, real ddl: %p, schematracker:%p", + dbName, tableName, tableInfo, tableInfo2) + panic(errStr) + } + + result := bytes.NewBuffer(make([]byte, 0, 512)) + err := executor.ConstructResultOfShowCreateTable(ctx, tableInfo.Meta(), autoid.Allocators{}, result) + if err != nil { + panic(err) + } + result2 := bytes.NewBuffer(make([]byte, 0, 512)) + err = executor.ConstructResultOfShowCreateTable(ctx, tableInfo2, autoid.Allocators{}, result2) + if err != nil { + panic(err) + } + s1 := result.String() + s2 := result2.String() + if s1 != s2 { + errStr := fmt.Sprintf("%s != %s", s1, s2) + panic(errStr) + } +} + +// CreateSchema implements the DDL interface. +func (d Checker) CreateSchema(ctx sessionctx.Context, stmt *ast.CreateDatabaseStmt) error { + err := d.realDDL.CreateSchema(ctx, stmt) + if err != nil { + return err + } + err = d.tracker.CreateSchema(ctx, stmt) + if err != nil { + panic(err) + } + + d.checkDBInfo(ctx, stmt.Name) + return nil +} + +// AlterSchema implements the DDL interface. +func (d Checker) AlterSchema(sctx sessionctx.Context, stmt *ast.AlterDatabaseStmt) error { + err := d.realDDL.AlterSchema(sctx, stmt) + if err != nil { + return err + } + err = d.tracker.AlterSchema(sctx, stmt) + if err != nil { + panic(err) + } + + d.checkDBInfo(sctx, stmt.Name) + return nil +} + +// DropSchema implements the DDL interface. +func (d Checker) DropSchema(ctx sessionctx.Context, stmt *ast.DropDatabaseStmt) error { + err := d.realDDL.DropSchema(ctx, stmt) + if err != nil { + return err + } + err = d.tracker.DropSchema(ctx, stmt) + if err != nil { + panic(err) + } + + d.checkDBInfo(ctx, stmt.Name) + return nil +} + +// CreateTable implements the DDL interface. +func (d Checker) CreateTable(ctx sessionctx.Context, stmt *ast.CreateTableStmt) error { + err := d.realDDL.CreateTable(ctx, stmt) + if err != nil { + return err + } + // some unit test will also check warnings, we reset the warnings after SchemaTracker use session context again. + count := ctx.GetSessionVars().StmtCtx.WarningCount() + err = d.tracker.CreateTable(ctx, stmt) + if err != nil { + panic(err) + } + ctx.GetSessionVars().StmtCtx.TruncateWarnings(int(count)) + + d.checkTableInfo(ctx, stmt.Table.Schema, stmt.Table.Name) + return nil +} + +// CreateView implements the DDL interface. +func (d Checker) CreateView(ctx sessionctx.Context, stmt *ast.CreateViewStmt) error { + err := d.realDDL.CreateView(ctx, stmt) + if err != nil { + return err + } + err = d.tracker.CreateView(ctx, stmt) + if err != nil { + panic(err) + } + + d.checkTableInfo(ctx, stmt.ViewName.Schema, stmt.ViewName.Name) + return nil +} + +// DropTable implements the DDL interface. +func (d Checker) DropTable(ctx sessionctx.Context, stmt *ast.DropTableStmt) (err error) { + err = d.realDDL.DropTable(ctx, stmt) + _ = d.tracker.DropTable(ctx, stmt) + + for _, tableName := range stmt.Tables { + d.checkTableInfo(ctx, tableName.Schema, tableName.Name) + } + return err +} + +// RecoverTable implements the DDL interface. +func (d Checker) RecoverTable(ctx sessionctx.Context, recoverInfo *ddl.RecoverInfo) (err error) { + //TODO implement me + panic("implement me") +} + +// DropView implements the DDL interface. +func (d Checker) DropView(ctx sessionctx.Context, stmt *ast.DropTableStmt) (err error) { + err = d.realDDL.DropView(ctx, stmt) + if err != nil { + return err + } + err = d.tracker.DropView(ctx, stmt) + if err != nil { + panic(err) + } + + for _, tableName := range stmt.Tables { + d.checkTableInfo(ctx, tableName.Schema, tableName.Name) + } + return nil +} + +// CreateIndex implements the DDL interface. +func (d Checker) CreateIndex(ctx sessionctx.Context, stmt *ast.CreateIndexStmt) error { + //TODO implement me + panic("implement me") +} + +// DropIndex implements the DDL interface. +func (d Checker) DropIndex(ctx sessionctx.Context, stmt *ast.DropIndexStmt) error { + //TODO implement me + panic("implement me") +} + +// AlterTable implements the DDL interface. +func (d Checker) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast.AlterTableStmt) error { + err := d.realDDL.AlterTable(ctx, sctx, stmt) + if err != nil { + return err + } + if d.closed { + return nil + } + panic("implement me") +} + +// TruncateTable implements the DDL interface. +func (d Checker) TruncateTable(ctx sessionctx.Context, tableIdent ast.Ident) error { + //TODO implement me + panic("implement me") +} + +// RenameTable implements the DDL interface. +func (d Checker) RenameTable(ctx sessionctx.Context, stmt *ast.RenameTableStmt) error { + err := d.realDDL.RenameTable(ctx, stmt) + if err != nil { + return err + } + err = d.tracker.RenameTable(ctx, stmt) + if err != nil { + panic(err) + } + + for _, tableName := range stmt.TableToTables { + d.checkTableInfo(ctx, tableName.OldTable.Schema, tableName.OldTable.Name) + d.checkTableInfo(ctx, tableName.NewTable.Schema, tableName.NewTable.Name) + } + return nil +} + +// LockTables implements the DDL interface. +func (d Checker) LockTables(ctx sessionctx.Context, stmt *ast.LockTablesStmt) error { + return d.realDDL.LockTables(ctx, stmt) +} + +// UnlockTables implements the DDL interface. +func (d Checker) UnlockTables(ctx sessionctx.Context, lockedTables []model.TableLockTpInfo) error { + return d.realDDL.UnlockTables(ctx, lockedTables) +} + +// CleanupTableLock implements the DDL interface. +func (d Checker) CleanupTableLock(ctx sessionctx.Context, tables []*ast.TableName) error { + return d.realDDL.CleanupTableLock(ctx, tables) +} + +// UpdateTableReplicaInfo implements the DDL interface. +func (d Checker) UpdateTableReplicaInfo(ctx sessionctx.Context, physicalID int64, available bool) error { + //TODO implement me + panic("implement me") +} + +// RepairTable implements the DDL interface. +func (d Checker) RepairTable(ctx sessionctx.Context, table *ast.TableName, createStmt *ast.CreateTableStmt) error { + //TODO implement me + panic("implement me") +} + +// CreateSequence implements the DDL interface. +func (d Checker) CreateSequence(ctx sessionctx.Context, stmt *ast.CreateSequenceStmt) error { + //TODO implement me + panic("implement me") +} + +// DropSequence implements the DDL interface. +func (d Checker) DropSequence(ctx sessionctx.Context, stmt *ast.DropSequenceStmt) (err error) { + //TODO implement me + panic("implement me") +} + +// AlterSequence implements the DDL interface. +func (d Checker) AlterSequence(ctx sessionctx.Context, stmt *ast.AlterSequenceStmt) error { + //TODO implement me + panic("implement me") +} + +// CreatePlacementPolicy implements the DDL interface. +func (d Checker) CreatePlacementPolicy(ctx sessionctx.Context, stmt *ast.CreatePlacementPolicyStmt) error { + //TODO implement me + panic("implement me") +} + +// DropPlacementPolicy implements the DDL interface. +func (d Checker) DropPlacementPolicy(ctx sessionctx.Context, stmt *ast.DropPlacementPolicyStmt) error { + //TODO implement me + panic("implement me") +} + +// AlterPlacementPolicy implements the DDL interface. +func (d Checker) AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.AlterPlacementPolicyStmt) error { + //TODO implement me + panic("implement me") +} + +// CreateSchemaWithInfo implements the DDL interface. +func (d Checker) CreateSchemaWithInfo(ctx sessionctx.Context, info *model.DBInfo, onExist ddl.OnExist) error { + err := d.realDDL.CreateSchemaWithInfo(ctx, info, onExist) + if err != nil { + return err + } + err = d.tracker.CreateSchemaWithInfo(ctx, info, onExist) + if err != nil { + panic(err) + } + + d.checkDBInfo(ctx, info.Name) + return nil +} + +// CreateTableWithInfo implements the DDL interface. +func (d Checker) CreateTableWithInfo(ctx sessionctx.Context, schema model.CIStr, info *model.TableInfo, onExist ddl.OnExist) error { + //TODO implement me + panic("implement me") +} + +// BatchCreateTableWithInfo implements the DDL interface. +func (d Checker) BatchCreateTableWithInfo(ctx sessionctx.Context, schema model.CIStr, info []*model.TableInfo, onExist ddl.OnExist) error { + //TODO implement me + panic("implement me") +} + +// CreatePlacementPolicyWithInfo implements the DDL interface. +func (d Checker) CreatePlacementPolicyWithInfo(ctx sessionctx.Context, policy *model.PolicyInfo, onExist ddl.OnExist) error { + //TODO implement me + panic("implement me") +} + +// Start implements the DDL interface. +func (d Checker) Start(ctxPool *pools.ResourcePool) error { + return d.realDDL.Start(ctxPool) +} + +// GetLease implements the DDL interface. +func (d Checker) GetLease() time.Duration { + return d.realDDL.GetLease() +} + +// Stats implements the DDL interface. +func (d Checker) Stats(vars *variable.SessionVars) (map[string]interface{}, error) { + return d.realDDL.Stats(vars) +} + +// GetScope implements the DDL interface. +func (d Checker) GetScope(status string) variable.ScopeFlag { + return d.realDDL.GetScope(status) +} + +// Stop implements the DDL interface. +func (d Checker) Stop() error { + return d.realDDL.Stop() +} + +// RegisterStatsHandle implements the DDL interface. +func (d Checker) RegisterStatsHandle(h *handle.Handle) { + d.realDDL.RegisterStatsHandle(h) +} + +// SchemaSyncer implements the DDL interface. +func (d Checker) SchemaSyncer() util.SchemaSyncer { + return d.realDDL.SchemaSyncer() +} + +// OwnerManager implements the DDL interface. +func (d Checker) OwnerManager() owner.Manager { + return d.realDDL.OwnerManager() +} + +// GetID implements the DDL interface. +func (d Checker) GetID() string { + return d.realDDL.GetID() +} + +// GetTableMaxHandle implements the DDL interface. +func (d Checker) GetTableMaxHandle(ctx *ddl.JobContext, startTS uint64, tbl table.PhysicalTable) (kv.Handle, bool, error) { + return d.realDDL.GetTableMaxHandle(ctx, startTS, tbl) +} + +// SetBinlogClient implements the DDL interface. +func (d Checker) SetBinlogClient(client *pumpcli.PumpsClient) { + d.realDDL.SetBinlogClient(client) +} + +// GetHook implements the DDL interface. +func (d Checker) GetHook() ddl.Callback { + return d.realDDL.GetHook() +} + +// SetHook implements the DDL interface. +func (d Checker) SetHook(h ddl.Callback) { + d.realDDL.SetHook(h) +} + +// GetInfoSchemaWithInterceptor implements the DDL interface. +func (d Checker) GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infoschema.InfoSchema { + return d.realDDL.GetInfoSchemaWithInterceptor(ctx) +} + +// DoDDLJob implements the DDL interface. +func (d Checker) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { + return d.realDDL.DoDDLJob(ctx, job) +} + +// MoveJobFromQueue2Table implements the DDL interface. +func (d Checker) MoveJobFromQueue2Table(bool) error { + panic("implement me") +} + +// MoveJobFromTable2Queue implements the DDL interface. +func (d Checker) MoveJobFromTable2Queue() error { + panic("implement me") +} diff --git a/ddl/schematracker/dm_tracker.go b/ddl/schematracker/dm_tracker.go new file mode 100644 index 0000000000000..57b9f944bdc61 --- /dev/null +++ b/ddl/schematracker/dm_tracker.go @@ -0,0 +1,544 @@ +// 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. + +// 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 schematracker + +import ( + "context" + "strings" + "time" + + "github.com/ngaut/pools" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/owner" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/table" + pumpcli "github.com/pingcap/tidb/tidb-binlog/pump_client" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/dbterror" +) + +var _ ddl.DDL = SchemaTracker{} + +// SchemaTracker is used to track schema changes by DM. It implements DDL interface and by applying DDL, it updates the +// table structure to keep tracked with upstream changes. +type SchemaTracker struct { + *InfoStore +} + +// NewSchemaTracker creates a SchemaTracker. lowerCaseTableNames has the same meaning as MySQL variable lower_case_table_names. +func NewSchemaTracker(lowerCaseTableNames int) SchemaTracker { + return SchemaTracker{ + InfoStore: NewInfoStore(lowerCaseTableNames), + } +} + +// CreateSchema implements the DDL interface. +func (d SchemaTracker) CreateSchema(ctx sessionctx.Context, stmt *ast.CreateDatabaseStmt) error { + // we only consider explicit charset/collate, if not found, fallback to default charset/collate. + charsetOpt := ast.CharsetOpt{} + for _, val := range stmt.Options { + switch val.Tp { + case ast.DatabaseOptionCharset: + charsetOpt.Chs = val.Value + case ast.DatabaseOptionCollate: + charsetOpt.Col = val.Value + } + } + + chs, coll, err := ddl.ResolveCharsetCollation(charsetOpt) + if err != nil { + return errors.Trace(err) + } + + dbInfo := &model.DBInfo{Name: stmt.Name, Charset: chs, Collate: coll} + onExist := ddl.OnExistError + if stmt.IfNotExists { + onExist = ddl.OnExistIgnore + } + return d.CreateSchemaWithInfo(ctx, dbInfo, onExist) +} + +func (d SchemaTracker) createTestDB() { + _ = d.CreateSchema(nil, &ast.CreateDatabaseStmt{ + Name: model.NewCIStr("test"), + }) +} + +// CreateSchemaWithInfo implements the DDL interface. +func (d SchemaTracker) CreateSchemaWithInfo(ctx sessionctx.Context, dbInfo *model.DBInfo, onExist ddl.OnExist) error { + oldInfo := d.SchemaByName(dbInfo.Name) + if oldInfo != nil { + if onExist == ddl.OnExistIgnore { + return nil + } + // not support MariaDB's CREATE OR REPLACE SCHEMA + return infoschema.ErrDatabaseExists.GenWithStackByArgs(dbInfo.Name) + } + d.PutSchema(dbInfo) + return nil +} + +// AlterSchema implements the DDL interface. +func (d SchemaTracker) AlterSchema(ctx sessionctx.Context, stmt *ast.AlterDatabaseStmt) error { + dbInfo := d.SchemaByName(stmt.Name) + if dbInfo == nil { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(stmt.Name.O) + } + + // Resolve target charset and collation from options. + var ( + toCharset, toCollate string + err error + ) + + for _, val := range stmt.Options { + switch val.Tp { + case ast.DatabaseOptionCharset: + if toCharset == "" { + toCharset = val.Value + } else if toCharset != val.Value { + return dbterror.ErrConflictingDeclarations.GenWithStackByArgs(toCharset, val.Value) + } + case ast.DatabaseOptionCollate: + info, errGetCollate := collate.GetCollationByName(val.Value) + if errGetCollate != nil { + return errors.Trace(errGetCollate) + } + if toCharset == "" { + toCharset = info.CharsetName + } else if toCharset != info.CharsetName { + return dbterror.ErrConflictingDeclarations.GenWithStackByArgs(toCharset, info.CharsetName) + } + toCollate = info.Name + } + } + if toCharset == "" { + if toCollate, err = charset.GetDefaultCollation(toCharset); err != nil { + return errors.Trace(err) + } + } + + dbInfo.Charset = toCharset + dbInfo.Collate = toCollate + + return nil +} + +// DropSchema implements the DDL interface. +func (d SchemaTracker) DropSchema(ctx sessionctx.Context, stmt *ast.DropDatabaseStmt) error { + ok := d.DeleteSchema(stmt.Name) + if !ok { + if stmt.IfExists { + return nil + } + return infoschema.ErrDatabaseDropExists.GenWithStackByArgs(stmt.Name) + } + return nil +} + +// CreateTable implements the DDL interface. +func (d SchemaTracker) CreateTable(ctx sessionctx.Context, s *ast.CreateTableStmt) error { + ident := ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name} + schema := d.SchemaByName(ident.Schema) + if schema == nil { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(ident.Schema) + } + + // suppress ErrTooLongKey + ctx.GetSessionVars().StrictSQLMode = false + + var ( + referTbl *model.TableInfo + err error + ) + if s.ReferTable != nil { + referTbl, err = d.TableByName(s.ReferTable.Schema, s.ReferTable.Name) + if err != nil { + return infoschema.ErrTableNotExists.GenWithStackByArgs(s.ReferTable.Schema, s.ReferTable.Name) + } + } + + // build tableInfo + var ( + tbInfo *model.TableInfo + ) + if s.ReferTable != nil { + tbInfo, err = ddl.BuildTableInfoWithLike(ctx, ident, referTbl, s) + } else { + tbInfo, err = ddl.BuildTableInfoWithStmt(ctx, s, schema.Charset, schema.Collate, nil) + } + if err != nil { + return errors.Trace(err) + } + + // TODO: to reuse the constant fold of expression in partition range definition we use CheckTableInfoValidWithStmt, + // but it may also introduce unwanted limit check in DM's use case. Should check it later. + if err = ddl.CheckTableInfoValidWithStmt(ctx, tbInfo, s); err != nil { + return err + } + + onExist := ddl.OnExistError + if s.IfNotExists { + onExist = ddl.OnExistIgnore + } + + return d.CreateTableWithInfo(ctx, schema.Name, tbInfo, onExist) +} + +// CreateTableWithInfo implements the DDL interface. +func (d SchemaTracker) CreateTableWithInfo( + ctx sessionctx.Context, + dbName model.CIStr, + info *model.TableInfo, + onExist ddl.OnExist, +) error { + schema := d.SchemaByName(dbName) + if schema == nil { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(dbName) + } + + oldTable, _ := d.TableByName(dbName, info.Name) + if oldTable != nil { + switch onExist { + case ddl.OnExistIgnore: + return nil + case ddl.OnExistReplace: + return d.PutTable(dbName, info) + default: + return infoschema.ErrTableExists.GenWithStackByArgs(ast.Ident{Schema: dbName, Name: info.Name}) + } + } + + return d.PutTable(dbName, info) +} + +// CreateView implements the DDL interface. +func (d SchemaTracker) CreateView(ctx sessionctx.Context, s *ast.CreateViewStmt) error { + viewInfo, err := ddl.BuildViewInfo(ctx, s) + if err != nil { + return err + } + + cols := make([]*table.Column, len(s.Cols)) + for i, v := range s.Cols { + cols[i] = table.ToColumn(&model.ColumnInfo{ + Name: v, + ID: int64(i), + Offset: i, + State: model.StatePublic, + }) + } + + tbInfo, err := ddl.BuildTableInfo(ctx, s.ViewName.Name, cols, nil, "", "") + if err != nil { + return err + } + tbInfo.View = viewInfo + + onExist := ddl.OnExistError + if s.OrReplace { + onExist = ddl.OnExistReplace + } + + return d.CreateTableWithInfo(ctx, s.ViewName.Schema, tbInfo, onExist) +} + +// DropTable implements the DDL interface. +func (d SchemaTracker) DropTable(ctx sessionctx.Context, stmt *ast.DropTableStmt) (err error) { + notExistTables := make([]string, 0, len(stmt.Tables)) + for _, name := range stmt.Tables { + tb, err := d.TableByName(name.Schema, name.Name) + if err != nil || !tb.IsBaseTable() { + if stmt.IfExists { + continue + } + + id := ast.Ident{Schema: name.Schema, Name: name.Name} + notExistTables = append(notExistTables, id.String()) + // For statement dropping multiple tables, we should return error after try to drop all tables. + continue + } + + // Without IF EXISTS, the statement drops all named tables that do exist, and returns an error indicating which + // nonexisting tables it was unable to drop. + // https://dev.mysql.com/doc/refman/5.7/en/drop-table.html + _ = d.DeleteTable(name.Schema, name.Name) + } + + if len(notExistTables) > 0 { + return infoschema.ErrTableDropExists.GenWithStackByArgs(strings.Join(notExistTables, ",")) + } + return nil +} + +// RecoverTable implements the DDL interface, which is no-op in DM's case. +func (d SchemaTracker) RecoverTable(ctx sessionctx.Context, recoverInfo *ddl.RecoverInfo) (err error) { + return nil +} + +// DropView implements the DDL interface. +func (d SchemaTracker) DropView(ctx sessionctx.Context, stmt *ast.DropTableStmt) (err error) { + notExistTables := make([]string, 0, len(stmt.Tables)) + for _, name := range stmt.Tables { + tb, err := d.TableByName(name.Schema, name.Name) + if err != nil { + if stmt.IfExists { + continue + } + + id := ast.Ident{Schema: name.Schema, Name: name.Name} + notExistTables = append(notExistTables, id.String()) + continue + } + + // the behaviour is fast fail when type is wrong. + if !tb.IsView() { + return dbterror.ErrWrongObject.GenWithStackByArgs(name.Schema, name.Name, "VIEW") + } + + _ = d.DeleteTable(name.Schema, name.Name) + } + + if len(notExistTables) > 0 { + return infoschema.ErrTableDropExists.GenWithStackByArgs(strings.Join(notExistTables, ",")) + } + return nil +} + +// CreateIndex implements the DDL interface. +func (d SchemaTracker) CreateIndex(ctx sessionctx.Context, stmt *ast.CreateIndexStmt) error { + panic("not implemented") +} + +// DropIndex implements the DDL interface. +func (d SchemaTracker) DropIndex(ctx sessionctx.Context, stmt *ast.DropIndexStmt) error { + panic("not implemented") +} + +// AlterTable implements the DDL interface. +func (d SchemaTracker) AlterTable(ctx context.Context, sctx sessionctx.Context, stmt *ast.AlterTableStmt) error { + panic("not implemented") +} + +// TruncateTable implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) TruncateTable(ctx sessionctx.Context, tableIdent ast.Ident) error { + return nil +} + +// RenameTable implements the DDL interface. +func (d SchemaTracker) RenameTable(ctx sessionctx.Context, stmt *ast.RenameTableStmt) error { + oldIdents := make([]ast.Ident, 0, len(stmt.TableToTables)) + newIdents := make([]ast.Ident, 0, len(stmt.TableToTables)) + for _, tablePair := range stmt.TableToTables { + oldIdent := ast.Ident{Schema: tablePair.OldTable.Schema, Name: tablePair.OldTable.Name} + newIdent := ast.Ident{Schema: tablePair.NewTable.Schema, Name: tablePair.NewTable.Name} + oldIdents = append(oldIdents, oldIdent) + newIdents = append(newIdents, newIdent) + } + return d.renameTable(ctx, oldIdents, newIdents, false) +} + +// renameTable is used by RenameTable and AlterTable. +func (d SchemaTracker) renameTable(ctx sessionctx.Context, oldIdents, newIdents []ast.Ident, isAlterTable bool) error { + tablesCache := make(map[string]int64) + is := InfoStoreAdaptor{inner: d.InfoStore} + for i := range oldIdents { + _, _, err := ddl.ExtractTblInfos(is, oldIdents[i], newIdents[i], isAlterTable, tablesCache) + if err != nil { + return err + } + } + + for i := range oldIdents { + tableInfo, err := d.TableByName(oldIdents[i].Schema, oldIdents[i].Name) + if err != nil { + return err + } + if err = d.DeleteTable(oldIdents[i].Schema, oldIdents[i].Name); err != nil { + return err + } + tableInfo.Name = newIdents[i].Name + if err = d.PutTable(newIdents[i].Schema, tableInfo); err != nil { + return err + } + } + return nil +} + +// LockTables implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) LockTables(ctx sessionctx.Context, stmt *ast.LockTablesStmt) error { + return nil +} + +// UnlockTables implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) UnlockTables(ctx sessionctx.Context, lockedTables []model.TableLockTpInfo) error { + return nil + +} + +// CleanupTableLock implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) CleanupTableLock(ctx sessionctx.Context, tables []*ast.TableName) error { + return nil + +} + +// UpdateTableReplicaInfo implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) UpdateTableReplicaInfo(ctx sessionctx.Context, physicalID int64, available bool) error { + return nil + +} + +// RepairTable implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) RepairTable(ctx sessionctx.Context, table *ast.TableName, createStmt *ast.CreateTableStmt) error { + return nil + +} + +// CreateSequence implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) CreateSequence(ctx sessionctx.Context, stmt *ast.CreateSequenceStmt) error { + return nil +} + +// DropSequence implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) DropSequence(ctx sessionctx.Context, stmt *ast.DropSequenceStmt) (err error) { + return nil + +} + +// AlterSequence implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) AlterSequence(ctx sessionctx.Context, stmt *ast.AlterSequenceStmt) error { + return nil +} + +// CreatePlacementPolicy implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) CreatePlacementPolicy(ctx sessionctx.Context, stmt *ast.CreatePlacementPolicyStmt) error { + return nil + +} + +// DropPlacementPolicy implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) DropPlacementPolicy(ctx sessionctx.Context, stmt *ast.DropPlacementPolicyStmt) error { + return nil + +} + +// AlterPlacementPolicy implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.AlterPlacementPolicyStmt) error { + return nil + +} + +// BatchCreateTableWithInfo implements the DDL interface, it will call CreateTableWithInfo for each table. +func (d SchemaTracker) BatchCreateTableWithInfo(ctx sessionctx.Context, schema model.CIStr, info []*model.TableInfo, onExist ddl.OnExist) error { + panic("not implemented") +} + +// CreatePlacementPolicyWithInfo implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) CreatePlacementPolicyWithInfo(ctx sessionctx.Context, policy *model.PolicyInfo, onExist ddl.OnExist) error { + return nil +} + +// Start implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) Start(ctxPool *pools.ResourcePool) error { + return nil + +} + +// GetLease implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) GetLease() time.Duration { + return 0 +} + +// Stats implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) Stats(vars *variable.SessionVars) (map[string]interface{}, error) { + return nil, nil +} + +// GetScope implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) GetScope(status string) variable.ScopeFlag { + return 0 +} + +// Stop implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) Stop() error { + return nil +} + +// RegisterStatsHandle implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) RegisterStatsHandle(handle *handle.Handle) {} + +// SchemaSyncer implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) SchemaSyncer() util.SchemaSyncer { + return nil +} + +// OwnerManager implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) OwnerManager() owner.Manager { + return nil +} + +// GetID implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) GetID() string { + return "schema-tracker" +} + +// GetTableMaxHandle implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) GetTableMaxHandle(ctx *ddl.JobContext, startTS uint64, tbl table.PhysicalTable) (kv.Handle, bool, error) { + return nil, false, nil +} + +// SetBinlogClient implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) SetBinlogClient(client *pumpcli.PumpsClient) {} + +// GetHook implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) GetHook() ddl.Callback { + return nil +} + +// SetHook implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) SetHook(h ddl.Callback) {} + +// GetInfoSchemaWithInterceptor implements the DDL interface. +func (d SchemaTracker) GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infoschema.InfoSchema { + panic("not implemented") +} + +// DoDDLJob implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) DoDDLJob(ctx sessionctx.Context, job *model.Job) error { + return nil +} + +// MoveJobFromQueue2Table implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) MoveJobFromQueue2Table(b bool) error { + panic("implement me") +} + +// MoveJobFromTable2Queue implements the DDL interface, it's no-op in DM's case. +func (d SchemaTracker) MoveJobFromTable2Queue() error { + panic("implement me") +} diff --git a/ddl/schematracker/dm_tracker_test.go b/ddl/schematracker/dm_tracker_test.go new file mode 100644 index 0000000000000..41b9f61c5a8c4 --- /dev/null +++ b/ddl/schematracker/dm_tracker_test.go @@ -0,0 +1,82 @@ +// 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. + +// 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 schematracker + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" +) + +func TestCreateTableNoNumLimit(t *testing.T) { + sql := "create table test.t_too_large (" + cnt := 3000 + for i := 1; i <= cnt; i++ { + sql += fmt.Sprintf("a%d double, b%d double, c%d double, d%d double", i, i, i, i) + if i != cnt { + sql += "," + } + } + sql += ");" + + sctx := mock.NewContext() + p := parser.New() + stmt, err := p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + + tracker := NewSchemaTracker(2) + tracker.createTestDB() + err = tracker.CreateTable(sctx, stmt.(*ast.CreateTableStmt)) + require.NoError(t, err) + + sql = "create table test.t_too_many_indexes (" + for i := 0; i < 100; i++ { + if i != 0 { + sql += "," + } + sql += fmt.Sprintf("c%d int", i) + } + for i := 0; i < 100; i++ { + sql += "," + sql += fmt.Sprintf("key k%d(c%d)", i, i) + } + sql += ");" + stmt, err = p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + err = tracker.CreateTable(sctx, stmt.(*ast.CreateTableStmt)) + require.NoError(t, err) +} + +func TestCreateTableLongIndex(t *testing.T) { + sql := "create table test.t (c1 int, c2 blob, c3 varchar(64), index idx_c2(c2(555555)));" + + sctx := mock.NewContext() + p := parser.New() + stmt, err := p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + + tracker := NewSchemaTracker(2) + tracker.createTestDB() + err = tracker.CreateTable(sctx, stmt.(*ast.CreateTableStmt)) + require.NoError(t, err) +} diff --git a/infoschema/info_store.go b/ddl/schematracker/info_store.go similarity index 90% rename from infoschema/info_store.go rename to ddl/schematracker/info_store.go index 9ffd78e64fa2c..44c36aa06528b 100644 --- a/infoschema/info_store.go +++ b/ddl/schematracker/info_store.go @@ -12,9 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package infoschema +package schematracker import ( + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -76,13 +77,13 @@ func (i *InfoStore) TableByName(schema, table model.CIStr) (*model.TableInfo, er schemaKey := i.ciStr2Key(schema) tables, ok := i.tables[schemaKey] if !ok { - return nil, ErrDatabaseNotExists.GenWithStackByArgs(schema) + return nil, infoschema.ErrDatabaseNotExists.GenWithStackByArgs(schema) } tableKey := i.ciStr2Key(table) tbl, ok := tables[tableKey] if !ok { - return nil, ErrTableNotExists.GenWithStackByArgs(schema, table) + return nil, infoschema.ErrTableNotExists.GenWithStackByArgs(schema, table) } return tbl, nil } @@ -92,7 +93,7 @@ func (i *InfoStore) PutTable(schemaName model.CIStr, tblInfo *model.TableInfo) e schemaKey := i.ciStr2Key(schemaName) tables, ok := i.tables[schemaKey] if !ok { - return ErrDatabaseNotExists.GenWithStackByArgs(schemaName) + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(schemaName) } tableKey := i.ciStr2Key(tblInfo.Name) tables[tableKey] = tblInfo @@ -105,13 +106,13 @@ func (i *InfoStore) DeleteTable(schema, table model.CIStr) error { schemaKey := i.ciStr2Key(schema) tables, ok := i.tables[schemaKey] if !ok { - return ErrDatabaseNotExists.GenWithStackByArgs(schema) + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(schema) } tableKey := i.ciStr2Key(table) _, ok = tables[tableKey] if !ok { - return ErrTableNotExists.GenWithStackByArgs(schema, table) + return infoschema.ErrTableNotExists.GenWithStackByArgs(schema, table) } delete(tables, tableKey) return nil @@ -121,7 +122,7 @@ func (i *InfoStore) DeleteTable(schema, table model.CIStr) error { // used by DDL interface. // nolint:unused type InfoStoreAdaptor struct { - InfoSchema + infoschema.InfoSchema inner *InfoStore } diff --git a/infoschema/info_store_test.go b/ddl/schematracker/info_store_test.go similarity index 86% rename from infoschema/info_store_test.go rename to ddl/schematracker/info_store_test.go index 07ee9d87d9de5..10df9b6db163e 100644 --- a/infoschema/info_store_test.go +++ b/ddl/schematracker/info_store_test.go @@ -12,11 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package infoschema +package schematracker import ( "testing" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/stretchr/testify/require" ) @@ -39,17 +40,17 @@ func TestInfoStoreLowerCaseTableNames(t *testing.T) { require.Nil(t, got) err := is.PutTable(lowerDBName, tableInfo) - require.True(t, ErrDatabaseNotExists.Equal(err)) + require.True(t, infoschema.ErrDatabaseNotExists.Equal(err)) err = is.PutTable(dbName, tableInfo) require.NoError(t, err) got2, err := is.TableByName(dbName, tableName) require.NoError(t, err) require.NotNil(t, got2) got2, err = is.TableByName(lowerTableName, tableName) - require.True(t, ErrDatabaseNotExists.Equal(err)) + require.True(t, infoschema.ErrDatabaseNotExists.Equal(err)) require.Nil(t, got2) got2, err = is.TableByName(dbName, lowerTableName) - require.True(t, ErrTableNotExists.Equal(err)) + require.True(t, infoschema.ErrTableNotExists.Equal(err)) require.Nil(t, got2) // compare-insensitive @@ -94,16 +95,16 @@ func TestInfoStoreDeleteTables(t *testing.T) { ok := is.DeleteSchema(dbName2) require.False(t, ok) err = is.PutTable(dbName2, tableInfo1) - require.True(t, ErrDatabaseNotExists.Equal(err)) + require.True(t, infoschema.ErrDatabaseNotExists.Equal(err)) err = is.DeleteTable(dbName2, tableName1) - require.True(t, ErrDatabaseNotExists.Equal(err)) + require.True(t, infoschema.ErrDatabaseNotExists.Equal(err)) is.PutSchema(dbInfo2) err = is.PutTable(dbName2, tableInfo1) require.NoError(t, err) err = is.DeleteTable(dbName2, tableName2) - require.True(t, ErrTableNotExists.Equal(err)) + require.True(t, infoschema.ErrTableNotExists.Equal(err)) err = is.DeleteTable(dbName2, tableName1) require.NoError(t, err) @@ -111,5 +112,5 @@ func TestInfoStoreDeleteTables(t *testing.T) { ok = is.DeleteSchema(dbName1) require.True(t, ok) _, err = is.TableByName(dbName1, tableName1) - require.True(t, ErrDatabaseNotExists.Equal(err)) + require.True(t, infoschema.ErrDatabaseNotExists.Equal(err)) } diff --git a/ddl/stat_test.go b/ddl/stat_test.go index 6b40869a18ab9..3c298ea4ba435 100644 --- a/ddl/stat_test.go +++ b/ddl/stat_test.go @@ -16,6 +16,8 @@ package ddl_test import ( "context" + "fmt" + "strconv" "testing" "github.com/pingcap/failpoint" @@ -24,7 +26,9 @@ import ( "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" @@ -92,9 +96,9 @@ func TestGetDDLInfo(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() - sess := testkit.NewTestKit(t, store).Session() - _, err := sess.Execute(context.Background(), "begin") - require.NoError(t, err) + tk := testkit.NewTestKit(t, store) + sess := tk.Session() + tk.MustExec("begin") txn, err := sess.Txn(true) require.NoError(t, err) @@ -116,7 +120,7 @@ func TestGetDDLInfo(t *testing.T) { RowCount: 0, } - err = addDDLJobs(txn, job) + err = addDDLJobs(sess, txn, job) require.NoError(t, err) info, err := ddl.GetDDLInfo(sess) @@ -126,7 +130,7 @@ func TestGetDDLInfo(t *testing.T) { require.Nil(t, info.ReorgHandle) // two jobs - err = addDDLJobs(txn, job1) + err = addDDLJobs(sess, txn, job1) require.NoError(t, err) info, err = ddl.GetDDLInfo(sess) @@ -136,11 +140,19 @@ func TestGetDDLInfo(t *testing.T) { require.Equal(t, job1, info.Jobs[1]) require.Nil(t, info.ReorgHandle) - _, err = sess.Execute(context.Background(), "rollback") - require.NoError(t, err) + tk.MustExec("rollback") } -func addDDLJobs(txn kv.Transaction, job *model.Job) error { +func addDDLJobs(sess session.Session, txn kv.Transaction, job *model.Job) error { + if variable.EnableConcurrentDDL.Load() { + b, err := job.Encode(true) + if err != nil { + return err + } + _, err = sess.Execute(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), fmt.Sprintf("insert into mysql.tidb_ddl_job(job_id, reorg, schema_ids, table_ids, job_meta, type, processing) values (%d, %t, %s, %s, %s, %d, %t)", + job.ID, job.MayNeedReorg(), strconv.Quote(strconv.FormatInt(job.SchemaID, 10)), strconv.Quote(strconv.FormatInt(job.TableID, 10)), wrapKey2String(b), job.Type, false)) + return err + } m := meta.NewMeta(txn) if job.MayNeedReorg() { return m.EnQueueDDLJob(job, meta.AddIndexJobListKey) @@ -148,6 +160,13 @@ func addDDLJobs(txn kv.Transaction, job *model.Job) error { return m.EnQueueDDLJob(job) } +func wrapKey2String(key []byte) string { + if len(key) == 0 { + return "''" + } + return fmt.Sprintf("0x%x", key) +} + func buildCreateIdxJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, unique bool, indexName string, colName string) *model.Job { return &model.Job{ SchemaID: dbInfo.ID, diff --git a/ddl/table.go b/ddl/table.go index 8d09078575ad9..b253554516976 100644 --- a/ddl/table.go +++ b/ddl/table.go @@ -760,23 +760,43 @@ func onRebaseAutoID(d *ddlCtx, store kv.Storage, t *meta.Meta, job *model.Job, t job.State = model.JobStateCancelled return ver, errors.Trace(err) } + + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + return ver, nil + } + tblInfo, err := GetTableInfoAndCancelFaultJob(t, job, schemaID) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } - // No need to check `newBase` again, because `RebaseAutoID` will do this check. - if tp == autoid.RowIDAllocType { - tblInfo.AutoIncID = newBase - } else { - tblInfo.AutoRandID = newBase - } tbl, err := getTable(store, schemaID, tblInfo) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } + + if !force { + newBaseTemp, err := adjustNewBaseToNextGlobalID(nil, tbl, tp, newBase) + if err != nil { + return ver, errors.Trace(err) + } + if newBase != newBaseTemp { + job.Warning = toTError(fmt.Errorf("Can't reset AUTO_INCREMENT to %d without FORCE option, using %d instead", + newBase, newBaseTemp, + )) + } + newBase = newBaseTemp + } + + if tp == autoid.RowIDAllocType { + tblInfo.AutoIncID = newBase + } else { + tblInfo.AutoRandID = newBase + } + if alloc := tbl.Allocators(nil).Get(tp); alloc != nil { // The next value to allocate is `newBase`. newEnd := newBase - 1 @@ -1008,6 +1028,11 @@ func onModifyTableComment(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ return ver, errors.Trace(err) } + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + return ver, nil + } + tblInfo.Comment = comment ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true) if err != nil { @@ -1042,6 +1067,11 @@ func onModifyTableCharsetAndCollate(d *ddlCtx, t *meta.Meta, job *model.Job) (ve return ver, errors.Trace(err) } + if job.MultiSchemaInfo != nil && job.MultiSchemaInfo.Revertible { + job.MarkNonRevertible() + return ver, nil + } + tblInfo.Charset = toCharset tblInfo.Collate = toCollate @@ -1085,7 +1115,7 @@ func (w *worker) onSetTableFlashReplica(d *ddlCtx, t *meta.Meta, job *model.Job) // Ban setting replica count for tables in system database. if tidb_util.IsMemOrSysDB(job.SchemaName) { - return ver, errors.Trace(dbterror.ErrUnsupportedAlterReplicaForSysTable) + return ver, errors.Trace(dbterror.ErrUnsupportedTiFlashOperationForSysOrMemTable) } err = w.checkTiFlashReplicaCount(replicaInfo.Count) @@ -1304,7 +1334,7 @@ func updateVersionAndTableInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tblInfo default: } }) - if shouldUpdateVer { + if shouldUpdateVer && (job.MultiSchemaInfo == nil || !job.MultiSchemaInfo.SkipVersion) { ver, err = updateSchemaVersion(d, t, job) if err != nil { return 0, errors.Trace(err) diff --git a/ddl/table_modify_test.go b/ddl/table_modify_test.go index 038fcc878d941..50f8ea8a9b6d0 100644 --- a/ddl/table_modify_test.go +++ b/ddl/table_modify_test.go @@ -232,7 +232,7 @@ func testParallelExecSQL(t *testing.T, store kv.Storage, dom *domain.Domain, sql require.NoError(t, err) txn, err := sess.Txn(true) require.NoError(t, err) - jobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + jobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) qLen = len(jobs) if qLen == 2 { @@ -260,7 +260,7 @@ func testParallelExecSQL(t *testing.T, store kv.Storage, dom *domain.Domain, sql require.NoError(t, err) txn, err := sess.Txn(true) require.NoError(t, err) - jobs, err := ddl.GetAllDDLJobs(meta.NewMeta(txn)) + jobs, err := ddl.GetAllDDLJobs(sess, meta.NewMeta(txn)) require.NoError(t, err) qLen = len(jobs) if qLen == 1 { diff --git a/ddl/table_test.go b/ddl/table_test.go index 0a1dff690f5b2..fcdc713539948 100644 --- a/ddl/table_test.go +++ b/ddl/table_test.go @@ -47,6 +47,7 @@ func testRenameTable( Type: model.ActionRenameTable, BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{oldSchemaID, tblInfo.Name, oldSchemaName}, + CtxVars: []interface{}{[]int64{oldSchemaID, newSchemaID}, []int64{tblInfo.ID}}, } ctx.SetValue(sessionctx.QueryString, "skip") require.NoError(t, d.DoDDLJob(ctx, job)) @@ -63,6 +64,7 @@ func testRenameTables(t *testing.T, ctx sessionctx.Context, d ddl.DDL, oldSchema Type: model.ActionRenameTables, BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{oldSchemaIDs, newSchemaIDs, newTableNames, oldTableIDs, oldSchemaNames, oldTableNames}, + CtxVars: []interface{}{append(oldSchemaIDs, newSchemaIDs...), oldTableIDs}, } ctx.SetValue(sessionctx.QueryString, "skip") require.NoError(t, d.DoDDLJob(ctx, job)) diff --git a/ddl/tiflash_replica_test.go b/ddl/tiflash_replica_test.go index f387df702253d..5431f917b7855 100644 --- a/ddl/tiflash_replica_test.go +++ b/ddl/tiflash_replica_test.go @@ -186,7 +186,7 @@ func TestSetTableFlashReplicaForSystemTable(t *testing.T) { for _, one := range sysTables { _, err := tk.Exec(fmt.Sprintf("alter table `%s` set tiflash replica 1", one)) if db == "MySQL" { - require.Equal(t, "[ddl:8200]ALTER table replica for tables in system database is currently unsupported", err.Error()) + require.Equal(t, "[ddl:8200]Unsupported ALTER TiFlash settings for system table and memory table", err.Error()) } else { require.Equal(t, fmt.Sprintf("[planner:1142]ALTER command denied to user 'root'@'%%' for table '%s'", strings.ToLower(one)), err.Error()) } diff --git a/ddl/util/main_test.go b/ddl/util/main_test.go index a28cdcb4b5bfc..fe13e958c6f7c 100644 --- a/ddl/util/main_test.go +++ b/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.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } goleak.VerifyTestMain(m, opts...) diff --git a/distsql/BUILD.bazel b/distsql/BUILD.bazel index 9f20df059fe06..822a49dd79e39 100644 --- a/distsql/BUILD.bazel +++ b/distsql/BUILD.bazel @@ -53,6 +53,7 @@ go_library( go_test( name = "distsql_test", + timeout = "short", srcs = [ "bench_test.go", "distsql_test.go", diff --git a/distsql/distsql.go b/distsql/distsql.go index 9bc9b9cc323d5..add2d57bd0b20 100644 --- a/distsql/distsql.go +++ b/distsql/distsql.go @@ -113,16 +113,17 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie // for selectResult, we just use the kvReq.MemTracker prepared for co-processor // instead of creating a new one for simplification. return &selectResult{ - label: "dag", - resp: resp, - rowLen: len(fieldTypes), - fieldTypes: fieldTypes, - ctx: sctx, - feedback: fb, - sqlType: label, - memTracker: kvReq.MemTracker, - storeType: kvReq.StoreType, - paging: kvReq.Paging, + label: "dag", + resp: resp, + rowLen: len(fieldTypes), + fieldTypes: fieldTypes, + ctx: sctx, + feedback: fb, + sqlType: label, + memTracker: kvReq.MemTracker, + storeType: kvReq.StoreType, + paging: kvReq.Paging, + distSQLConcurrency: kvReq.Concurrency, }, nil } diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index cf684c459e78a..d8523b4e834a3 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -110,12 +110,13 @@ func TestSelectResultRuntimeStats(t *testing.T) { basic := &execdetails.BasicRuntimeStats{} basic.Record(time.Second, 20) s1 := &selectResultRuntimeStats{ - copRespTime: []time.Duration{time.Second, time.Millisecond}, - procKeys: []int64{100, 200}, - backoffSleep: map[string]time.Duration{"RegionMiss": time.Millisecond}, - totalProcessTime: time.Second, - totalWaitTime: time.Second, - rpcStat: tikv.NewRegionRequestRuntimeStats(), + copRespTime: []time.Duration{time.Second, time.Millisecond}, + procKeys: []int64{100, 200}, + backoffSleep: map[string]time.Duration{"RegionMiss": time.Millisecond}, + totalProcessTime: time.Second, + totalWaitTime: time.Second, + rpcStat: tikv.NewRegionRequestRuntimeStats(), + distSQLConcurrency: 15, } s2 := *s1 @@ -124,7 +125,7 @@ func TestSelectResultRuntimeStats(t *testing.T) { stmtStats.RegisterStats(1, s1) stmtStats.RegisterStats(1, &s2) stats := stmtStats.GetRootStats(1) - expect := "time:1s, loops:1, cop_task: {num: 4, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 2s, tot_wait: 2s, copr_cache_hit_ratio: 0.00}, backoff{RegionMiss: 2ms}" + expect := "time:1s, loops:1, cop_task: {num: 4, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 2s, tot_wait: 2s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}, backoff{RegionMiss: 2ms}" require.Equal(t, expect, stats.String()) // Test for idempotence. require.Equal(t, expect, stats.String()) @@ -135,7 +136,7 @@ func TestSelectResultRuntimeStats(t *testing.T) { } stmtStats.RegisterStats(2, s1) stats = stmtStats.GetRootStats(2) - expect = "cop_task: {num: 2, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 1s, tot_wait: 1s, rpc_num: 1, rpc_time: 1s, copr_cache_hit_ratio: 0.00}, backoff{RegionMiss: 1ms}" + expect = "cop_task: {num: 2, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 1s, tot_wait: 1s, rpc_num: 1, rpc_time: 1s, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15}, backoff{RegionMiss: 1ms}" require.Equal(t, expect, stats.String()) // Test for idempotence. require.Equal(t, expect, stats.String()) diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 2bd7c5df65c04..773319f27f847 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -266,6 +266,7 @@ func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *Req builder.SetResourceGroupTagger(sv.StmtCtx.GetResourceGroupTagger()) if sv.EnablePaging { builder.SetPaging(true) + builder.Request.MinPagingSize = uint64(sv.MinPagingSize) } builder.RequestSource.RequestSourceInternal = sv.InRestrictedSQL builder.RequestSource.RequestSourceType = sv.RequestSourceType @@ -367,6 +368,12 @@ func (builder *RequestBuilder) SetIsStaleness(is bool) *RequestBuilder { return builder } +// SetClosestReplicaReadAdjuster sets request CoprRequestAdjuster +func (builder *RequestBuilder) SetClosestReplicaReadAdjuster(chkFn kv.CoprRequestAdjuster) *RequestBuilder { + builder.ClosestReplicaReadAdjuster = chkFn + return builder +} + // TableHandleRangesToKVRanges convert table handle ranges to "KeyRanges" for multiple tables. func TableHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid []int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { if !isCommonHandle { diff --git a/distsql/select_result.go b/distsql/select_result.go index 2a41e318579b4..ffcf846643c68 100644 --- a/distsql/select_result.go +++ b/distsql/select_result.go @@ -151,8 +151,10 @@ type selectResult struct { durationReported bool memTracker *memory.Tracker - stats *selectResultRuntimeStats - paging bool + stats *selectResultRuntimeStats + // distSQLConcurrency and paging are only for collecting information, and they don't affect the process of execution. + distSQLConcurrency int + paging bool } func (r *selectResult) fetchResp(ctx context.Context) error { @@ -366,8 +368,9 @@ func (r *selectResult) updateCopRuntimeStats(ctx context.Context, copStats *copr if r.stats == nil { id := r.rootPlanID r.stats = &selectResultRuntimeStats{ - backoffSleep: make(map[string]time.Duration), - rpcStat: tikv.NewRegionRequestRuntimeStats(), + backoffSleep: make(map[string]time.Duration), + rpcStat: tikv.NewRegionRequestRuntimeStats(), + distSQLConcurrency: r.distSQLConcurrency, } r.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(id, r.stats) } @@ -470,13 +473,14 @@ type CopRuntimeStats interface { } type selectResultRuntimeStats struct { - copRespTime []time.Duration - procKeys []int64 - backoffSleep map[string]time.Duration - totalProcessTime time.Duration - totalWaitTime time.Duration - rpcStat tikv.RegionRequestRuntimeStats - CoprCacheHitNum int64 + copRespTime []time.Duration + procKeys []int64 + backoffSleep map[string]time.Duration + totalProcessTime time.Duration + totalWaitTime time.Duration + rpcStat tikv.RegionRequestRuntimeStats + distSQLConcurrency int + CoprCacheHitNum int64 } func (s *selectResultRuntimeStats) mergeCopRuntimeStats(copStats *copr.CopRuntimeStats, respTime time.Duration) { @@ -497,10 +501,12 @@ func (s *selectResultRuntimeStats) mergeCopRuntimeStats(copStats *copr.CopRuntim func (s *selectResultRuntimeStats) Clone() execdetails.RuntimeStats { newRs := selectResultRuntimeStats{ - copRespTime: make([]time.Duration, 0, len(s.copRespTime)), - procKeys: make([]int64, 0, len(s.procKeys)), - backoffSleep: make(map[string]time.Duration, len(s.backoffSleep)), - rpcStat: tikv.NewRegionRequestRuntimeStats(), + copRespTime: make([]time.Duration, 0, len(s.copRespTime)), + procKeys: make([]int64, 0, len(s.procKeys)), + backoffSleep: make(map[string]time.Duration, len(s.backoffSleep)), + rpcStat: tikv.NewRegionRequestRuntimeStats(), + distSQLConcurrency: s.distSQLConcurrency, + CoprCacheHitNum: s.CoprCacheHitNum, } newRs.copRespTime = append(newRs.copRespTime, s.copRespTime...) newRs.procKeys = append(newRs.procKeys, s.procKeys...) @@ -583,6 +589,10 @@ func (s *selectResultRuntimeStats) String() string { } else { buf.WriteString(", copr_cache: disabled") } + if s.distSQLConcurrency > 0 { + buf.WriteString(", distsql_concurrency: ") + buf.WriteString(strconv.FormatInt(int64(s.distSQLConcurrency), 10)) + } buf.WriteString("}") } diff --git a/docs/design/2022-03-31-concurrent-ddl-framawork.md b/docs/design/2022-03-31-concurrent-ddl-framawork.md deleted file mode 100644 index e3001d271cc12..0000000000000 --- a/docs/design/2022-03-31-concurrent-ddl-framawork.md +++ /dev/null @@ -1,286 +0,0 @@ -# TiDB Design Documents - -- Author(s): [Jiwei Xiong](http://github.com/xiongjiwei), [Wenjun Huang](http://github.com/wjhuang2016), [Xia Li](https://github.com/zimulala) -- Tracking Issue: https://github.com/pingcap/tidb/issues/32031 - -## Table of Contents - -* [Introduction](#introduction) -* [Motivation or Background](#motivation-or-background) -* [Current implementation](#current-implementation) -* [Goal](#goal) -* [Not Goal](#not-goal) -* [Idea](#idea) -* [Detailed Design](#detailed-design) -* [Test Design](#test-design) - * [Compatibility Tests](#compatibility-tests) - * [Benchmark Tests](#benchmark-tests) -* [Unresolved Questions](#unresolved-questions) - -## Introduction - -This document describes the design of Concurrent DDL, which makes DDL in different table are executed concurrently and do not block each other. - -## Motivation and Background - -DDL (Data Definition Language) is a data definition language, commonly used to describe and manage database schema objects, including but not limited to tables, indexes, views, constraints, etc., and is one of the most commonly used database languages. The DDL change in TiDB relies on the two cluster-level queues to achieve lock-free management, solving the DDL conflict problem. However, when a large number of DDLs are executed simultaneously, especially when the execution time of DDLs is long, DDL queuing and blocking occurs, which affects the performance of TiDB and degrades the user experience. - -## Current implementation - -In a cluster, TiDB chooses a DDL owner to run the DDL job. There is only one owner at a time, the other TiDBs can still receive the DDLs and keep them in TiKV waiting for the owner to run it. We divide the DDL into two types. `reorg` for DDL job that takes a long time, contains data change, such as `add index`. `general` for short time, only meta data change, such as `create table`, they are stored in two queues and the corresponding DDL worker always fetches the first one and runs it. -It encounters some scenarios where a DDL would be blocked by other unrelated DDLs - -1. Block happens in the same queue. _(reorg job blocks reorg job)_ - -```sql -CREATE INDEX idx on t(a int); -- t is a big table -CREATE INDEX idx on t1(a int); -- t1 is a small table -``` - -The 2nd DDL is blocked by the 1st because they are in the same queue and only the first is able to run. Create index on `t1` have to wait until `t` is done. - -2. Block happens on dependency check. _(reorg job blocks general job)_ - -In current implementation, we have a constraint that can not run two DDLs one the same table at the same time, such as - -```sql -CREATE INDEX idx on t(a int) -- reorg queue -ALTER TABLE t ADD COLUMN b int -- general queue -CREATE TABLE t1(a int) -- general queue -``` - -Because of the constraint, the 2nd DDL will be blocked by the 1st(they all operate the table t), and the 3rd is blocked by 2nd(they all in general queue). Finally, 3rd blocked by 1st, it does not make sence. - -The problems above are more noticeable in a big cluster. Some of them already reported by the users, we have to take it into account. So, I propose refining the DDL framework from queue based to table based, and making some improvements to it. - -## Goal - -- Make DDLs on the different tables not block each other. -> Limited by DDL workers' count, we can still encounter this problem(when all workers are busy) - -## Non-Goal - -- Concurrency on the same table. - -## Idea - -1. The `queue base` DDL framework is not easy to find the proper DDL job, it can only get the first one. -2. It's necessary to replace the queue with other data structures so that we can manipulate DDL job easily. -3. To solve this problem, we design the `table base` DDL framework. It can pick up any ready-to-run DDL job by SQL statement. - -## Detailed Design - -### Table Definition - -Several tables will be provided to maintain the DDL meta in the DDL job's life cycle. - -Table `mysql.tidb_ddl_job` stores all the queueing DDL meta. -``` -+----------------+------+------+----------------------------------+ -| Field | Null | Key | Comment | -+----------------+------+------+----------------------------------+ -| job_id | NO | PRI | DDL job ID | -| reorg | YES | | True if this DDL need reorg | -| schema_id | YES | | The schema ID relate to this DDL | -| table_id | YES | | The table ID relate to this DDL | -| job_meta | YES | | The arguments of this DDL job | -| is_drop_schema | YES | | True if the DDL is a drop schema | -+----------------+------+------+---------+------------------------+ -``` - -Table `mysql.tidb_ddl_reorg` contains the reorg job data. -``` -+---------------+------+------+-----------------------------------------+ -| Field | Null | Key | Comment | -+---------------+------+------+-----------------------------------------+ -| job_id | NO | | DDL Job ID | -| curr_ele_id | YES | | Current processing element ID | -| curr_ele_type | YES | | Current processing element type | -| ele_id | YES | | Element ID for processing | -| start_key | YES | | The start key for the certain element | -| end_key | YES | | The end key for the certain element | -| physical_id | YES | | The physical ID for the certain element | -| reorg_meta | YES | | reserved for add index | -+---------------+------+------+-----------------------------------------+ -``` -> An element is a column or an index that needs to reorg. - -> `ele_id`, `start_key`, `end_key`, `physical_id` are the reorg context of a certain element. - -Table `mysql.tidb_ddl_history` stores the finished DDL job. -``` -+---------------+------+------+-------------------------------+ -| Field | Null | Key | Comment | -+---------------+------+------+-------------------------------+ -| job_id | NO | PRI | DDL job ID | -| job_meta | YES | | The arguments of this DDL job | -+---------------+------+------+-------------------------------+ -``` - -In bootstrap step, TiDB will build these tables meta and put it into tikv directly. For new cluster, TiDB will also build `mysql` schema meta. - -### DDL operations - -Use the following DDL operations to manage the DDL jobs: -```sql -insert into mysql.tidb_ddl_job values (...) -- add ddl jobs -delete from mysql.tidb_ddl_job where job_id = ... -- delete ddl jobs -update mysql.tidb_ddl_job set job_meta = ... where job_id = ... -- update ddl jobs -select * from mysql.tidb_ddl_job -- get ddl jobs -``` - -If a DDL job is done, the worker will delete that job in `tidb_ddl_job` and its related reorg information in `tidb_ddl_reorg`, then insert the job `into tidb_ddl_history`. - -### DDL job manager - -DDL job manager will find the runnable DDL job and dispatch the jobs to DDL workers. -```golang -for { - if !isOwner { - // sleep a while - continue - } - - // if there are job coming - select { - case <-ddlJobCh: - case <-ticker.C: - case <-notifyDDLJobByEtcdCh: - } - - if freeWorkerCount() > 0 { - job = findrunnableJob() - if job != nil { - go runJob(job) - } - } -} -``` - -To prevent all the workers in worker pool occupied by the long run job like `add index`, TiDB will divide the pool into two types: `reorg` worker pool and `general` worker pool, then the DDL job manager will be - -```golang -for { - // ... - if freeGeneralWorkerCount() > 0 { - generalJob = findRunnableGeneralJob() - if generalJob != nil { - go runGeneralJob(generalJob) - } - } - - if freeReorgWorkerCount() > 0 { - reorgJob = findRunnableReorgJob() - if reorgJob != nil { - go runReorgJob(reorgJob) - } - } -} -``` - -The runnable job defines as -1. It is not running. -2. It is with the minimal job id for all queueing jobs that refer to the same table. -3. Its job id is larger than `drop schema` job id, when a `drop schema` job exists in the job queue trying to drop the same schema. -4. When the job is `drop schema`, it is with the minimal job id for all queueing jobs refer to the same schema. - -to get a general job, we can use SQL -```sql -select * from mysql.tidb_ddl_job where not reorg; -``` -and return the first record. - -Now we will describe how to achieve the 4 rules above: - -Rule 1 and Rule 2: maintain a running job set, group by the table id and find the minimum one, and SQL can be written to -```sql -select * from mysql.tidb_ddl_job where job_id in (select min(job_id) from mysql.tidb_ddl_job where not reorg and job_id not in ({running job id}) group by table_id); -``` - -Then, we find some jobs and check Rule 3 and Rule 4: - -Rule 3: check if there is a smaller `drop schema` job id on the same schema. -```sql -select * from mysql.tidb_ddl_job where is_drop_schema and job_id < {job.id} limit 1; -``` -Rule 4: if the job is `drop schema`, check if there is a smaller job id on the same schema. -```sql -select * from mysql.tidb_ddl_job where job_id < {job.id} limit 1; -``` - -If there are records, we can not run the drop schema job. - -The workflow will looks like - -![concurrent-ddl-framework](./imgs/concurrendl-ddl.png) - -compare current implementataion - -![queue-base-ddl-framework](./imgs/queue-ddl.png) - -### Show DDL jobs - -get DDL jobs from the tables: -```sql -select * from mysql.tidb_ddl_job; -select * from mysql.tidb_history_job; -``` - -### Cancel DDL - -find the cancel job and update the DDL meta to `JobStateCancelling` state -```sql -begin; -select job_meta from mysql.tidb_ddl_job where job_id = {job_id}; --- set the job state to `JobStateCancelling` -update mysql.tidb_ddl_job set job_meta = {job} where job_id = {job.id} -commit; -``` - -### Upgrade compatibility - -Consider the rolling upgrade, the first upgrade tidb instance will hang if there are internal DDLs because the new version TiDB will write DDL job into table, but the old version TiDB DDL owner will not run the job. So the upgrading TiDB should get the DDL owner first: -```golang -//... -if needDoUpgrade { - ddl.requireOwner(); - // Do upgrade ... -} -``` - -In general, there will have no queueing DDL job when upgrading, but if there are some queueing DDL jobs, TiDB should migrate the DDL jobs from queue to table and wait for DDL job manager handle them. - -```golang -//... -if needDoUpgrade { - ddl.requireOwner(); - migrateDDL() // migrate queueing DDL jobs from queue to table, including reorg meta. - // Do upgrade ... -} -``` - -### Compatibility with CDC - -CDC will watch the key range of the ddl job **queue** and sync the finished DDLs to other cluster, after concurrent DDL is implemented, CDC should watch the key range of the `tidb_ddl_job` table and unmarshal the ddl job. -Since we maintain the old ddl framework at the same time, CDC should be able to watch key range of the ddl job queue and `tidb_ddl_job` table. -After several versions, CDC can remove the code of watching the key range of the queue. - - -### How to change the tables(`tidb_ddl_job`, `tidb_ddl_reorg`, `tidb_ddl_history`) meta? - -If a new field is required in `tidb_ddl_job`, we can use a `ALTER TABLE` statement to add the field, the important thing is make this DDL run successfully. -Consider the rolling upgrade progress, only the first instance will run the upgrade SQL, at this time, the DDL owner will be the other TiDB instance, so that the DDL will -be executed successfully by the other old TiDB instance. - -## Test Design - -We will use [schrddl](https://github.com/PingCAP-QE/schrddl) test the concurrent DDL framework. - -`Schrddl` is a fuzz test tool that generate DDL and DML SQLs sends to TiDB. For more information, you can read this document - -### Benchmark Tests - - -## Unresolved Questions - -N/A diff --git a/docs/design/2022-07-20-session-manager.md b/docs/design/2022-07-20-session-manager.md new file mode 100644 index 0000000000000..59d4d2b64feac --- /dev/null +++ b/docs/design/2022-07-20-session-manager.md @@ -0,0 +1,190 @@ +# Proposal: Session Manager + +- Author(s): [djshow832](https://github.com/djshow832) +- Tracking Issue: https://github.com/pingcap/tidb/issues/35258 + +## Abstract + +This proposes a design of a TiDB component called Session Manager. It keeps client connections alive while the TiDB server upgrades, restarts, scales in, and scales out. + +## Background + +Applications generally connect to TiDB through a connection pool to reduce the overhead of creating connections. Connections in the pool are kept alive, thus TiDB has to disconnect the client connections during shutdown. This causes reconnections and QPS jitters on the application side when the TiDB cluster rolling upgrades, restarts, and scales in. Thus, database administrators sometimes operate TiDB clusters when the QPS reaches the bottom, typically in the middle of the night, which is painful. + +Besides, TiDB needs to be upgraded transparently in the TiDB Cloud Dev Tier once the latest version is ready. The current situation makes TiDB impossible to upgrade without affecting users. + +Therefore, we propose a new TiDB component, called Session Manager. Applications or load balancers connect to the Session Manager instead of TiDB. The Session Manager keeps the session states of current connections and redirects the session to alive TiDB instances automatically when a TiDB instance is down. + +![session manager component](./imgs/session-manager-component.png) + +### Goal + +- When the TiDB cluster performs upgrades or restarts, the Session Manager redirects the backend connections from inactive TiDB instances to active instances. This is especially important on the Dev Tier because TiDB will be upgraded frequently and automatically. +- When the TiDB cluster scales out, the Session Manager is aware of the new TiDB instances and redirects some backend connections to the new instances. This is important in a serverless architecture. +- When the TiDB cluster scales in, the Session Manager waits for the ongoing transactions to be finished and redirects some backend connections to active TiDB instances. + +### Non-Goals + +- When a TiDB instance fails accidentally, the Session Manager redirects the backend connections from the failed TiDB instance to an active instance. +- Block list, allow list, traffic control, audit logs. + +## Proposal + +### Deployment + +In the cloud, applications typically connect to the Network Load Balancer (NLB), which balances the traffic to the TiDB cluster. Session Manager is placed between the NLB and the TiDB cluster. + +The NLB balances the traffic to the Session Manager, and the Session Manager balances the traffic to the TiDB cluster. Most of the time, Session Manager only forwards messages between the NLB and the TiDB instances. + +The Session Manager also needs to be highly available. An easy way is to deploy multiple isolated Session Manager instances. However, it's painful to maintain. For example, when a user wants to modify a configuration, he needs to connect to the proxies one by one. What we need is a Session Manager cluster. + +![session manager deployment](./imgs/session-manager-deployment.png) + +Client addresses should be recorded in slow logs, audit logs, TiDB logs, and processlist to enable users to check the source of requests. Besides, users may configure different privileges for different IPs. However, from the viewpoint of TiDB, the client address is the address of the Session Manager. Some proxies use the [Proxy Protocol](https://www.haproxy.com/blog/using-haproxy-with-the-proxy-protocol-to-better-secure-your-database/) to pass the client address to the server and TiDB also supports the Proxy Protocol. Session Manager will also use the Proxy Protocol in the handshake phase. + +### TiDB Instance Discovery + +Traditional proxies require users to configure the addresses of TiDB instances. When the TiDB cluster scales out, scales in, or switches to another TiDB cluster, the user needs to reconfigure it in the proxies. + +A Session Manager instance is deployed independently with other TiDB components. To connect to the TiDB cluster, the PD addresses should be passed to the Session Manager before startup. PD contains an etcd server, containing all the instance addresses in the cluster. The Session Manager watches the etcd key to detect a new TiDB instance. This is just like what TiDB instances do. + +The Session Manager should also do a health check on the TiDB instance to ensure it is alive, and migrate the backend connections to other TiDB instances if it is down. The health check is achieved by trying to connect the MySQL protocol port, just like other proxies. + +Session Manager can do various health checks on TiDB instances: + +- It can observe the CPU and memory usage of TiDB instances so that it can perform load-based balance. +- It can observe whether the latest schema is fetched on TiDB instances so that it can avoid directing client connections to the TiDB instances that cannot serve requests. + +When a TiDB instance needs to be shut down gracefully due to scale-in, upgrading, or restarting, no more new connections are accepted. The health check from the Session Manager will fail and the Session Manager no longer routes new connections to the instance. However, it still waits for the ongoing queries to be finished since the instance is still alive. + +When a TiDB instance quits accidentally, the ongoing queries fail immediately and the Session Manager redirects the connections. + +![session manager health check](./imgs/session-manager-health-check.png) + +### Authentication + +When the Session Manager migrates a session, it needs to authenticate with the new TiDB server. + +It's unsafe to save user passwords in the Session Manager, so we use a token-based authentication: + +1. The administrator places a self-signed certificate on each TiDB server. The certificate and key paths are defined by global variables `tidb_auth_signing_cert` and `tidb_auth_signing_key`. The certificates on all the servers are the same so that a message encrypted by one server can be decrypted by another. +2. When the Session Manager is going to migrate a session from one TiDB instance to another, it queries the session token. The session token is composed by the username, token expiration time, and a signature. The signature is signed with the private key of the certificate. +3. The Session Manager then authenticates with the new TiDB server with a new auth-plugin. The session token acts as the password. The new server checks the username, token expiration time, and the signature. The signature should be verified by the public key. + +To ensure security, TiDB needs to guarantee that: + +- The certificate rotates periodically so that it minimizes the effect of leaking the certificate. +- The username in the session token must be the same with the that in the handshake packet, so one user cannot log in with the identity of another user. +- The token expiration time cannot exceed the current time and the token lifetime cannot be too long, so one user cannot forge the token by brute force, or use a valid token for a long time. +- The signature should be verified so that TiDB can make sure the data is not forged. +- Secure transport is enforced when querying the session token because the token cannot be leaked. + +### Connection State Maintenance + +A MySQL connection is stateful. TiDB maintains a session state for each connection, including session variables, transaction states, and prepared statements. If the Session Manager redirects the frontend query from one backend connection to another without restoring the session state in the new connection, an error may occur. + +The basic workflow is as follows: + +1. When the client queries from the Session Manager, the Session Manager forwards the commands to TiDB and then forwards the query result from TiDB to the client. The session states are only updated by TiDB. +2. When the Session Manager is going to migrate a session from one TiDB instance to another, it queries the session states from the original TiDB instance and saves them. Session Manager queries session states by sending `SHOW SESSION_STATES`, the result of which is in JSON type. +3. The Session Manager then connects to the new TiDB instance and replays the session states by sending `SET SESSION_STATES '{...}'`, the parameter of which is just the result of `SHOW SESSION_STATES`. + +Session states include: + +- Session variables. All the session variables are replayed, because the default values may be different between TiDB instances. +- Prepared statements with their IDs. The prepared statements are created in either binary or text protocol. +- Session SQL bindings. +- User-defined variables. +- The current database. +- Last insert ID, found rows, and row count for the last query, as well as last query info, last transaction info, last DDL info. +- Last sequence values. +- Last warning and error messages. + +Transactions are hard to be restored, so Session Manager doesn't support restoring a transaction. Session Manager must wait until the current transaction finishes or the TiDB instance exits due to shut down timeout. To be aware of whether the session has an active transaction, Session Manager needs to track the transaction status. This can be achieved by parsing the status flag in the response packets. + +Similarly, Session Manager doesn't support restoring a result set. If the client uses a cursor to read, Session Manager must wait until the data is all fetched. Session Manager can parse the request and response packets to know whether the prepared statement is using a cursor and whether all the data is fetched. + +Besides, there are some other limitations: + +- When the session contains local temporary tables, table locks, or advisory locks, the TiDB won't return the session states and Session Manager will report connection failure. +- For long-run queries, such as `ADD INDEX` and `LOAD DATA`, TiDB probably won't wait until they finish. In this case, the client will be disconnected. +- Session Manager needs to reconnect to the new TiDB, which introduces handshake, authentication, and session states initialization, so there will be a performance jitter during the redirection. +- The session-level plan cache on the new TiDB instance is empty, so there will be a slight performance jitter for a while after the redirection. + +### Configuration + +For static configurations, they are read before the startup of the Session Manager and cannot be changed online, such as the port. These configurations can be set by command line parameters. + +For dynamic configurations, it's unacceptable to restart Session Manager to set them because Session Manager is supposed to be always online. The configurations can be overwritten anytime and take effect on the whole cluster. These configurations can be stored on an etcd server, which is deployed on the same machine as the Session Manager. Each Session Manager instance watches the etcd key to update the configurations in time. + +Session Manager provides an HTTP API to update dynamic configurations online, just as the other components do. + +### Observability + +Session Manager is one of the products in the TiDB ecosystem, so it's reasonable to integrate Session Manager with Grafana and TiDB-Dashboard. + +Like the other components, Session Manager also reports metrics to Prometheus. The metrics include but are not limited to: + +- The CPU and memory of each Session Manager instance +- The number of successful and failed session migrations +- The latency and QPS of queries + +TiDB-Dashboard should be able to fetch the logs and profiling data of each Session Manager instance. + +To troubleshoot the Session Manager, Session Manager provides an HTTP API to fetch instance-scoped or global-scoped data, such as: + +- The processlist on the Session Manager instance +- The available TiDB instances from the viewpoint of the Session Manager + +## Compatibility + +### Upgrade Compatibility + +To avoid upgrading Session Manager, Session Manager is supposed to be simple and stable enough. + +However, we still can never guarantee that Session Manager will be bug free, so it still needs to support rolling upgrade. Once upgrading, the client connections will definitely be disconnected. + +### MySQL Compatibility + +Session Manager connects to the MySQL protocol port of TiDB servers, so it should be compatible with MySQL. + +## Test Plans + +Session Manager is an essential component of the query path, so it's very important to ensure its stability. + +We have lots of cases to test, including: + +- Test various ORM and connectors with all versions. The MySQL protocol, especially the authentication part, is different among those versions. +- Test various L4 Proxies. Different proxies use different methods to check the health of Session Manager. +- Test various statements, including randomly generated statements and MySQL tests. +- Test all scenarios tests that we have, and randomly make Session Manager redirect sessions at any time. + +## Alternative Proposals + +Traditional SQL proxies typically maintain the session states on themselves, rather than by backend SQL servers. They parse every response packet, or even request packet, to incrementally update the session states. + +This is also possible for Session Manager. MySQL supports [`CLIENT_SESSION_TRACK` capability](https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html#cs-sect-packet-ok-sessioninfo), which is also used for session migration. MySQL server is able to send human-readable state information and some predefined session states in the OK packet when the session states are changed. + +The most significant advantage of this method is that Session Manager can support fail over. Now that Session Manager has all the up-to-date session states, it can migrate sessions anytime, even if the TiDB instance fails accidentally. + +However, there are some drawbacks of this method: + +- There are only 4 predefined state types, and the type is encoded in an `int<1>`. However, TiDB has tens of state types, some of which are TiDB-specific. We cannot extend the state types because it will break forward compatibility if MySQL adds more state types in the future. +- For some changes, e.g. user-defined variables, the OK packet just notifies the client that there is a change, but doesn't tell it what the change is. We also need to extend the protocol, which is a risk. +- There are some inevitable limitations of fail over. For example, Session Manager will never know whether the statement succeeds when TiDB doesn't respond to a `COMMIT` statement or an auto-commit DML statement. +- To support fail over, Session Manager should also be capable of reconnecting to a new Server without a fresh token. That means Session Manager may need to obtain user passwords in a certain way. + +## Future Work + +The most attractive scenario of routing client connections is multi-tenancy. + +These are some scenarios where multi-tenancy is useful: + +- Separate different businesses (or workloads) to achieve resource isolation. Each business is assigned a tenant. +- Multiple users share a TiDB cluster to save cost. + +![session manager multi-tenancy](./imgs/session-manager-multi-tenancy.png) + +In this architecture, the NLB is not aware of tenants. Each TiDB instance belongs to only one tenant to isolate resources. Thus, it's Session Manager's responsibility to route sessions to different TiDB instances. + +Session Manager can distinguish tenants by the SNI servers. diff --git a/docs/design/imgs/session-manager-component.png b/docs/design/imgs/session-manager-component.png new file mode 100644 index 0000000000000..b9940c2c391ff Binary files /dev/null and b/docs/design/imgs/session-manager-component.png differ diff --git a/docs/design/imgs/session-manager-deployment.png b/docs/design/imgs/session-manager-deployment.png new file mode 100644 index 0000000000000..9c64fe8b557e2 Binary files /dev/null and b/docs/design/imgs/session-manager-deployment.png differ diff --git a/docs/design/imgs/session-manager-health-check.png b/docs/design/imgs/session-manager-health-check.png new file mode 100644 index 0000000000000..72ec6885ef299 Binary files /dev/null and b/docs/design/imgs/session-manager-health-check.png differ diff --git a/docs/design/imgs/session-manager-multi-tenancy.png b/docs/design/imgs/session-manager-multi-tenancy.png new file mode 100644 index 0000000000000..ad40c2f78a919 Binary files /dev/null and b/docs/design/imgs/session-manager-multi-tenancy.png differ diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index b1c867746ac8d..ce69c035fd49a 100644 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -17,6 +17,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//bindinfo", + "//br/pkg/streamhelper", "//config", "//ddl", "//ddl/util", @@ -35,6 +36,7 @@ go_library( "//parser/terror", "//privilege/privileges", "//sessionctx", + "//sessionctx/sessionstates", "//sessionctx/variable", "//statistics/handle", "//telemetry", @@ -49,6 +51,7 @@ go_library( "@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//oracle", "@com_github_tikv_client_go_v2//tikv", diff --git a/domain/db_test.go b/domain/db_test.go index 25b24d8116604..ff6e6b625788a 100644 --- a/domain/db_test.go +++ b/domain/db_test.go @@ -76,8 +76,9 @@ func TestNormalSessionPool(t *testing.T) { info, err1 := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true) require.NoError(t, err1) conf := config.GetGlobalConfig() + conf.Socket = "" conf.Port = 0 - conf.Status.StatusPort = 10045 + conf.Status.ReportStatus = false svr, err := server.NewServer(conf, nil) require.NoError(t, err) svr.SetDomain(domain) @@ -109,8 +110,9 @@ func TestAbnormalSessionPool(t *testing.T) { info, err1 := infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true) require.NoError(t, err1) conf := config.GetGlobalConfig() + conf.Socket = "" conf.Port = 0 - conf.Status.StatusPort = 10046 + conf.Status.ReportStatus = false svr, err := server.NewServer(conf, nil) require.NoError(t, err) svr.SetDomain(domain) diff --git a/domain/domain.go b/domain/domain.go index 02d9d72e6486e..a8f35f8abdd05 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -27,7 +27,9 @@ import ( "github.com/ngaut/pools" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/log" "github.com/pingcap/tidb/bindinfo" + "github.com/pingcap/tidb/br/pkg/streamhelper" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" ddlutil "github.com/pingcap/tidb/ddl/util" @@ -46,6 +48,7 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/sessionstates" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/telemetry" @@ -92,6 +95,7 @@ type Domain struct { indexUsageSyncLease time.Duration dumpFileGcChecker *dumpFileGcChecker expiredTimeStamp4PC types.Time + logBackupAdvancer *streamhelper.AdvancerDaemon serverID uint64 serverIDSession *concurrency.Session @@ -122,7 +126,7 @@ func (do *Domain) EtcdClient() *clientv3.Client { func (do *Domain) loadInfoSchema(startTS uint64) (infoschema.InfoSchema, bool, int64, *transaction.RelatedSchemaChange, error) { snapshot := do.store.GetSnapshot(kv.NewVersion(startTS)) m := meta.NewSnapshotMeta(snapshot) - neededSchemaVersion, err := m.GetSchemaVersion() + neededSchemaVersion, err := m.GetSchemaVersionWithNonEmptyDiff() if err != nil { return nil, false, 0, nil, err } @@ -286,8 +290,9 @@ func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64 return nil, nil, err } if diff == nil { - // If diff is missing for any version between used and new version, we fall back to full reload. - return nil, nil, fmt.Errorf("failed to get schemadiff") + // Empty diff means the txn of generating schema version is committed, but the txn of `runDDLJob` is not or fail. + // It is safe to skip the empty diff because the infoschema is new enough and consistent. + continue } diffs = append(diffs, diff) } @@ -371,6 +376,11 @@ func (do *Domain) DDL() ddl.DDL { return do.ddl } +// SetDDL sets DDL to domain, it's only used in tests. +func (do *Domain) SetDDL(d ddl.DDL) { + do.ddl = d +} + // InfoSyncer gets infoSyncer from domain. func (do *Domain) InfoSyncer() *infosync.InfoSyncer { return do.info @@ -884,10 +894,34 @@ func (do *Domain) Init(ddlLease time.Duration, sysExecutorFactory func(*Domain) do.wg.Add(1) go do.topologySyncerKeeper() } + err = do.initLogBackup(ctx, pdClient) + if err != nil { + return err + } return nil } +func (do *Domain) initLogBackup(ctx context.Context, pdClient pd.Client) error { + cfg := config.GetGlobalConfig() + if pdClient == nil || do.etcdClient == nil { + log.Warn("pd / etcd client not provided, won't begin Advancer.") + return nil + } + env, err := streamhelper.TiDBEnv(pdClient, do.etcdClient, cfg) + if err != nil { + return err + } + adv := streamhelper.NewCheckpointAdvancer(env) + do.logBackupAdvancer = streamhelper.NewAdvancerDaemon(adv, streamhelper.OwnerManagerForLogBackup(ctx, do.etcdClient)) + loop, err := do.logBackupAdvancer.Begin(ctx) + if err != nil { + return err + } + do.wg.Run(loop) + return nil +} + type sessionPool struct { resources chan pools.Resource factory pools.Factory @@ -1604,6 +1638,26 @@ func (do *Domain) NotifyUpdateSysVarCache() { } } +// LoadSigningCertLoop loads the signing cert periodically to make sure it's fresh new. +func (do *Domain) LoadSigningCertLoop() { + do.wg.Add(1) + go func() { + defer func() { + do.wg.Done() + logutil.BgLogger().Debug("loadSigningCertLoop exited.") + util.Recover(metrics.LabelDomain, "LoadSigningCertLoop", nil, false) + }() + for { + select { + case <-time.After(sessionstates.LoadCertInterval): + sessionstates.ReloadSigningCert() + case <-do.exit: + return + } + } + }() +} + // ServerID gets serverID. func (do *Domain) ServerID() uint64 { return atomic.LoadUint64(&do.serverID) diff --git a/domain/domain_test.go b/domain/domain_test.go index 98776381d1ae8..bbce2bcb23283 100644 --- a/domain/domain_test.go +++ b/domain/domain_test.go @@ -82,7 +82,9 @@ func TestInfo(t *testing.T) { ) ddl.DisableTiFlashPoll(dom.ddl) require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/MockReplaceDDL", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/ddl/NoDDLDispatchLoop", `return(true)`)) require.NoError(t, dom.Init(ddlLease, sysMockFactory)) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/ddl/NoDDLDispatchLoop")) require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/domain/MockReplaceDDL")) // Test for GetServerInfo and GetServerInfoByID. diff --git a/domain/infosync/BUILD.bazel b/domain/infosync/BUILD.bazel index e9ecff7fa5606..c92426d835c2f 100644 --- a/domain/infosync/BUILD.bazel +++ b/domain/infosync/BUILD.bazel @@ -47,6 +47,7 @@ go_library( go_test( name = "infosync_test", + timeout = "short", srcs = ["info_test.go"], embed = [":infosync"], flaky = True, diff --git a/domain/infosync/info.go b/domain/infosync/info.go index 98e16e2c8c573..59dc9ede4c56f 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -22,12 +22,14 @@ import ( "net/http" "os" "path" + "regexp" "strconv" "strings" "sync" "sync/atomic" "time" + "github.com/coreos/go-semver/semver" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" @@ -51,6 +53,7 @@ import ( "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/versioninfo" "github.com/tikv/client-go/v2/oracle" + pd "github.com/tikv/pd/client" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/client/v3/concurrency" "go.uber.org/zap" @@ -428,6 +431,43 @@ func doRequest(ctx context.Context, apiName string, addrs []string, route, metho return nil, err } +func removeVAndHash(v string) string { + if v == "" { + return v + } + versionHash := regexp.MustCompile("-[0-9]+-g[0-9a-f]{7,}(-dev)?") + v = versionHash.ReplaceAllLiteralString(v, "") + v = strings.TrimSuffix(v, "-dirty") + return strings.TrimPrefix(v, "v") +} + +// CheckTiKVVersion is used to check the tikv version. +func CheckTiKVVersion(store kv.Storage, minVersion semver.Version) error { + if store, ok := store.(kv.StorageWithPD); ok { + pdClient := store.GetPDClient() + stores, err := pdClient.GetAllStores(context.Background(), pd.WithExcludeTombstone()) + if err != nil { + return err + } + for _, s := range stores { + // empty version means the store is a mock store. + if s.Version == "" { + continue + } + ver, err := semver.NewVersion(removeVAndHash(s.Version)) + if err != nil { + return errors.Trace(errors.Annotate(err, "invalid TiKV version")) + } + v := ver.Compare(minVersion) + if v < 0 { + return errors.New("TiKV version must greater than or equal to " + minVersion.String()) + } + } + } + + return nil +} + func doRequestWithFailpoint(req *http.Request) (resp *http.Response, err error) { fpEnabled := false failpoint.Inject("FailPlacement", func(val failpoint.Value) { diff --git a/domain/main_test.go b/domain/main_test.go index fc4bc11227206..163fedbad111a 100644 --- a/domain/main_test.go +++ b/domain/main_test.go @@ -17,11 +17,13 @@ package domain_test import ( "testing" + "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/testkit/testsetup" "go.uber.org/goleak" ) func TestMain(m *testing.M) { + server.RunInGoTest = true testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), diff --git a/dumpling/cmd/dumpling/main.go b/dumpling/cmd/dumpling/main.go index 5e4b8d8f0521b..fb8cbdab09914 100644 --- a/dumpling/cmd/dumpling/main.go +++ b/dumpling/cmd/dumpling/main.go @@ -72,7 +72,7 @@ func main() { os.Exit(1) } err = dumper.Dump() - dumper.Close() + _ = dumper.Close() if err != nil { dumper.L().Error("dump failed error stack info", zap.Error(err)) fmt.Printf("\ndump failed: %s\n", err.Error()) diff --git a/dumpling/export/config.go b/dumpling/export/config.go index d9fa184643415..14c62ad5c1bfb 100644 --- a/dumpling/export/config.go +++ b/dumpling/export/config.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "net" "strconv" "strings" "text/template" @@ -205,8 +206,9 @@ func (conf *Config) String() string { func (conf *Config) GetDSN(db string) string { // maxAllowedPacket=0 can be used to automatically fetch the max_allowed_packet variable from server on every connection. // https://github.com/go-sql-driver/mysql#maxallowedpacket - dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?collation=utf8mb4_general_ci&readTimeout=%s&writeTimeout=30s&interpolateParams=true&maxAllowedPacket=0", - conf.User, conf.Password, conf.Host, conf.Port, db, conf.ReadTimeout) + hostPort := net.JoinHostPort(conf.Host, strconv.Itoa(conf.Port)) + dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?collation=utf8mb4_general_ci&readTimeout=%s&writeTimeout=30s&interpolateParams=true&maxAllowedPacket=0", + conf.User, conf.Password, hostPort, db, conf.ReadTimeout) if len(conf.Security.CAPath) > 0 { dsn += "&tls=dumpling-tls-target" } diff --git a/dumpling/export/consistency.go b/dumpling/export/consistency.go index 6e0f65960f275..803caa7a94900 100644 --- a/dumpling/export/consistency.go +++ b/dumpling/export/consistency.go @@ -102,7 +102,7 @@ func (c *ConsistencyFlushTableWithReadLock) TearDown(ctx context.Context) error return nil } defer func() { - c.conn.Close() + _ = c.conn.Close() c.conn = nil }() return UnlockTables(ctx, c.conn) @@ -159,7 +159,7 @@ func (c *ConsistencyLockDumpingTables) TearDown(ctx context.Context) error { return nil } defer func() { - c.conn.Close() + _ = c.conn.Close() c.conn = nil }() return UnlockTables(ctx, c.conn) diff --git a/dumpling/export/dump.go b/dumpling/export/dump.go index c6fa3c08615f8..6e64eca65bacf 100755 --- a/dumpling/export/dump.go +++ b/dumpling/export/dump.go @@ -140,10 +140,10 @@ func (d *Dumper) Dump() (dumpErr error) { return errors.Trace(err) } if err = prepareTableListToDump(tctx, conf, conn); err != nil { - conn.Close() + _ = conn.Close() return err } - conn.Close() + _ = conn.Close() } conCtrl, err = NewConsistencyController(tctx, conf, pool) @@ -165,7 +165,9 @@ func (d *Dumper) Dump() (dumpErr error) { if err != nil { return err } - defer metaConn.Close() + defer func() { + _ = metaConn.Close() + }() m.recordStartTime(time.Now()) // for consistency lock, we can write snapshot info after all tables are locked. // the binlog pos may changed because there is still possible write between we lock tables and write master status. @@ -205,7 +207,7 @@ func (d *Dumper) Dump() (dumpErr error) { return conn, errors.Trace(err1) } // give up the last broken connection - conn.Close() + _ = conn.Close() newConn, err1 := createConnWithConsistency(tctx, pool, repeatableRead) if err1 != nil { return conn, errors.Trace(err1) @@ -330,7 +332,7 @@ func (d *Dumper) startWriters(tctx *tcontext.Context, wg *errgroup.Group, taskCh } tearDown := func() { for _, w := range writers { - w.conn.Close() + _ = w.conn.Close() } } return writers, tearDown, nil @@ -948,7 +950,7 @@ func selectTiDBTableSample(tctx *tcontext.Context, conn *BaseConn, meta TableMet return nil }, func() { if iter != nil { - iter.Close() + _ = iter.Close() iter = nil } rowRec = MakeRowReceiver(pkColTypes) @@ -1504,12 +1506,16 @@ func (d *Dumper) renewSelectTableRegionFuncForLowerTiDB(tctx *tcontext.Context) if err != nil { return errors.Trace(err) } - defer dbHandle.Close() + defer func() { + _ = dbHandle.Close() + }() conn, err := dbHandle.Conn(tctx) if err != nil { return errors.Trace(err) } - defer conn.Close() + defer func() { + _ = conn.Close() + }() dbInfos, err := GetDBInfo(conn, DatabaseTablesToMap(conf.Tables)) if err != nil { return errors.Trace(err) diff --git a/dumpling/export/sql.go b/dumpling/export/sql.go index ad78158bb27a8..d17d70089ffa9 100644 --- a/dumpling/export/sql.go +++ b/dumpling/export/sql.go @@ -778,7 +778,9 @@ func getTiDBConfig(db *sql.Conn) (dbconfig.Config, error) { func CheckTiDBWithTiKV(db *sql.DB) (bool, error) { conn, err := db.Conn(context.Background()) if err == nil { - defer conn.Close() + defer func() { + _ = conn.Close() + }() tidbConfig, err := getTiDBConfig(conn) if err == nil { return tidbConfig.Store == "tikv", nil diff --git a/dumpling/export/writer.go b/dumpling/export/writer.go index d3545aa2e4f18..0ce7a006244b3 100644 --- a/dumpling/export/writer.go +++ b/dumpling/export/writer.go @@ -217,7 +217,9 @@ func (w *Writer) WriteTableData(meta TableMeta, ir TableDataIR, currentChunk int return err } } - defer ir.Close() + defer func() { + _ = ir.Close() + }() return w.tryToWriteTableData(tctx, meta, ir, currentChunk) }, newRebuildConnBackOffer(canRebuildConn(conf.Consistency, conf.TransactionalConsistency))) } diff --git a/dumpling/install.sh b/dumpling/install.sh index e51ee861b099c..65fd56e454c97 100644 --- a/dumpling/install.sh +++ b/dumpling/install.sh @@ -27,3 +27,6 @@ mv tidb/bin/tidb-server bin/ # download minio wget https://dl.min.io/server/minio/release/linux-amd64/minio -O bin/minio chmod a+x bin/minio + +wget https://dl.minio.io/client/mc/release/linux-amd64/mc -O bin/mc +chmod a+x bin/mc diff --git a/dumpling/tests/s3/run.sh b/dumpling/tests/s3/run.sh index a5011e4707946..ede8c316106ed 100755 --- a/dumpling/tests/s3/run.sh +++ b/dumpling/tests/s3/run.sh @@ -47,38 +47,54 @@ run_sql "create database $DB_NAME DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;" (cd "$(dirname "$0")" && GO111MODULE=on go build -o out) $DUMPLING_BASE_NAME/out -B $DB_NAME -T $TABLE_NAME -P 3306 -w 16 -# run dumpling! HOST_DIR=${DUMPLING_OUTPUT_DIR} + +# run dumpling local +export DUMPLING_OUTPUT_DIR=${HOST_DIR}/local +run_dumpling + +# run dumpling s3 export DUMPLING_OUTPUT_DIR=s3://mybucket/dump export DUMPLING_TEST_DATABASE=$DB_NAME export AWS_REGION=us-east-1 export AWS_ACCESS_KEY_ID="$MINIO_ACCESS_KEY" export AWS_SECRET_ACCESS_KEY="$MINIO_SECRET_KEY" run_dumpling --s3.endpoint="http://$S3_ENDPOINT/" -ls "${HOST_DIR}" +ls "${HOST_DIR}" -R + +mkdir -p "${HOST_DIR}/remote" + +bin/mc config host add minio http://127.0.0.1:5000 testid testkey8 +bin/mc cp minio/mybucket/dump/s3-schema-create.sql "${HOST_DIR}/remote/s3-schema-create.sql" +bin/mc cp minio/mybucket/dump/s3.t-schema.sql "${HOST_DIR}/remote/s3.t-schema.sql" +bin/mc cp minio/mybucket/dump/s3.t.000000000.sql "${HOST_DIR}/remote/s3.t.000000000.sql" -file_should_exist "$DBPATH/mybucket/dump/s3-schema-create.sql" -file_should_exist "$DBPATH/mybucket/dump/s3.t-schema.sql" -file_should_exist "$DBPATH/mybucket/dump/s3.t.000000000.sql" +diff "${HOST_DIR}/local/s3-schema-create.sql" "${HOST_DIR}/remote/s3-schema-create.sql" +diff "${HOST_DIR}/local/s3.t-schema.sql" "${HOST_DIR}/remote/s3.t-schema.sql" +diff "${HOST_DIR}/local/s3.t.000000000.sql" "${HOST_DIR}/remote/s3.t.000000000.sql" -cnt=`grep -o "('aaaaaaaaaa')" $DBPATH/mybucket/dump/s3.t.000000000.sql|wc -l` +cnt=`grep -o "('aaaaaaaaaa')" ${HOST_DIR}/remote/s3.t.000000000.sql|wc -l` echo "1st records count is ${cnt}" [ $cnt = 5000000 ] # run dumpling with compress option -mv "$DBPATH/mybucket/dump" "$DBPATH/mybucket/expect" +export DUMPLING_OUTPUT_DIR=s3://mybucket/dump-compress + run_dumpling --s3.endpoint="http://$S3_ENDPOINT/" --compress "gzip" -file_should_exist "$DBPATH/mybucket/dump/s3-schema-create.sql.gz" -file_should_exist "$DBPATH/mybucket/dump/s3.t-schema.sql.gz" -file_should_exist "$DBPATH/mybucket/dump/s3.t.000000000.sql.gz" -gzip "$DBPATH/mybucket/dump/s3-schema-create.sql.gz" -d -diff "$DBPATH/mybucket/expect/s3-schema-create.sql" "$DBPATH/mybucket/dump/s3-schema-create.sql" +mkdir -p "${HOST_DIR}/compress" + +bin/mc cp minio/mybucket/dump-compress/s3-schema-create.sql.gz "${HOST_DIR}/compress/s3-schema-create.sql.gz" +bin/mc cp minio/mybucket/dump-compress/s3.t-schema.sql.gz "${HOST_DIR}/compress/s3.t-schema.sql.gz" +bin/mc cp minio/mybucket/dump-compress/s3.t.000000000.sql.gz "${HOST_DIR}/compress/s3.t.000000000.sql.gz" + +gzip "${HOST_DIR}/compress/s3-schema-create.sql.gz" -d +diff "${HOST_DIR}/local/s3-schema-create.sql" "${HOST_DIR}/compress/s3-schema-create.sql" -gzip "$DBPATH/mybucket/dump/s3.t-schema.sql.gz" -d -diff "$DBPATH/mybucket/expect/s3.t-schema.sql" "$DBPATH/mybucket/dump/s3.t-schema.sql" +gzip "${HOST_DIR}/compress/s3.t-schema.sql.gz" -d +diff "${HOST_DIR}/local/s3.t-schema.sql" "${HOST_DIR}/compress/s3.t-schema.sql" -gzip "$DBPATH/mybucket/dump/s3.t.000000000.sql.gz" -d -diff "$DBPATH/mybucket/expect/s3.t.000000000.sql" "$DBPATH/mybucket/dump/s3.t.000000000.sql" +gzip "${HOST_DIR}/compress/s3.t.000000000.sql.gz" -d +diff "${HOST_DIR}/local/s3.t.000000000.sql" "${HOST_DIR}/compress/s3.t.000000000.sql" run_sql "drop database if exists \`$DB_NAME\`;" diff --git a/errors.toml b/errors.toml index c1c62e3d89c88..5043c913d0147 100755 --- a/errors.toml +++ b/errors.toml @@ -171,11 +171,21 @@ error = ''' task not found ''' +["BR:Restore:ErrDatabasesAlreadyExisted"] +error = ''' +databases already existed in restored cluster +''' + ["BR:Restore:ErrRestoreChecksumMismatch"] error = ''' restore checksum mismatch ''' +["BR:Restore:ErrRestoreIncompatibleSys"] +error = ''' +incompatible system table +''' + ["BR:Restore:ErrRestoreInvalidBackup"] error = ''' invalid backup @@ -201,6 +211,11 @@ error = ''' region does not have peer ''' +["BR:Restore:ErrRestoreNotFreshCluster"] +error = ''' +cluster is not fresh +''' + ["BR:Restore:ErrRestoreRangeMismatch"] error = ''' restore range mismatch @@ -561,6 +576,11 @@ error = ''' Failed to read auto-random value from storage engine ''' +["ddl:0"] +error = ''' +TiFlash mode will take effect after at least one TiFlash replica is set for the table +''' + ["ddl:1025"] error = ''' Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s) diff --git a/executor/BUILD.bazel b/executor/BUILD.bazel index 6b5590f9429a0..10ce00aa7e940 100644 --- a/executor/BUILD.bazel +++ b/executor/BUILD.bazel @@ -120,6 +120,7 @@ go_library( "//parser/model", "//parser/mysql", "//parser/terror", + "//parser/types", "//planner", "//planner/core", "//planner/util", @@ -215,6 +216,7 @@ go_library( "@com_github_tikv_client_go_v2//oracle", "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_client_go_v2//tikvrpc", + "@com_github_tikv_client_go_v2//txnkv", "@com_github_tikv_client_go_v2//txnkv/txnlock", "@com_github_tikv_client_go_v2//txnkv/txnsnapshot", "@com_github_tikv_client_go_v2//util", @@ -328,6 +330,7 @@ go_test( "//config", "//ddl", "//ddl/placement", + "//ddl/schematracker", "//ddl/testutil", "//ddl/util", "//distsql", @@ -341,6 +344,7 @@ go_test( "//kv", "//meta", "//meta/autoid", + "//metrics", "//parser", "//parser/ast", "//parser/auth", @@ -395,6 +399,7 @@ go_test( "//util/mathutil", "//util/memory", "//util/mock", + "//util/paging", "//util/pdapi", "//util/plancodec", "//util/ranger", @@ -417,6 +422,8 @@ go_test( "@com_github_pingcap_sysutil//:sysutil", "@com_github_pingcap_tipb//go-binlog", "@com_github_pingcap_tipb//go-tipb", + "@com_github_prometheus_client_golang//prometheus", + "@com_github_prometheus_client_model//go", "@com_github_prometheus_common//model", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", diff --git a/executor/adapter.go b/executor/adapter.go index b1a759cc1be27..6083cd05f9f1c 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -332,6 +332,7 @@ func (a *ExecStmt) RebuildPlan(ctx context.Context) (int64, error) { } a.OutputNames = names a.Plan = p + a.Ctx.GetSessionVars().StmtCtx.SetPlan(p) return a.InfoSchema.SchemaMetaVersion(), nil } @@ -469,7 +470,7 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { return a.handlePessimisticSelectForUpdate(ctx, e) } - if handled, result, err := a.handleNoDelay(ctx, e, isPessimistic); handled { + if handled, result, err := a.handleNoDelay(ctx, e, isPessimistic); handled || err != nil { return result, err } @@ -847,6 +848,7 @@ func (a *ExecStmt) buildExecutor() (Executor, error) { a.OutputNames = executorExec.outputNames a.isPreparedStmt = true a.Plan = executorExec.plan + a.Ctx.GetSessionVars().StmtCtx.SetPlan(executorExec.plan) if executorExec.lowerPriority { ctx.GetSessionVars().StmtCtx.Priority = kv.PriorityLow } @@ -926,6 +928,11 @@ func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, err error, hasMoreResults boo a.Ctx.GetTxnWriteThroughputSLI().AddReadKeys(execDetail.ScanDetail.ProcessedKeys) } succ := err == nil + if a.Plan != nil { + // If this statement has a Plan, the StmtCtx.plan should have been set when it comes here, + // but we set it again in case we missed some code paths. + sessVars.StmtCtx.SetPlan(a.Plan) + } // `LowSlowQuery` and `SummaryStmt` must be called before recording `PrevStmt`. a.LogSlowQuery(txnTS, succ, hasMoreResults) a.SummaryStmt(succ) @@ -973,6 +980,7 @@ func (a *ExecStmt) CloseRecordSet(txnStartTS uint64, lastErr error) { // LogSlowQuery is used to print the slow query in the log files. func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { sessVars := a.Ctx.GetSessionVars() + stmtCtx := sessVars.StmtCtx level := log.GetLevel() cfg := config.GetGlobalConfig() costTime := time.Since(sessVars.StartTime) + sessVars.DurationParse @@ -984,15 +992,15 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { return } sql := FormatSQL(a.GetTextToLog()) - _, digest := sessVars.StmtCtx.SQLDigest() + _, digest := stmtCtx.SQLDigest() var indexNames string - if len(sessVars.StmtCtx.IndexNames) > 0 { + if len(stmtCtx.IndexNames) > 0 { // remove duplicate index. idxMap := make(map[string]struct{}) buf := bytes.NewBuffer(make([]byte, 0, 4)) buf.WriteByte('[') - for _, idx := range sessVars.StmtCtx.IndexNames { + for _, idx := range stmtCtx.IndexNames { _, ok := idxMap[idx] if ok { continue @@ -1006,6 +1014,7 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { buf.WriteByte(']') indexNames = buf.String() } + flat := getFlatPlan(stmtCtx) var stmtDetail execdetails.StmtExecDetails stmtDetailRaw := a.GoCtx.Value(execdetails.StmtExecDetailKey) if stmtDetailRaw != nil { @@ -1016,12 +1025,21 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { if tikvExecDetailRaw != nil { tikvExecDetail = *(tikvExecDetailRaw.(*util.ExecDetails)) } - execDetail := sessVars.StmtCtx.GetExecDetails() - copTaskInfo := sessVars.StmtCtx.CopTasksDetails() - statsInfos := plannercore.GetStatsInfo(a.Plan) - memMax := sessVars.StmtCtx.MemTracker.MaxConsumed() - diskMax := sessVars.StmtCtx.DiskTracker.MaxConsumed() - _, planDigest := getPlanDigest(sessVars.StmtCtx, a.Plan) + execDetail := stmtCtx.GetExecDetails() + copTaskInfo := stmtCtx.CopTasksDetails() + statsInfos := plannercore.GetStatsInfoFromFlatPlan(flat) + memMax := stmtCtx.MemTracker.MaxConsumed() + diskMax := stmtCtx.DiskTracker.MaxConsumed() + _, planDigest := getPlanDigest(stmtCtx) + + binaryPlan := "" + if variable.GenerateBinaryPlan.Load() { + binaryPlan = getBinaryPlan(a.Ctx) + binaryPlan = variable.SlowLogBinaryPlanPrefix + binaryPlan + variable.SlowLogPlanSuffix + } + + resultRows := GetResultRowsCount(stmtCtx, a.Plan) + slowItems := &variable.SlowQueryLogItems{ TxnTS: txnTS, SQL: sql.String(), @@ -1038,8 +1056,9 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { MemMax: memMax, DiskMax: diskMax, Succ: succ, - Plan: getPlanTree(a.Ctx, a.Plan), + Plan: getPlanTree(stmtCtx), PlanDigest: planDigest.String(), + BinaryPlan: binaryPlan, Prepared: a.isPreparedStmt, HasMoreResults: hasMoreResults, PlanFromCache: sessVars.FoundInPlanCache, @@ -1049,10 +1068,10 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { PDTotal: time.Duration(atomic.LoadInt64(&tikvExecDetail.WaitPDRespDuration)), BackoffTotal: time.Duration(atomic.LoadInt64(&tikvExecDetail.BackoffDuration)), WriteSQLRespTotal: stmtDetail.WriteSQLRespDuration, - ResultRows: GetResultRowsCount(a.Ctx, a.Plan), + ResultRows: resultRows, ExecRetryCount: a.retryCount, IsExplicitTxn: sessVars.TxnCtx.IsExplicit, - IsWriteCacheTable: sessVars.StmtCtx.WaitLockLeaseTime > 0, + IsWriteCacheTable: stmtCtx.WaitLockLeaseTime > 0, } if a.retryCount > 0 { slowItems.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) @@ -1080,15 +1099,15 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { userString = sessVars.User.String() } var tableIDs string - if len(sessVars.StmtCtx.TableIDs) > 0 { - tableIDs = strings.Replace(fmt.Sprintf("%v", sessVars.StmtCtx.TableIDs), " ", ",", -1) + if len(stmtCtx.TableIDs) > 0 { + tableIDs = strings.Replace(fmt.Sprintf("%v", stmtCtx.TableIDs), " ", ",", -1) } domain.GetDomain(a.Ctx).LogSlowQuery(&domain.SlowQueryInfo{ SQL: sql.String(), Digest: digest.String(), Start: sessVars.StartTime, Duration: costTime, - Detail: sessVars.StmtCtx.GetExecDetails(), + Detail: stmtCtx.GetExecDetails(), Succ: succ, ConnID: sessVars.ConnectionID, TxnTS: txnTS, @@ -1102,8 +1121,8 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { } // GetResultRowsCount gets the count of the statement result rows. -func GetResultRowsCount(sctx sessionctx.Context, p plannercore.Plan) int64 { - runtimeStatsColl := sctx.GetSessionVars().StmtCtx.RuntimeStatsColl +func GetResultRowsCount(stmtCtx *stmtctx.StatementContext, p plannercore.Plan) int64 { + runtimeStatsColl := stmtCtx.RuntimeStatsColl if runtimeStatsColl == nil { return 0 } @@ -1115,13 +1134,45 @@ func GetResultRowsCount(sctx sessionctx.Context, p plannercore.Plan) int64 { return rootStats.GetActRows() } +// getFlatPlan generates a FlatPhysicalPlan from the plan stored in stmtCtx.plan, +// then stores it in stmtCtx.flatPlan. +func getFlatPlan(stmtCtx *stmtctx.StatementContext) *plannercore.FlatPhysicalPlan { + pp := stmtCtx.GetPlan() + if pp == nil { + return nil + } + if flat := stmtCtx.GetFlatPlan(); flat != nil { + f := flat.(*plannercore.FlatPhysicalPlan) + return f + } + p := pp.(plannercore.Plan) + flat := plannercore.FlattenPhysicalPlan(p, false) + if flat != nil { + stmtCtx.SetFlatPlan(flat) + return flat + } + return nil +} + +func getBinaryPlan(sCtx sessionctx.Context) string { + stmtCtx := sCtx.GetSessionVars().StmtCtx + binaryPlan := stmtCtx.GetBinaryPlan() + if len(binaryPlan) > 0 { + return binaryPlan + } + flat := getFlatPlan(stmtCtx) + binaryPlan = plannercore.BinaryPlanStrFromFlatPlan(sCtx, flat) + stmtCtx.SetBinaryPlan(binaryPlan) + return binaryPlan +} + // getPlanTree will try to get the select plan tree if the plan is select or the select plan of delete/update/insert statement. -func getPlanTree(sctx sessionctx.Context, p plannercore.Plan) string { +func getPlanTree(stmtCtx *stmtctx.StatementContext) string { cfg := config.GetGlobalConfig() if atomic.LoadUint32(&cfg.Instance.RecordPlanInSlowLog) == 0 { return "" } - planTree, _ := getEncodedPlan(sctx, p, false) + planTree, _ := getEncodedPlan(stmtCtx, false) if len(planTree) == 0 { return planTree } @@ -1129,31 +1180,33 @@ func getPlanTree(sctx sessionctx.Context, p plannercore.Plan) string { } // getPlanDigest will try to get the select plan tree if the plan is select or the select plan of delete/update/insert statement. -func getPlanDigest(sc *stmtctx.StatementContext, p plannercore.Plan) (string, *parser.Digest) { - normalized, planDigest := sc.GetPlanDigest() +func getPlanDigest(stmtCtx *stmtctx.StatementContext) (string, *parser.Digest) { + normalized, planDigest := stmtCtx.GetPlanDigest() if len(normalized) > 0 && planDigest != nil { return normalized, planDigest } - normalized, planDigest = plannercore.NormalizePlan(p) - sc.SetPlanDigest(normalized, planDigest) + flat := getFlatPlan(stmtCtx) + normalized, planDigest = plannercore.NormalizeFlatPlan(flat) + stmtCtx.SetPlanDigest(normalized, planDigest) return normalized, planDigest } // getEncodedPlan gets the encoded plan, and generates the hint string if indicated. -func getEncodedPlan(sctx sessionctx.Context, p plannercore.Plan, genHint bool) (encodedPlan, hintStr string) { +func getEncodedPlan(stmtCtx *stmtctx.StatementContext, genHint bool) (encodedPlan, hintStr string) { var hintSet bool - encodedPlan = sctx.GetSessionVars().StmtCtx.GetEncodedPlan() - hintStr, hintSet = sctx.GetSessionVars().StmtCtx.GetPlanHint() + encodedPlan = stmtCtx.GetEncodedPlan() + hintStr, hintSet = stmtCtx.GetPlanHint() if len(encodedPlan) > 0 && (!genHint || hintSet) { return } + flat := getFlatPlan(stmtCtx) if len(encodedPlan) == 0 { - encodedPlan = plannercore.EncodePlan(p) - sctx.GetSessionVars().StmtCtx.SetEncodedPlan(encodedPlan) + encodedPlan = plannercore.EncodeFlatPlan(flat) + stmtCtx.SetEncodedPlan(encodedPlan) } if genHint { - hints := plannercore.GenHintsFromPhysicalPlan(p) - for _, tableHint := range sctx.GetSessionVars().StmtCtx.OriginalTableHints { + hints := plannercore.GenHintsFromFlatPlan(flat) + for _, tableHint := range stmtCtx.OriginalTableHints { // 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 { @@ -1165,7 +1218,7 @@ func getEncodedPlan(sctx sessionctx.Context, p plannercore.Plan, genHint bool) ( } hintStr = hint.RestoreOptimizerHints(hints) - sctx.GetSessionVars().StmtCtx.SetPlanHint(hintStr) + stmtCtx.SetPlanHint(hintStr) } return } @@ -1209,7 +1262,14 @@ func (a *ExecStmt) SummaryStmt(succ bool) { // No need to encode every time, so encode lazily. planGenerator := func() (string, string) { - return getEncodedPlan(a.Ctx, a.Plan, !sessVars.InRestrictedSQL) + return getEncodedPlan(stmtCtx, !sessVars.InRestrictedSQL) + } + var binPlanGen func() string + if variable.GenerateBinaryPlan.Load() { + binPlanGen = func() string { + binPlan := getBinaryPlan(a.Ctx) + return binPlan + } } // Generating plan digest is slow, only generate it once if it's 'Point_Get'. // If it's a point get, different SQLs leads to different plans, so SQL digest @@ -1218,11 +1278,11 @@ func (a *ExecStmt) SummaryStmt(succ bool) { var planDigestGen func() string if a.Plan.TP() == plancodec.TypePointGet { planDigestGen = func() string { - _, planDigest := getPlanDigest(stmtCtx, a.Plan) + _, planDigest := getPlanDigest(stmtCtx) return planDigest.String() } } else { - _, tmp := getPlanDigest(stmtCtx, a.Plan) + _, tmp := getPlanDigest(stmtCtx) planDigest = tmp.String() } @@ -1250,37 +1310,41 @@ func (a *ExecStmt) SummaryStmt(succ bool) { execDetail.BackoffTime += stmtCtx.WaitLockLeaseTime execDetail.TimeDetail.WaitTime += stmtCtx.WaitLockLeaseTime } + + resultRows := GetResultRowsCount(stmtCtx, a.Plan) + stmtExecInfo := &stmtsummary.StmtExecInfo{ - SchemaName: strings.ToLower(sessVars.CurrentDB), - OriginalSQL: sql, - Charset: charset, - Collation: collation, - NormalizedSQL: normalizedSQL, - Digest: digest.String(), - PrevSQL: prevSQL, - PrevSQLDigest: prevSQLDigest, - PlanGenerator: planGenerator, - PlanDigest: planDigest, - PlanDigestGen: planDigestGen, - User: userString, - TotalLatency: costTime, - ParseLatency: sessVars.DurationParse, - CompileLatency: sessVars.DurationCompile, - StmtCtx: stmtCtx, - CopTasks: copTaskInfo, - ExecDetail: &execDetail, - MemMax: memMax, - DiskMax: diskMax, - StartTime: sessVars.StartTime, - IsInternal: sessVars.InRestrictedSQL, - Succeed: succ, - PlanInCache: sessVars.FoundInPlanCache, - PlanInBinding: sessVars.FoundInBinding, - ExecRetryCount: a.retryCount, - StmtExecDetails: stmtDetail, - ResultRows: GetResultRowsCount(a.Ctx, a.Plan), - TiKVExecDetails: tikvExecDetail, - Prepared: a.isPreparedStmt, + SchemaName: strings.ToLower(sessVars.CurrentDB), + OriginalSQL: sql, + Charset: charset, + Collation: collation, + NormalizedSQL: normalizedSQL, + Digest: digest.String(), + PrevSQL: prevSQL, + PrevSQLDigest: prevSQLDigest, + PlanGenerator: planGenerator, + BinaryPlanGenerator: binPlanGen, + PlanDigest: planDigest, + PlanDigestGen: planDigestGen, + User: userString, + TotalLatency: costTime, + ParseLatency: sessVars.DurationParse, + CompileLatency: sessVars.DurationCompile, + StmtCtx: stmtCtx, + CopTasks: copTaskInfo, + ExecDetail: &execDetail, + MemMax: memMax, + DiskMax: diskMax, + StartTime: sessVars.StartTime, + IsInternal: sessVars.InRestrictedSQL, + Succeed: succ, + PlanInCache: sessVars.FoundInPlanCache, + PlanInBinding: sessVars.FoundInBinding, + ExecRetryCount: a.retryCount, + StmtExecDetails: stmtDetail, + ResultRows: resultRows, + TiKVExecDetails: tikvExecDetail, + Prepared: a.isPreparedStmt, } if a.retryCount > 0 { stmtExecInfo.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) @@ -1306,7 +1370,7 @@ func (a *ExecStmt) observeStmtBeginForTopSQL(ctx context.Context) context.Contex vars := a.Ctx.GetSessionVars() sc := vars.StmtCtx normalizedSQL, sqlDigest := sc.SQLDigest() - normalizedPlan, planDigest := getPlanDigest(sc, a.Plan) + normalizedPlan, planDigest := getPlanDigest(sc) var sqlDigestByte, planDigestByte []byte if sqlDigest != nil { sqlDigestByte = sqlDigest.Bytes() diff --git a/executor/analyze_col.go b/executor/analyze_col.go index 1cd6a55c55b39..f27e6c5221da8 100644 --- a/executor/analyze_col.go +++ b/executor/analyze_col.go @@ -17,6 +17,7 @@ package executor import ( "context" "fmt" + "math" "strings" "sync/atomic" "time" @@ -107,11 +108,15 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe var builder distsql.RequestBuilder reqBuilder := builder.SetHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.TableID.GetStatisticsID()}, e.handleCols != nil && !e.handleCols.IsInt(), ranges, nil) builder.SetResourceGroupTagger(e.ctx.GetSessionVars().StmtCtx.GetResourceGroupTagger()) + startTS := uint64(math.MaxUint64) + if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { + startTS = e.snapshot + } // Always set KeepOrder of the request to be true, in order to compute // correct `correlation` of columns. kvReq, err := reqBuilder. SetAnalyzeRequest(e.analyzePB). - SetStartTS(e.snapshot). + SetStartTS(startTS). SetKeepOrder(true). SetConcurrency(e.concurrency). SetMemTracker(e.memTracker). @@ -257,7 +262,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) + 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) topNs = append(topNs, topn) } if err != nil { diff --git a/executor/analyze_col_v2.go b/executor/analyze_col_v2.go index 88b94e8ff1b16..68a02485c0048 100644 --- a/executor/analyze_col_v2.go +++ b/executor/analyze_col_v2.go @@ -126,7 +126,7 @@ func (e *AnalyzeColumnsExecV2) analyzeColumnsPushDownV2() *statistics.AnalyzeRes defer wg.Wait() count, hists, topns, fmSketches, extStats, err := e.buildSamplingStats(ranges, collExtStats, specialIndexesOffsets, idxNDVPushDownCh) if err != nil { - e.memTracker.Consume(-e.memTracker.BytesConsumed()) + e.memTracker.Release(e.memTracker.BytesConsumed()) return &statistics.AnalyzeResults{Err: err, Job: e.job} } cLen := len(e.analyzePB.ColReq.ColumnsInfo) @@ -258,6 +258,7 @@ func (e *AnalyzeColumnsExecV2) buildSamplingStats( rootRowCollector.MergeCollector(mergeResult.collector) e.memTracker.Consume(rootRowCollector.Base().MemSize - oldRootCollectorSize - mergeResult.collector.Base().MemSize) } + defer e.memTracker.Release(rootRowCollector.Base().MemSize) if err != nil { return 0, nil, nil, nil, nil, err } @@ -368,6 +369,15 @@ func (e *AnalyzeColumnsExecV2) buildSamplingStats( continue } } + defer func() { + totalSampleCollectorSize := int64(0) + for _, sampleCollector := range sampleCollectors { + if sampleCollector != nil { + totalSampleCollectorSize += sampleCollector.MemSize + } + } + e.memTracker.Release(totalSampleCollectorSize) + }() if err != nil { return 0, nil, nil, nil, nil, err } @@ -379,13 +389,6 @@ func (e *AnalyzeColumnsExecV2) buildSamplingStats( return 0, nil, nil, nil, nil, err } } - totalSampleCollectorSize := int64(0) - for _, sampleCollector := range sampleCollectors { - if sampleCollector != nil { - totalSampleCollectorSize += sampleCollector.MemSize - } - } - e.memTracker.Consume(-rootRowCollector.Base().MemSize - totalSampleCollectorSize) return } @@ -589,7 +592,8 @@ func (e *AnalyzeColumnsExecV2) subMergeWorker(resultCh chan<- *samplingMergeResu retCollector.MergeCollector(subCollector) newRetCollectorSize := retCollector.Base().MemSize subCollectorSize := subCollector.Base().MemSize - e.memTracker.Consume(newRetCollectorSize - dataSize - colRespSize - oldRetCollectorSize - subCollectorSize) + e.memTracker.Consume(newRetCollectorSize - oldRetCollectorSize - subCollectorSize) + e.memTracker.Release(dataSize + colRespSize) } resultCh <- &samplingMergeResult{collector: retCollector} } @@ -606,6 +610,10 @@ func (e *AnalyzeColumnsExecV2) subBuildWorker(resultCh chan error, taskCh chan * panic("failpoint triggered") }) colLen := len(e.colsInfo) + bufferedMemSize := int64(0) + bufferedReleaseSize := int64(0) + defer e.memTracker.Consume(bufferedMemSize) + defer e.memTracker.Release(bufferedReleaseSize) workLoop: for { select { @@ -625,7 +633,6 @@ workLoop: // consume mandatory memory at the beginning, including empty SampleItems of all sample rows, if exceeds, fast fail collectorMemSize := int64(sampleNum) * (8 + statistics.EmptySampleItemSize) e.memTracker.Consume(collectorMemSize) - bufferedMemSize := int64(0) var collator collate.Collator ft := e.colsInfo[task.slicePos].FieldType // When it's new collation data, we need to use its collate key instead of original value because only @@ -653,8 +660,11 @@ workLoop: Value: val, Ordinal: j, }) + // tmp memory usage + deltaSize := val.MemUsage() + 4 // content of SampleItem is copied + e.memTracker.BufferedConsume(&bufferedMemSize, deltaSize) + e.memTracker.BufferedRelease(&bufferedReleaseSize, deltaSize) } - e.memTracker.Consume(bufferedMemSize) collector = &statistics.SampleCollector{ Samples: sampleItems, NullCount: task.rootRowCollector.Base().NullCount[task.slicePos], @@ -703,6 +713,10 @@ workLoop: sampleItems = append(sampleItems, &statistics.SampleItem{ Value: types.NewBytesDatum(b), }) + // tmp memory usage + deltaSize := sampleItems[len(sampleItems)-1].Value.MemUsage() + e.memTracker.BufferedConsume(&bufferedMemSize, deltaSize) + e.memTracker.BufferedRelease(&bufferedReleaseSize, deltaSize) } collector = &statistics.SampleCollector{ Samples: sampleItems, @@ -718,10 +732,10 @@ workLoop: } releaseCollectorMemory := func() { if !task.isColumn { - e.memTracker.Consume(-collector.MemSize) + 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) + 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) if err != nil { resultCh <- err releaseCollectorMemory() diff --git a/executor/analyze_fast.go b/executor/analyze_fast.go index 8af6486ba2ca1..5917a5b336ae0 100644 --- a/executor/analyze_fast.go +++ b/executor/analyze_fast.go @@ -191,7 +191,11 @@ func (e *AnalyzeFastExec) activateTxnForRowCount() (rollbackFn func() error, err } } txn.SetOption(kv.Priority, kv.PriorityLow) - txn.SetOption(kv.IsolationLevel, kv.SI) + isoLevel := kv.RC + if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { + isoLevel = kv.SI + } + txn.SetOption(kv.IsolationLevel, isoLevel) txn.SetOption(kv.NotFillCache, true) return rollbackFn, nil } @@ -389,8 +393,13 @@ func (e *AnalyzeFastExec) handleScanIter(iter kv.Iterator) (scanKeysSize int, er } func (e *AnalyzeFastExec) handleScanTasks(bo *tikv.Backoffer) (keysSize int, err error) { - snapshot := e.ctx.GetStore().GetSnapshot(kv.NewVersion(e.snapshot)) - snapshot.SetOption(kv.IsolationLevel, kv.SI) + var snapshot kv.Snapshot + if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { + snapshot = e.ctx.GetStore().GetSnapshot(kv.NewVersion(e.snapshot)) + snapshot.SetOption(kv.IsolationLevel, kv.SI) + } else { + snapshot = e.ctx.GetStore().GetSnapshot(kv.MaxVersion) + } if e.ctx.GetSessionVars().GetReplicaRead().IsFollowerRead() { snapshot.SetOption(kv.ReplicaRead, kv.ReplicaReadFollower) } @@ -411,9 +420,15 @@ func (e *AnalyzeFastExec) handleScanTasks(bo *tikv.Backoffer) (keysSize int, err func (e *AnalyzeFastExec) handleSampTasks(workID int, step uint32, err *error) { defer e.wg.Done() - snapshot := e.ctx.GetStore().GetSnapshot(kv.NewVersion(e.snapshot)) + var snapshot kv.Snapshot + if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { + snapshot = e.ctx.GetStore().GetSnapshot(kv.NewVersion(e.snapshot)) + snapshot.SetOption(kv.IsolationLevel, kv.SI) + } else { + snapshot = e.ctx.GetStore().GetSnapshot(kv.MaxVersion) + snapshot.SetOption(kv.IsolationLevel, kv.RC) + } snapshot.SetOption(kv.NotFillCache, true) - snapshot.SetOption(kv.IsolationLevel, kv.SI) snapshot.SetOption(kv.Priority, kv.PriorityLow) setOptionForTopSQL(e.ctx.GetSessionVars().StmtCtx, snapshot) readReplicaType := e.ctx.GetSessionVars().GetReplicaRead() diff --git a/executor/analyze_idx.go b/executor/analyze_idx.go index 12a47da479481..5726f0846f3fa 100644 --- a/executor/analyze_idx.go +++ b/executor/analyze_idx.go @@ -16,6 +16,7 @@ package executor import ( "context" + "math" "sync/atomic" "time" @@ -142,9 +143,13 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang kvReqBuilder = builder.SetIndexRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.tableID.GetStatisticsID()}, e.idxInfo.ID, ranges) } kvReqBuilder.SetResourceGroupTagger(e.ctx.GetSessionVars().StmtCtx.GetResourceGroupTagger()) + startTS := uint64(math.MaxUint64) + if e.ctx.GetSessionVars().EnableAnalyzeSnapshot { + startTS = e.snapshot + } kvReq, err := kvReqBuilder. SetAnalyzeRequest(e.analyzePB). - SetStartTS(e.snapshot). + SetStartTS(startTS). SetKeepOrder(true). SetConcurrency(e.concurrency). Build() diff --git a/executor/analyze_test.go b/executor/analyze_test.go index 055591b8a9a7c..1b056752c2af7 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -16,6 +16,8 @@ package executor_test import ( "fmt" + "io/ioutil" + "strings" "sync/atomic" "testing" @@ -316,3 +318,23 @@ func TestAnalyzeIndexExtractTopN(t *testing.T) { require.True(t, idx.TopN.Equal(topn)) } } + +func TestAnalyzePartitionTableForFloat(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t1 ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, num float(9,8) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY HASH (id) PARTITIONS 128;") + // To reproduce the error we meet in https://github.com/pingcap/tidb/issues/35910, we should use the data provided in this issue + b, err := ioutil.ReadFile("testdata/analyze_test_data.sql") + require.NoError(t, err) + sqls := strings.Split(string(b), ";") + for _, sql := range sqls { + if len(sql) < 1 { + continue + } + tk.MustExec(sql) + } + tk.MustExec("analyze table t1") +} diff --git a/executor/analyzetest/analyze_test.go b/executor/analyzetest/analyze_test.go index 5a12296d0643a..8b9f9b593394b 100644 --- a/executor/analyzetest/analyze_test.go +++ b/executor/analyzetest/analyze_test.go @@ -85,10 +85,10 @@ PARTITION BY RANGE ( a ) ( require.Len(t, statsTbl.Columns, 3) require.Len(t, statsTbl.Indices, 1) for _, col := range statsTbl.Columns { - require.Greater(t, col.Len()+col.Num(), 0) + require.Greater(t, col.Len()+col.TopN.Num(), 0) } for _, idx := range statsTbl.Indices { - require.Greater(t, idx.Len()+idx.Num(), 0) + require.Greater(t, idx.Len()+idx.TopN.Num(), 0) } } @@ -583,53 +583,67 @@ func TestAnalyzeFullSamplingOnIndexWithVirtualColumnOrPrefixColumn(t *testing.T) tk.MustQuery("show stats_topn where table_name = 'sampling_index_prefix_col' and column_name = 'idx'").Check(testkit.Rows("test sampling_index_prefix_col idx 1 a 3")) } -func TestSnapshotAnalyze(t *testing.T) { - store, clean := testkit.CreateMockStore(t) - defer clean() - tk := testkit.NewTestKit(t, store) +func TestSnapshotAnalyzeAndMaxTSAnalyze(t *testing.T) { + for _, analyzeSnapshot := range []bool{true, false} { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, index index_a(a))") - is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) - tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - require.NoError(t, err) - tblInfo := tbl.Meta() - tid := tblInfo.ID - tk.MustExec("insert into t values(1),(1),(1)") - tk.MustExec("begin") - txn, err := tk.Session().Txn(false) - require.NoError(t, err) - startTS1 := txn.StartTS() - tk.MustExec("commit") - tk.MustExec("insert into t values(2),(2),(2)") - tk.MustExec("begin") - txn, err = tk.Session().Txn(false) - require.NoError(t, err) - startTS2 := txn.StartTS() - tk.MustExec("commit") - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1))) - tk.MustExec("analyze table t") - rows := tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() - require.Len(t, rows, 1) - require.Equal(t, "3", rows[0][0]) - s1Str := rows[0][1].(string) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS2))) - tk.MustExec("analyze table t") - rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() - require.Len(t, rows, 1) - require.Equal(t, "6", rows[0][0]) - s2Str := rows[0][1].(string) - require.True(t, s1Str != s2Str) - tk.MustExec("set @@session.tidb_analyze_version = 2") - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1))) - tk.MustExec("analyze table t") - rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() - require.Len(t, rows, 1) - require.Equal(t, "6", rows[0][0]) - s3Str := rows[0][1].(string) - require.Equal(t, s2Str, s3Str) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot")) + tk.MustExec("use test") + if analyzeSnapshot { + tk.MustExec("set @@session.tidb_enable_analyze_snapshot = on") + } else { + tk.MustExec("set @@session.tidb_enable_analyze_snapshot = off") + } + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index index_a(a))") + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tbl.Meta() + tid := tblInfo.ID + tk.MustExec("insert into t values(1),(1),(1)") + tk.MustExec("begin") + txn, err := tk.Session().Txn(false) + require.NoError(t, err) + startTS1 := txn.StartTS() + tk.MustExec("commit") + tk.MustExec("insert into t values(2),(2),(2)") + tk.MustExec("begin") + txn, err = tk.Session().Txn(false) + require.NoError(t, err) + startTS2 := txn.StartTS() + tk.MustExec("commit") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1))) + tk.MustExec("analyze table t") + rows := tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() + require.Len(t, rows, 1) + if analyzeSnapshot { + // Analyze cannot see the second insert if it reads the snapshot. + require.Equal(t, "3", rows[0][0]) + } else { + // Analyze can see the second insert if it reads the latest data. + require.Equal(t, "6", rows[0][0]) + } + s1Str := rows[0][1].(string) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS2))) + tk.MustExec("analyze table t") + rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() + require.Len(t, rows, 1) + require.Equal(t, "6", rows[0][0]) + s2Str := rows[0][1].(string) + require.True(t, s1Str != s2Str) + tk.MustExec("set @@session.tidb_analyze_version = 2") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1))) + tk.MustExec("analyze table t") + rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() + require.Len(t, rows, 1) + require.Equal(t, "6", rows[0][0]) + s3Str := rows[0][1].(string) + // The third analyze doesn't write results into mysql.stats_xxx because its snapshot is smaller than the second analyze. + require.Equal(t, s2Str, s3Str) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot")) + } } func TestAdjustSampleRateNote(t *testing.T) { @@ -3091,3 +3105,65 @@ PARTITION BY RANGE ( a ) ( tbl := h.GetTableStats(tableInfo) require.Equal(t, int64(6), tbl.Columns[tableInfo.Columns[0].ID].Histogram.NDV) } + +func TestAutoAnalyzeAwareGlobalVariableChange(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustQuery("select @@global.tidb_enable_analyze_snapshot").Check(testkit.Rows("0")) + // We want to test that HandleAutoAnalyze is aware of setting @@global.tidb_enable_analyze_snapshot to 1 and reads data from snapshot. + tk.MustExec("set @@global.tidb_enable_analyze_snapshot = 1") + tk.MustExec("set @@global.tidb_analyze_version = 2") + tk.MustExec("create table t(a int)") + h := dom.StatsHandle() + require.NoError(t, h.HandleDDLEvent(<-h.DDLEventCh())) + tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tid := tbl.Meta().ID + tk.MustExec("insert into t values(1),(2),(3)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + err = h.Update(dom.InfoSchema()) + require.NoError(t, err) + tk.MustExec("analyze table t") + tk.MustQuery(fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tid)).Check(testkit.Rows( + "3 0", + )) + + originalVal1 := handle.AutoAnalyzeMinCnt + originalVal2 := tk.MustQuery("select @@global.tidb_auto_analyze_ratio").Rows()[0][0].(string) + handle.AutoAnalyzeMinCnt = 0 + tk.MustExec("set global tidb_auto_analyze_ratio = 0.001") + defer func() { + handle.AutoAnalyzeMinCnt = originalVal1 + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_ratio = %v", originalVal2)) + }() + + tk.MustExec("begin") + txn, err := tk.Session().Txn(false) + require.NoError(t, err) + startTS := txn.StartTS() + tk.MustExec("commit") + + tk.MustExec("insert into t values(4),(5),(6)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + err = h.Update(dom.InfoSchema()) + require.NoError(t, err) + + // Simulate that the analyze would start before and finish after the second insert. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS))) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectBaseCount", "return(3)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectBaseModifyCount", "return(0)")) + require.True(t, h.HandleAutoAnalyze(dom.InfoSchema())) + // 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", + )) + // Check the histogram is correct for the snapshot analyze. + tk.MustQuery(fmt.Sprintf("select distinct_count from mysql.stats_histograms where table_id = %d", tid)).Check(testkit.Rows( + "3", + )) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseCount")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseModifyCount")) +} diff --git a/executor/brie.go b/executor/brie.go index 6dd1d9053a4ac..690497da83b54 100644 --- a/executor/brie.go +++ b/executor/brie.go @@ -448,7 +448,12 @@ type tidbGlueSession struct { info *brieTaskInfo } -// BootstrapSession implements glue.Glue +// GetSessionCtx implements glue.Glue +func (gs *tidbGlueSession) GetSessionCtx() sessionctx.Context { + return gs.se +} + +// GetDomain implements glue.Glue func (gs *tidbGlueSession) GetDomain(store kv.Storage) (*domain.Domain, error) { return domain.GetDomain(gs.se), nil } diff --git a/executor/builder.go b/executor/builder.go index 88b8223003eec..bdf055d95cf17 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -68,7 +68,9 @@ import ( "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/timeutil" "github.com/pingcap/tipb/go-tipb" + clientkv "github.com/tikv/client-go/v2/kv" "github.com/tikv/client-go/v2/tikv" + "github.com/tikv/client-go/v2/txnkv" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" "golang.org/x/exp/slices" ) @@ -3124,6 +3126,7 @@ func buildNoRangeTableReader(b *executorBuilder, v *plannercore.PhysicalTableRea txnScope: b.txnScope, readReplicaScope: b.readReplicaScope, isStaleness: b.isStaleness, + netDataSize: v.GetNetDataSize(), table: tbl, keepOrder: ts.KeepOrder, desc: ts.Desc, @@ -3189,7 +3192,7 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) E return nil } failpoint.Inject("checkUseMPP", func(val failpoint.Value) { - if val.(bool) != useMPPExecution(b.ctx, v) { + if !b.ctx.GetSessionVars().InRestrictedSQL && val.(bool) != useMPPExecution(b.ctx, v) { if val.(bool) { b.err = errors.New("expect mpp but not used") } else { @@ -3409,6 +3412,7 @@ func buildNoRangeIndexReader(b *executorBuilder, v *plannercore.PhysicalIndexRea txnScope: b.txnScope, readReplicaScope: b.readReplicaScope, isStaleness: b.isStaleness, + netDataSize: v.GetNetDataSize(), physicalTableID: physicalTableID, table: tbl, index: is.Index, @@ -3586,6 +3590,8 @@ func buildNoRangeIndexLookUpReader(b *executorBuilder, v *plannercore.PhysicalIn idxPlans: v.IndexPlans, tblPlans: v.TablePlans, PushedLimit: v.PushedLimit, + idxNetDataSize: v.GetAvgTableRowSize(), + avgRowSize: v.GetAvgTableRowSize(), } if containsLimit(indexReq.Executors) { @@ -3675,6 +3681,7 @@ func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLoo func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalIndexMergeReader) (*IndexMergeReaderExecutor, error) { partialPlanCount := len(v.PartialPlans) partialReqs := make([]*tipb.DAGRequest, 0, partialPlanCount) + partialDataSizes := make([]float64, 0, partialPlanCount) indexes := make([]*model.IndexInfo, 0, partialPlanCount) descs := make([]bool, 0, partialPlanCount) feedbacks := make([]*statistics.QueryFeedback, 0, partialPlanCount) @@ -3707,6 +3714,7 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd partialReqs = append(partialReqs, tempReq) isCorColInPartialFilters = append(isCorColInPartialFilters, b.corColInDistPlan(v.PartialPlans[i])) isCorColInPartialAccess = append(isCorColInPartialAccess, b.corColInAccess(v.PartialPlans[i][0])) + partialDataSizes = append(partialDataSizes, v.GetPartialReaderNetDataSize(v.PartialPlans[i][0])) } tableReq, tblInfo, err := buildTableReq(b, v.Schema().Len(), v.TablePlans) isCorColInTableFilter := b.corColInDistPlan(v.TablePlans) @@ -3735,6 +3743,8 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd columns: ts.Columns, partialPlans: v.PartialPlans, tblPlans: v.TablePlans, + partialNetDataSizes: partialDataSizes, + dataAvgRowSize: v.GetAvgTableRowSize(), dataReaderBuilder: readerBuilder, feedbacks: feedbacks, paging: paging, @@ -3885,6 +3895,12 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { e, err := buildNoRangeTableReader(builder.executorBuilder, v) + if !canReorderHandles { + // `canReorderHandles` is set to false only in IndexMergeJoin. IndexMergeJoin will trigger a dead loop problem + // when enabling paging(tidb/issues/35831). But IndexMergeJoin is not visible to the user and is deprecated + // for now. Thus, we disable paging here. + e.paging = false + } if err != nil { return nil, err } @@ -4054,6 +4070,27 @@ func (h kvRangeBuilderFromRangeAndPartition) buildKeyRange(ranges []*ranger.Rang return ret, nil } +// newClosestReadAdjuster let the request be sent to closest replica(within the same zone) +// if response size exceeds certain threshold. +func newClosestReadAdjuster(ctx sessionctx.Context, req *kv.Request, netDataSize float64) kv.CoprRequestAdjuster { + if req.ReplicaRead != kv.ReplicaReadClosestAdaptive { + return nil + } + return func(req *kv.Request, copTaskCount int) bool { + // copTaskCount is the number of coprocessor requests + if int64(netDataSize/float64(copTaskCount)) >= ctx.GetSessionVars().ReplicaClosestReadThreshold { + req.MatchStoreLabels = append(req.MatchStoreLabels, &metapb.StoreLabel{ + Key: placement.DCLabelKey, + Value: config.GetTxnScopeFromConfig(), + }) + return true + } + // reset to read from leader when the data size is small. + req.ReplicaRead = kv.ReplicaReadLeader + return false + } +} + func (builder *dataReaderBuilder) buildTableReaderBase(ctx context.Context, e *TableReaderExecutor, reqBuilderWithRange distsql.RequestBuilder) (*TableReaderExecutor, error) { startTS, err := builder.getSnapshotTS() if err != nil { @@ -4069,6 +4106,8 @@ func (builder *dataReaderBuilder) buildTableReaderBase(ctx context.Context, e *T SetIsStaleness(e.isStaleness). SetFromSessionVars(e.ctx.GetSessionVars()). SetFromInfoSchema(e.ctx.GetInfoSchema()). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &reqBuilderWithRange.Request, e.netDataSize)). + SetPaging(e.paging). Build() if err != nil { return nil, err @@ -4097,6 +4136,7 @@ func (builder *dataReaderBuilder) buildTableReaderFromHandles(ctx context.Contex b.SetTableHandles(getPhysicalTableID(e.table), handles) } } + return builder.buildTableReaderBase(ctx, e, b) } @@ -4624,6 +4664,9 @@ func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan b.err = err return nil } + if e.ctx.GetSessionVars().GetReplicaRead() == kv.ReplicaReadClosestAdaptive { + e.snapshot.SetOption(kv.ReplicaReadAdjuster, newReplicaReadAdjuster(e.ctx, plan.GetAvgRowSize())) + } if e.runtimeStats != nil { snapshotStats := &txnsnapshot.SnapshotRuntimeStats{} e.stats = &runtimeStatsWithSnapshot{ @@ -4711,6 +4754,21 @@ func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan return e } +func newReplicaReadAdjuster(ctx sessionctx.Context, avgRowSize float64) txnkv.ReplicaReadAdjuster { + return func(count int) (tikv.StoreSelectorOption, clientkv.ReplicaReadType) { + if int64(avgRowSize*float64(count)) >= ctx.GetSessionVars().ReplicaClosestReadThreshold { + return tikv.WithMatchLabels([]*metapb.StoreLabel{ + { + Key: placement.DCLabelKey, + Value: config.GetTxnScopeFromConfig(), + }, + }), clientkv.ReplicaReadMixed + } + // fallback to read from leader if the request is small + return nil, clientkv.ReplicaReadLeader + } +} + func isCommonHandleRead(tbl *model.TableInfo, idx *model.IndexInfo) bool { return tbl.IsCommonHandle && idx.Primary } @@ -4974,7 +5032,7 @@ func (b *executorBuilder) getCacheTable(tblInfo *model.TableInfo, startTS uint64 } func (b *executorBuilder) buildCompactTable(v *plannercore.CompactTable) Executor { - if v.ReplicaKind != ast.CompactReplicaKindTiFlash { + if v.ReplicaKind != ast.CompactReplicaKindTiFlash && v.ReplicaKind != ast.CompactReplicaKindAll { b.err = errors.Errorf("compact %v replica is not supported", strings.ToLower(string(v.ReplicaKind))) return nil } diff --git a/executor/compact_table_test.go b/executor/compact_table_test.go index f5e22b56b6e5d..18067084676d4 100644 --- a/executor/compact_table_test.go +++ b/executor/compact_table_test.go @@ -55,6 +55,22 @@ func withMockTiFlash(nodes int) mockstore.MockTiKVStoreOption { ) } +func TestCompactUnknownTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + err := tk.ExecToErr(`alter table test compact tiflash replica;`) + require.Equal(t, "[planner:1046]No database selected", err.Error()) + + err = tk.ExecToErr(`alter table test.foo compact tiflash replica;`) + require.Equal(t, "[schema:1146]Table 'test.foo' doesn't exist", err.Error()) + + tk.MustExec("use test") + err = tk.ExecToErr(`alter table bar compact;`) + require.Equal(t, "[schema:1146]Table 'test.bar' doesn't exist", err.Error()) +} + func TestCompactTableNoTiFlashReplica(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -66,6 +82,17 @@ func TestCompactTableNoTiFlashReplica(t *testing.T) { tk.MustQuery(`show warnings;`).Check(testkit.Rows( `Warning 1105 compact skipped: no tiflash replica in the table`, )) + + tk.MustExec(`alter table test.t compact;`) + tk.MustQuery(`show warnings;`).Check(testkit.Rows( + `Warning 1105 compact skipped: no tiflash replica in the table`, + )) + + tk = testkit.NewTestKit(t, store) + tk.MustExec(`alter table test.t compact;`) + tk.MustQuery(`show warnings;`).Check(testkit.Rows( + `Warning 1105 compact skipped: no tiflash replica in the table`, + )) } func TestCompactTableTooBusy(t *testing.T) { @@ -134,7 +161,6 @@ func TestCompactTableInternalError(t *testing.T) { // TestCompactTableNoRemaining: Returns NoRemaining for request #1. func TestCompactTableNoRemaining(t *testing.T) { mocker := newCompactRequestMocker(t) - defer mocker.RequireAllHandlersHit() store, do, clean := testkit.CreateMockStoreAndDomain(t, withMockTiFlash(1), mocker.AsOpt()) defer clean() tk := testkit.NewTestKit(t, store) @@ -150,12 +176,28 @@ func TestCompactTableNoRemaining(t *testing.T) { CompactedEndKey: []byte{0xFF}, }, nil }) - tk.MustExec("use test") tk.MustExec("create table t(a int)") tk.MustExec(`alter table t set tiflash replica 1;`) tk.MustExec(`alter table t compact tiflash replica;`) tk.MustQuery(`show warnings;`).Check(testkit.Rows()) + mocker.RequireAllHandlersHit() + + mocker.MockFrom(`tiflash0/#2`, func(req *kvrpcpb.CompactRequest) (*kvrpcpb.CompactResponse, error) { + tableID := do.MustGetTableID(t, "test", "t") + require.Empty(t, req.StartKey) + require.EqualValues(t, req.PhysicalTableId, tableID) + require.EqualValues(t, req.LogicalTableId, tableID) + return &kvrpcpb.CompactResponse{ + HasRemaining: false, + CompactedStartKey: []byte{}, + CompactedEndKey: []byte{0xFF}, + }, nil + }) + tk = testkit.NewTestKit(t, store) + tk.MustExec(`alter table test.t compact;`) + tk.MustQuery(`show warnings;`).Check(testkit.Rows()) + mocker.RequireAllHandlersHit() } // TestCompactTableHasRemaining: Returns HasRemaining=true for request #1 and #2, returns HasRemaining=false for request #3. diff --git a/executor/compiler.go b/executor/compiler.go index f4633c85f70c6..894e86e6b7ba8 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -31,16 +31,17 @@ import ( ) var ( - stmtNodeCounterUse = metrics.StmtNodeCounter.WithLabelValues("Use") - stmtNodeCounterShow = metrics.StmtNodeCounter.WithLabelValues("Show") - stmtNodeCounterBegin = metrics.StmtNodeCounter.WithLabelValues("Begin") - stmtNodeCounterCommit = metrics.StmtNodeCounter.WithLabelValues("Commit") - stmtNodeCounterRollback = metrics.StmtNodeCounter.WithLabelValues("Rollback") - stmtNodeCounterInsert = metrics.StmtNodeCounter.WithLabelValues("Insert") - stmtNodeCounterReplace = metrics.StmtNodeCounter.WithLabelValues("Replace") - stmtNodeCounterDelete = metrics.StmtNodeCounter.WithLabelValues("Delete") - stmtNodeCounterUpdate = metrics.StmtNodeCounter.WithLabelValues("Update") - stmtNodeCounterSelect = metrics.StmtNodeCounter.WithLabelValues("Select") + stmtNodeCounterUse = metrics.StmtNodeCounter.WithLabelValues("Use") + stmtNodeCounterShow = metrics.StmtNodeCounter.WithLabelValues("Show") + stmtNodeCounterBegin = metrics.StmtNodeCounter.WithLabelValues("Begin") + stmtNodeCounterCommit = metrics.StmtNodeCounter.WithLabelValues("Commit") + stmtNodeCounterRollback = metrics.StmtNodeCounter.WithLabelValues("Rollback") + stmtNodeCounterInsert = metrics.StmtNodeCounter.WithLabelValues("Insert") + stmtNodeCounterReplace = metrics.StmtNodeCounter.WithLabelValues("Replace") + stmtNodeCounterDelete = metrics.StmtNodeCounter.WithLabelValues("Delete") + stmtNodeCounterUpdate = metrics.StmtNodeCounter.WithLabelValues("Update") + stmtNodeCounterSelect = metrics.StmtNodeCounter.WithLabelValues("Select") + stmtNodeCounterSavepoint = metrics.StmtNodeCounter.WithLabelValues("Savepoint") ) // Compiler compiles an ast.StmtNode to a physical plan. @@ -90,6 +91,7 @@ func (c *Compiler) Compile(ctx context.Context, stmtNode ast.StmtNode) (*ExecStm if c.Ctx.GetSessionVars().StmtCtx.Priority == mysql.NoPriority { lowerPriority = needLowerPriority(finalPlan) } + c.Ctx.GetSessionVars().StmtCtx.SetPlan(finalPlan) return &ExecStmt{ GoCtx: ctx, InfoSchema: is, @@ -173,6 +175,8 @@ func CountStmtNode(stmtNode ast.StmtNode, inRestrictedSQL bool) { stmtNodeCounterUpdate.Inc() case "Select": stmtNodeCounterSelect.Inc() + case "Savepoint": + stmtNodeCounterSavepoint.Inc() default: metrics.StmtNodeCounter.WithLabelValues(typeLabel).Inc() } @@ -410,6 +414,8 @@ func GetStmtLabel(stmtNode ast.StmtNode) string { return "Trace" case *ast.ShutdownStmt: return "Shutdown" + case *ast.SavepointStmt: + return "Savepoint" } return "other" } diff --git a/executor/ddl_test.go b/executor/ddl_test.go index 5abca41820d1c..24da7f4397869 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -24,6 +24,7 @@ import ( "time" "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/ddl/schematracker" ddltestutil "github.com/pingcap/tidb/ddl/testutil" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" @@ -97,8 +98,13 @@ func TestInTxnExecDDLInvalid(t *testing.T) { } func TestCreateTable(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // Test create an exist database @@ -442,8 +448,12 @@ func TestCreateViewWithOverlongColName(t *testing.T) { } func TestCreateDropDatabase(t *testing.T) { - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + tk := testkit.NewTestKit(t, store) tk.MustExec("create database if not exists drop_test;") tk.MustExec("drop database if exists drop_test;") @@ -476,6 +486,9 @@ func TestCreateDropDatabase(t *testing.T) { )) tk.MustGetErrMsg("create database charset_test charset utf8 collate utf8mb4_unicode_ci;", "[ddl:1253]COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'utf8'") + // ddl.SchemaTracker will not respect session charset + ddlChecker.Disable() + tk.MustExec("SET SESSION character_set_server='ascii'") tk.MustExec("SET SESSION collation_server='ascii_bin'") @@ -485,6 +498,8 @@ func TestCreateDropDatabase(t *testing.T) { "charset_test|CREATE DATABASE `charset_test` /*!40100 DEFAULT CHARACTER SET ascii */", )) + ddlChecker.Enable() + tk.MustExec("drop database charset_test;") tk.MustExec("create database charset_test collate utf8mb4_general_ci;") tk.MustQuery("show create database charset_test;").Check(testkit.RowsWithSep("|", @@ -1484,8 +1499,13 @@ func TestRenameTable(t *testing.T) { defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange")) }() - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("drop database if exists rename1") @@ -1567,8 +1587,13 @@ func TestRenameMultiTables(t *testing.T) { defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange")) }() - store, clean := testkit.CreateMockStore(t) + store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() + + ddlChecker := schematracker.NewChecker(dom.DDL()) + dom.SetDDL(ddlChecker) + ddlChecker.CreateTestDB() + tk := testkit.NewTestKit(t, store) tk.MustExec("drop database if exists rename1") diff --git a/executor/distsql.go b/executor/distsql.go index a2b7919f68c6a..1e275d6a92bf5 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -174,6 +174,7 @@ type IndexReaderExecutor struct { txnScope string readReplicaScope string isStaleness bool + netDataSize float64 // result returns one or more distsql.PartialResult and each PartialResult is returned by one region. result distsql.SelectResult // columns are only required by union scan. @@ -314,7 +315,8 @@ func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) SetIsStaleness(e.isStaleness). SetFromSessionVars(e.ctx.GetSessionVars()). SetFromInfoSchema(e.ctx.GetInfoSchema()). - SetMemTracker(e.memTracker) + SetMemTracker(e.memTracker). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &builder.Request, e.netDataSize)) kvReq, err := builder.Build() if err != nil { e.feedback.Invalidate() @@ -345,6 +347,8 @@ type IndexLookUpExecutor struct { // columns are only required by union scan. columns []*model.ColumnInfo *dataReaderBuilder + idxNetDataSize float64 + avgRowSize float64 // fields about accessing partition tables partitionTableMode bool // if this executor is accessing a partition table @@ -589,6 +593,7 @@ func (e *IndexLookUpExecutor) startIndexWorker(ctx context.Context, workCh chan< SetIsStaleness(e.isStaleness). SetFromSessionVars(e.ctx.GetSessionVars()). SetFromInfoSchema(e.ctx.GetInfoSchema()). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &builder.Request, e.idxNetDataSize/float64(len(kvRanges)))). SetMemTracker(tracker) for partTblIdx, kvRange := range kvRanges { @@ -690,6 +695,7 @@ func (e *IndexLookUpExecutor) buildTableReader(ctx context.Context, task *lookup feedback: statistics.NewQueryFeedback(0, nil, 0, false), corColInFilter: e.corColInTblSide, plans: e.tblPlans, + netDataSize: e.avgRowSize * float64(len(task.handles)), } tableReaderExec.buildVirtualColumnInfo() tableReader, err := e.dataReaderBuilder.buildTableReaderFromHandles(ctx, tableReaderExec, task.handles, true) diff --git a/executor/distsql_test.go b/executor/distsql_test.go index 71156d890a9a9..1c0d55d3a5307 100644 --- a/executor/distsql_test.go +++ b/executor/distsql_test.go @@ -19,13 +19,16 @@ import ( "context" "fmt" "math/rand" + "regexp" "runtime/pprof" + "strconv" "strings" "testing" "time" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/store/mockstore" @@ -34,6 +37,9 @@ import ( "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/paging" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/testutils" ) @@ -418,3 +424,160 @@ func TestPartitionTableIndexJoinIndexLookUp(t *testing.T) { tk.MustQuery("select /*+ TIDB_INLJ(t1, t2) */ t1.* from t t1, t t2 use index(a) where t1.a=t2.b and " + cond).Sort().Check(result) } } + +func TestCoprocessorPagingSize(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t_paging (a int, b int, key(a), key(b))") + nRows := 512 + values := make([]string, 0, nRows) + for i := 0; i < nRows; i++ { + values = append(values, fmt.Sprintf("(%v, %v)", rand.Intn(nRows), rand.Intn(nRows))) + } + tk.MustExec(fmt.Sprintf("insert into t_paging values %v", strings.Join(values, ", "))) + tk.MustQuery("select @@tidb_min_paging_size").Check(testkit.Rows(strconv.FormatUint(paging.MinPagingSize, 10))) + + // When the min paging size is small, we need more RPC roundtrip! + // Check 'rpc_num' in the execution information + // + // mysql> explain analyze select * from t_paging; + // +--------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + // | id |task | execution info | + // +--------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + // | TableReader_5 |root | time:7.27ms, loops:2, cop_task: {num: 10, max: 1.57ms, min: 313.3µs, avg: 675.9µs, p95: 1.57ms, tot_proc: 2ms, rpc_num: 10, rpc_time: 6.69ms, copr_cache_hit_ratio: 0.00, distsql_concurrency: 15} | + // | └─TableFullScan_4 |cop[tikv] | tikv_task:{proc max:1.48ms, min:294µs, avg: 629µs, p80:1.21ms, p95:1.48ms, iters:0, tasks:10} | + // +--------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + // 2 rows in set (0.01 sec) + + getRPCNumFromExplain := func(rows [][]interface{}) (res uint64) { + re := regexp.MustCompile("rpc_num: ([0-9]+)") + for _, row := range rows { + buf := bytes.NewBufferString("") + _, _ = fmt.Fprintf(buf, "%s\n", row) + if matched := re.FindStringSubmatch(buf.String()); matched != nil { + require.Equal(t, len(matched), 2) + c, err := strconv.ParseUint(matched[1], 10, 64) + require.NoError(t, err) + return c + } + } + return res + } + + // This is required here because only the chunk encoding collect the execution information and contains 'rpc_num'. + tk.MustExec("set @@tidb_enable_chunk_rpc = on") + + tk.MustExec("set @@tidb_min_paging_size = 1") + rows := tk.MustQuery("explain analyze select * from t_paging").Rows() + rpcNum := getRPCNumFromExplain(rows) + require.Greater(t, rpcNum, uint64(2)) + + tk.MustExec("set @@tidb_min_paging_size = 1000") + rows = tk.MustQuery("explain analyze select * from t_paging").Rows() + rpcNum = getRPCNumFromExplain(rows) + require.Equal(t, rpcNum, uint64(1)) +} + +func TestAdaptiveClosestRead(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + // the avg row size is more accurate in check_rpc mode when unistre is used. + // See: https://github.com/pingcap/tidb/issues/31744#issuecomment-1016309883 + tk.MustExec("set @@tidb_enable_chunk_rpc = '1'") + + readCounter := func(counter prometheus.Counter) float64 { + var metric dto.Metric + require.Nil(t, counter.Write(&metric)) + return metric.Counter.GetValue() + } + + checkMetrics := func(q string, hit, miss int) { + beforeHit := readCounter(metrics.DistSQLCoprClosestReadCounter.WithLabelValues("hit")) + beforeMiss := readCounter(metrics.DistSQLCoprClosestReadCounter.WithLabelValues("miss")) + tk.MustQuery(q) + afterHit := readCounter(metrics.DistSQLCoprClosestReadCounter.WithLabelValues("hit")) + afterMiss := readCounter(metrics.DistSQLCoprClosestReadCounter.WithLabelValues("miss")) + require.Equal(t, hit, int(afterHit-beforeHit), "exec query '%s' check hit failed", q) + require.Equal(t, miss, int(afterMiss-beforeMiss), "exec query '%s' check miss failed", q) + } + + tk.MustExec("create table t(id int primary key, s varchar(8), p varchar(16));") + tk.MustExec("insert into t values (1, '00000001', '0000000000000001'), (2, '00000003', '0000000000000002'), (3, '00000011', '0000000000000003');") + tk.MustExec("analyze table t;") + + tk.MustExec("set @@tidb_partition_prune_mode ='static';") + tk.MustExec("set tidb_replica_read = 'closest-adaptive';") + tk.MustExec("set tidb_adaptive_closest_read_threshold = 25;") + + // table reader + // estimate cost is 19 + checkMetrics("select s from t where id >= 1 and id < 2;", 0, 1) + // estimate cost is 37 + checkMetrics("select * from t where id >= 1 and id < 2;", 1, 0) + tk.MustExec("set tidb_adaptive_closest_read_threshold = 50;") + checkMetrics("select * from t where id >= 1 and id < 2;", 0, 1) + // estimate cost is 74 + checkMetrics("select * from t where id >= 1 and id <= 2;", 1, 0) + + partitionDef := "PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (3), PARTITION p3 VALUES LESS THAN MAXVALUE);" + + // test TableReader with partition + tk.MustExec("set tidb_adaptive_closest_read_threshold = 30;") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, s varchar(8), p varchar(16)) " + partitionDef) + tk.MustExec("insert into t values (1, '00000001', '0000000000000001'), (2, '00000003', '0000000000000002'), (3, '00000011', '0000000000000003'), (4, '00000044', '0000000000000004');") + tk.MustExec("analyze table t;") + // estimate cost is 38 + checkMetrics("select s from t where id >= 1 and id < 3;", 1, 0) + // estimate cost is 39 with 2 cop request + checkMetrics("select s from t where id >= 2 and id < 4;", 0, 2) + + // index reader + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (id int, s varchar(8), p varchar(8), key `idx_s_p`(`s`, `p`));") + tk.MustExec("insert into t values (1, 'test1000', '11111111'), (2, 'test2000', '11111111');") + tk.MustExec("analyze table t;") + // avg row size = 27.91 + checkMetrics("select p from t where s >= 'test' and s < 'test11'", 0, 1) + checkMetrics("select p from t where s >= 'test' and s < 'test22'", 1, 0) + + // index reader with partitions + tk.MustExec("set tidb_adaptive_closest_read_threshold = 30;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (v int, id int, p varchar(8), key `idx_id_p`(`id`, `p`)) " + partitionDef) + tk.MustExec("insert into t values (1, 1, '11111111'), (2, 2, '22222222'), (3, 3, '33333333'), (4, 4, '44444444');") + tk.MustExec("analyze table t;") + // avg row size = 19 + checkMetrics("select p from t where id >= 1 and id < 3", 1, 0) + checkMetrics("select p from t where id >= 2 and id < 4", 0, 2) + checkMetrics("select p from t where id >= 1 and id < 4", 1, 1) + + // index lookup reader + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (id int, s varchar(8), p varchar(50), key `idx_s`(`s`));") + str := "this_is_a_string_with_length_of_50________________" + tk.MustExec(fmt.Sprintf("insert into t values (1, 'test1000', '%s'), (2, 'test2000', '%s');", str, str)) + tk.MustExec("analyze table t;") + tk.MustExec("set tidb_adaptive_closest_read_threshold = 80;") + // IndexReader cost is 22, TableReader cost (1 row) is 67 + checkMetrics("select/*+ FORCE_INDEX(t, idx_s) */ p from t where s >= 'test' and s < 'test11'", 0, 2) + tk.MustExec("set tidb_adaptive_closest_read_threshold = 100;") + checkMetrics("select/*+ FORCE_INDEX(t, idx_s) */ p from t where s >= 'test' and s < 'test22'", 1, 1) + + // index merge reader + tk.MustExec("drop table if exists t;") + // use int field to avoid the planer estimation with big random fluctuation. + tk.MustExec("create table t (id int, v bigint not null, s1 int not null, s2 int not null, key `idx_v_s1`(`s1`, `v`), key `idx_s2`(`s2`));") + tk.MustExec("insert into t values (1, 1, 1, 1), (2, 2, 2, 2), (3, 3, 3, 3);") + tk.MustExec("analyze table t;") + tk.MustExec("set tidb_adaptive_closest_read_threshold = 30;") + // 2 IndexScan with cost 19/56, 2 TableReader with cost 32.5/65. + checkMetrics("select/* +USE_INDEX_MERGE(t) */ id from t use index(`idx_v_s1`) use index(idx_s2) where (s1 < 3 and v > 0) or s2 = 3;", 3, 1) +} diff --git a/executor/executor.go b/executor/executor.go index 7d2839cb29e34..e147eb9bd38d9 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -340,12 +340,13 @@ type CancelDDLJobsExec struct { // Open implements the Executor Open interface. func (e *CancelDDLJobsExec) Open(ctx context.Context) error { // We want to use a global transaction to execute the admin command, so we don't use e.ctx here. - ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnDDL) - errInTxn := kv.RunInNewTxn(ctx, e.ctx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) (err error) { - e.errs, err = ddl.CancelJobs(txn, e.jobIDs) - return - }) - return errInTxn + newSess, err := e.getSysSession() + if err != nil { + return err + } + e.errs, err = ddl.CancelJobs(newSess, e.ctx.GetStore(), e.jobIDs) + e.releaseSysSession(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), newSess) + return err } // Next implements the Executor Next interface. @@ -357,7 +358,7 @@ func (e *CancelDDLJobsExec) Next(ctx context.Context, req *chunk.Chunk) error { numCurBatch := mathutil.Min(req.Capacity(), len(e.jobIDs)-e.cursor) for i := e.cursor; i < e.cursor+numCurBatch; i++ { req.AppendString(0, strconv.FormatInt(e.jobIDs[i], 10)) - if e.errs[i] != nil { + if e.errs != nil && e.errs[i] != nil { req.AppendString(1, fmt.Sprintf("error: %v", e.errs[i])) } else { req.AppendString(1, "successful") @@ -479,6 +480,7 @@ type ShowDDLJobsExec struct { jobNumber int is infoschema.InfoSchema + sess sessionctx.Context } // DDLJobRetriever retrieve the DDLJobs. @@ -493,9 +495,9 @@ type DDLJobRetriever struct { TZLoc *time.Location } -func (e *DDLJobRetriever) initial(txn kv.Transaction) error { +func (e *DDLJobRetriever) initial(txn kv.Transaction, sess sessionctx.Context) error { m := meta.NewMeta(txn) - jobs, err := ddl.GetAllDDLJobs(m) + jobs, err := ddl.GetAllDDLJobs(sess, m) if err != nil { return err } @@ -568,6 +570,22 @@ func (e *DDLJobRetriever) appendJobToChunk(req *chunk.Chunk, job *model.Job, che req.AppendNull(10) } req.AppendString(11, job.State.String()) + if job.Type == model.ActionMultiSchemaChange { + for _, subJob := range job.MultiSchemaInfo.SubJobs { + req.AppendInt64(0, job.ID) + req.AppendString(1, schemaName) + req.AppendString(2, tableName) + req.AppendString(3, subJob.Type.String()+" /* subjob */") + req.AppendString(4, subJob.SchemaState.String()) + req.AppendInt64(5, job.SchemaID) + req.AppendInt64(6, job.TableID) + req.AppendInt64(7, subJob.RowCount) + req.AppendNull(8) + req.AppendNull(9) + req.AppendNull(10) + req.AppendString(11, subJob.State.String()) + } + } } func ts2Time(timestamp uint64, loc *time.Location) types.Time { @@ -590,18 +608,35 @@ type ShowDDLJobQueriesExec struct { // Open implements the Executor Open interface. func (e *ShowDDLJobQueriesExec) Open(ctx context.Context) error { + var err error + var jobs []*model.Job if err := e.baseExecutor.Open(ctx); err != nil { return err } - txn, err := e.ctx.Txn(true) + session, err := e.getSysSession() + if err != nil { + return err + } + err = sessiontxn.NewTxn(context.Background(), session) + if err != nil { + return err + } + defer func() { + // releaseSysSession will rollbacks txn automatically. + e.releaseSysSession(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), session) + }() + txn, err := session.Txn(true) if err != nil { return err } + session.GetSessionVars().SetInTxn(true) + m := meta.NewMeta(txn) - jobs, err := ddl.GetAllDDLJobs(m) + jobs, err = ddl.GetAllDDLJobs(session, m) if err != nil { return err } + historyJobs, err := ddl.GetLastNHistoryDDLJobs(m, ddl.DefNumHistoryJobs) if err != nil { return err @@ -639,19 +674,26 @@ func (e *ShowDDLJobsExec) Open(ctx context.Context) error { if err := e.baseExecutor.Open(ctx); err != nil { return err } - txn, err := e.ctx.Txn(true) - if err != nil { - return err - } e.DDLJobRetriever.is = e.is if e.jobNumber == 0 { e.jobNumber = ddl.DefNumHistoryJobs } - err = e.DDLJobRetriever.initial(txn) + sess, err := e.getSysSession() if err != nil { return err } - return nil + e.sess = sess + err = sessiontxn.NewTxn(context.Background(), sess) + if err != nil { + return err + } + txn, err := sess.Txn(true) + if err != nil { + return err + } + sess.GetSessionVars().SetInTxn(true) + err = e.DDLJobRetriever.initial(txn, sess) + return err } // Next implements the Executor Next interface. @@ -690,6 +732,12 @@ func (e *ShowDDLJobsExec) Next(ctx context.Context, req *chunk.Chunk) error { return nil } +// Close implements the Executor Close interface. +func (e *ShowDDLJobsExec) Close() error { + e.releaseSysSession(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), e.sess) + return e.baseExecutor.Close() +} + func getSchemaName(is infoschema.InfoSchema, id int64) string { var schemaName string DBInfo, ok := is.SchemaByID(id) diff --git a/executor/executor_test.go b/executor/executor_test.go index 3d68a859c6dff..db2aebede77a6 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -1576,21 +1576,6 @@ func TestPlanReplayerDumpSingle(t *testing.T) { } } -func TestDropColWithPrimaryKey(t *testing.T) { - store, clean := testkit.CreateMockStore(t) - defer clean() - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(id int primary key, c1 int, c2 int, c3 int, index idx1(c1, c2), index idx2(c3))") - tk.MustExec("set global tidb_enable_change_multi_schema = off") - tk.MustGetErrMsg("alter table t drop column id", "[ddl:8200]Unsupported drop integer primary key") - tk.MustGetErrMsg("alter table t drop column c1", "[ddl:8200]can't drop column c1 with composite index covered or Primary Key covered now") - tk.MustGetErrMsg("alter table t drop column c3", "[ddl:8200]can't drop column c3 with tidb_enable_change_multi_schema is disable") - tk.MustExec("set global tidb_enable_change_multi_schema = on") - tk.MustExec("alter table t drop column c3") -} - func TestUnsignedFeedback(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -4374,8 +4359,8 @@ func TestGetResultRowsCount(t *testing.T) { require.NotNil(t, info) p, ok := info.Plan.(plannercore.Plan) require.True(t, ok) - cnt := executor.GetResultRowsCount(tk.Session(), p) - require.Equal(t, cnt, ca.row, fmt.Sprintf("sql: %v", ca.sql)) + cnt := executor.GetResultRowsCount(tk.Session().GetSessionVars().StmtCtx, p) + require.Equal(t, ca.row, cnt, fmt.Sprintf("sql: %v", ca.sql)) } } @@ -4404,7 +4389,7 @@ func TestAdminShowDDLJobs(t *testing.T) { require.NoError(t, err) txn, err := tk.Session().Txn(true) require.NoError(t, err) - err = ddl.AddHistoryDDLJob(meta.NewMeta(txn), job, true) + err = meta.NewMeta(txn).AddHistoryDDLJob(job, true) require.NoError(t, err) re = tk.MustQuery("admin show ddl jobs 1") @@ -6071,3 +6056,26 @@ func TestIsFastPlan(t *testing.T) { require.Equal(t, ca.isFastPlan, ok) } } + +func TestBinaryStrNumericOperator(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // Test normal warnings. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varbinary(10))") + tk.MustExec("insert into t values ('123.12')") + tk.MustQuery("select 1+a from t").Check(testkit.Rows( + "124.12")) + tk.MustQuery("select a-1 from t").Check(testkit.Rows( + "122.12")) + tk.MustQuery("select -10*a from t").Check(testkit.Rows( + "-1231.2")) + tk.MustQuery("select a/-2 from t").Check(testkit.Rows( + "-61.56")) + // there should be no warning. + tk.MustQuery("show warnings").Check(testkit.Rows()) +} diff --git a/executor/explain.go b/executor/explain.go index 57d4261cf6745..1fef25865bc59 100644 --- a/executor/explain.go +++ b/executor/explain.go @@ -16,11 +16,22 @@ package executor import ( "context" + "os" + "path/filepath" + "runtime" + rpprof "runtime/pprof" + "strconv" + "sync" + "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/memory" + "go.uber.org/zap" ) // ExplainExec represents an explain executor. @@ -89,6 +100,24 @@ func (e *ExplainExec) executeAnalyzeExec(ctx context.Context) (err error) { } } }() + if minHeapInUse, alarmRatio := e.ctx.GetSessionVars().MemoryDebugModeMinHeapInUse, e.ctx.GetSessionVars().MemoryDebugModeAlarmRatio; minHeapInUse != 0 && alarmRatio != 0 { + memoryDebugModeCtx, cancel := context.WithCancel(ctx) + waitGroup := sync.WaitGroup{} + waitGroup.Add(1) + defer func() { + // Notify and wait debug goroutine exit. + cancel() + waitGroup.Wait() + }() + go (&memoryDebugModeHandler{ + ctx: memoryDebugModeCtx, + minHeapInUse: mathutil.Abs(minHeapInUse), + alarmRatio: alarmRatio, + autoGC: minHeapInUse > 0, + memTracker: e.ctx.GetSessionVars().StmtCtx.MemTracker, + wg: &waitGroup, + }).run() + } e.executed = true chk := newFirstChunk(e.analyzeExec) for { @@ -123,3 +152,126 @@ func (e *ExplainExec) getAnalyzeExecToExecutedNoDelay() Executor { } return nil } + +type memoryDebugModeHandler struct { + ctx context.Context + minHeapInUse int64 + alarmRatio int64 + autoGC bool + wg *sync.WaitGroup + memTracker *memory.Tracker + + infoField []zap.Field +} + +func (h *memoryDebugModeHandler) fetchCurrentMemoryUsage(gc bool) (heapInUse, trackedMem uint64) { + if gc { + runtime.GC() + } + instanceStats := &runtime.MemStats{} + runtime.ReadMemStats(instanceStats) + heapInUse = instanceStats.HeapInuse + trackedMem = uint64(h.memTracker.BytesConsumed()) + return +} + +func (h *memoryDebugModeHandler) genInfo(status string, needProfile bool, heapInUse, trackedMem int64) (fields []zap.Field, err error) { + var fileName string + h.infoField = h.infoField[:0] + h.infoField = append(h.infoField, zap.String("sql", status)) + h.infoField = append(h.infoField, zap.String("heap in use", memory.FormatBytes(heapInUse))) + h.infoField = append(h.infoField, zap.String("tracked memory", memory.FormatBytes(trackedMem))) + if needProfile { + fileName, err = getHeapProfile() + h.infoField = append(h.infoField, zap.String("heap profile", fileName)) + } + return h.infoField, err +} + +func (h *memoryDebugModeHandler) run() { + var err error + var fields []zap.Field + defer func() { + heapInUse, trackedMem := h.fetchCurrentMemoryUsage(true) + if err == nil { + fields, err := h.genInfo("finished", true, int64(heapInUse), int64(trackedMem)) + logutil.BgLogger().Info("Memory Debug Mode", fields...) + if err != nil { + logutil.BgLogger().Error("Memory Debug Mode Exit", zap.Error(err)) + } + } else { + fields, err := h.genInfo("debug_mode_error", false, int64(heapInUse), int64(trackedMem)) + logutil.BgLogger().Error("Memory Debug Mode", fields...) + logutil.BgLogger().Error("Memory Debug Mode Exit", zap.Error(err)) + } + h.wg.Done() + }() + + logutil.BgLogger().Info("Memory Debug Mode", + zap.String("sql", "started"), + zap.Bool("autoGC", h.autoGC), + zap.String("minHeapInUse", memory.FormatBytes(h.minHeapInUse)), + zap.Int64("alarmRatio", h.alarmRatio), + ) + ticker, loop := time.NewTicker(5*time.Second), 0 + for { + select { + case <-h.ctx.Done(): + return + case <-ticker.C: + heapInUse, trackedMem := h.fetchCurrentMemoryUsage(h.autoGC) + loop++ + if loop%6 == 0 { + fields, err = h.genInfo("running", false, int64(heapInUse), int64(trackedMem)) + logutil.BgLogger().Info("Memory Debug Mode", fields...) + if err != nil { + return + } + } + + if !h.autoGC { + if heapInUse > uint64(h.minHeapInUse) && trackedMem/100*uint64(100+h.alarmRatio) < heapInUse { + fields, err = h.genInfo("warning", true, int64(heapInUse), int64(trackedMem)) + logutil.BgLogger().Warn("Memory Debug Mode", fields...) + if err != nil { + return + } + } + } else { + if heapInUse > uint64(h.minHeapInUse) && trackedMem/100*uint64(100+h.alarmRatio) < heapInUse { + fields, err = h.genInfo("warning", true, int64(heapInUse), int64(trackedMem)) + logutil.BgLogger().Warn("Memory Debug Mode", fields...) + if err != nil { + return + } + ts := h.memTracker.SearchTrackerConsumedMoreThanNBytes(h.minHeapInUse / 5) + logs := make([]zap.Field, 0, len(ts)) + for _, t := range ts { + logs = append(logs, zap.String("Executor_"+strconv.Itoa(t.Label()), memory.FormatBytes(t.BytesConsumed()))) + } + logutil.BgLogger().Warn("Memory Debug Mode, Log all trackers that consumes more than threshold * 20%", logs...) + } + } + } + } +} + +func getHeapProfile() (fileName string, err error) { + tempDir := filepath.Join(config.GetGlobalConfig().TempStoragePath, "record") + timeString := time.Now().Format(time.RFC3339) + fileName = filepath.Join(tempDir, "heapGC"+timeString) + f, err := os.Create(fileName) + if err != nil { + return "", err + } + p := rpprof.Lookup("heap") + err = p.WriteTo(f, 0) + if err != nil { + return "", err + } + err = f.Close() + if err != nil { + return "", err + } + return fileName, nil +} diff --git a/executor/explain_test.go b/executor/explain_test.go index af3439b048b81..8ecbd3edd019b 100644 --- a/executor/explain_test.go +++ b/executor/explain_test.go @@ -495,3 +495,16 @@ func TestIssue35911(t *testing.T) { // To be consistent with other operators, we should not aggregate the concurrency in the runtime stats. require.EqualValues(t, 5, concurrency) } + +func TestIssue35105(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + 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("insert into t values (2)") + tk.MustExec("set @@tidb_constraint_check_in_place=1") + require.Error(t, tk.ExecToErr("explain analyze insert into t values (1), (2), (3)")) + tk.MustQuery("select * from t").Check(testkit.Rows("2")) +} diff --git a/executor/index_lookup_hash_join.go b/executor/index_lookup_hash_join.go index 5287f43a59cbe..4c20b9baf90cb 100644 --- a/executor/index_lookup_hash_join.go +++ b/executor/index_lookup_hash_join.go @@ -608,7 +608,10 @@ func (iw *indexHashJoinInnerWorker) handleTask(ctx context.Context, task *indexH if task.keepOuterOrder { if err != nil { joinResult.err = err - resultCh <- joinResult + select { + case <-ctx.Done(): + case resultCh <- joinResult: + } } close(resultCh) } diff --git a/executor/index_merge_reader.go b/executor/index_merge_reader.go index a403f60196cb1..683ff2b497434 100644 --- a/executor/index_merge_reader.go +++ b/executor/index_merge_reader.go @@ -104,8 +104,10 @@ type IndexMergeReaderExecutor struct { // checkIndexValue is used to check the consistency of the index data. *checkIndexValue // nolint:unused - partialPlans [][]plannercore.PhysicalPlan - tblPlans []plannercore.PhysicalPlan + partialPlans [][]plannercore.PhysicalPlan + tblPlans []plannercore.PhysicalPlan + partialNetDataSizes []float64 + dataAvgRowSize float64 handleCols plannercore.HandleCols stats *IndexMergeRuntimeStat @@ -310,7 +312,8 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, SetFromSessionVars(e.ctx.GetSessionVars()). SetMemTracker(e.memTracker). SetPaging(e.paging). - SetFromInfoSchema(e.ctx.GetInfoSchema()) + SetFromInfoSchema(e.ctx.GetInfoSchema()). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &builder.Request, e.partialNetDataSizes[workID])) for parTblIdx, keyRange := range keyRanges { // check if this executor is closed @@ -390,6 +393,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, feedback: statistics.NewQueryFeedback(0, nil, 0, false), plans: e.partialPlans[workID], ranges: e.ranges[workID], + netDataSize: e.partialNetDataSizes[workID], } worker := &partialTableWorker{ @@ -611,6 +615,7 @@ func (e *IndexMergeReaderExecutor) buildFinalTableReader(ctx context.Context, tb columns: e.columns, feedback: statistics.NewQueryFeedback(0, nil, 0, false), plans: e.tblPlans, + netDataSize: e.dataAvgRowSize * float64(len(handles)), } if e.isCorColInTableFilter { if tableReaderExec.dagPB.Executors, err = constructDistExec(e.ctx, e.tblPlans); err != nil { diff --git a/executor/infoschema_cluster_table_test.go b/executor/infoschema_cluster_table_test.go index c790919a17004..f89120e688654 100644 --- a/executor/infoschema_cluster_table_test.go +++ b/executor/infoschema_cluster_table_test.go @@ -335,7 +335,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 := 32 + result := 35 require.Len(t, rows, result) // More tests about the privileges. diff --git a/executor/infoschema_reader.go b/executor/infoschema_reader.go index c146f3095e84e..b31a684ec30cb 100644 --- a/executor/infoschema_reader.go +++ b/executor/infoschema_reader.go @@ -150,7 +150,7 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex case infoschema.TableConstraints: e.setDataFromTableConstraints(sctx, dbs) case infoschema.TableSessionVar: - err = e.setDataFromSessionVar(sctx) + e.rows, err = infoschema.GetDataFromSessionVariables(sctx) case infoschema.TableTiDBServersInfo: err = e.setDataForServersInfo(sctx) case infoschema.TableTiFlashReplica: @@ -1271,6 +1271,7 @@ type DDLJobsReaderExec struct { cacheJobs []*model.Job is infoschema.InfoSchema + sess sessionctx.Context } // Open implements the Executor Next interface. @@ -1278,13 +1279,23 @@ func (e *DDLJobsReaderExec) Open(ctx context.Context) error { if err := e.baseExecutor.Open(ctx); err != nil { return err } - txn, err := e.ctx.Txn(true) + e.DDLJobRetriever.is = e.is + e.activeRoles = e.ctx.GetSessionVars().ActiveRoles + sess, err := e.getSysSession() if err != nil { return err } - e.DDLJobRetriever.is = e.is - e.activeRoles = e.ctx.GetSessionVars().ActiveRoles - err = e.DDLJobRetriever.initial(txn) + e.sess = sess + err = sessiontxn.NewTxn(context.Background(), sess) + if err != nil { + return err + } + txn, err := sess.Txn(true) + if err != nil { + return err + } + sess.GetSessionVars().SetInTxn(true) + err = e.DDLJobRetriever.initial(txn, sess) if err != nil { return err } @@ -1303,6 +1314,12 @@ func (e *DDLJobsReaderExec) Next(ctx context.Context, req *chunk.Chunk) error { for i := e.cursor; i < e.cursor+num; i++ { e.appendJobToChunk(req, e.runningJobs[i], checker) req.AppendString(12, e.runningJobs[i].Query) + if e.runningJobs[i].MultiSchemaInfo != nil { + for range e.runningJobs[i].MultiSchemaInfo.SubJobs { + req.AppendString(12, e.runningJobs[i].Query) + } + } + } e.cursor += num count += num @@ -1318,12 +1335,23 @@ func (e *DDLJobsReaderExec) Next(ctx context.Context, req *chunk.Chunk) error { for _, job := range e.cacheJobs { e.appendJobToChunk(req, job, checker) req.AppendString(12, job.Query) + if job.MultiSchemaInfo != nil { + for range job.MultiSchemaInfo.SubJobs { + req.AppendString(12, job.Query) + } + } } e.cursor += len(e.cacheJobs) } return nil } +// Close implements the Executor Close interface. +func (e *DDLJobsReaderExec) Close() error { + e.releaseSysSession(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), e.sess) + return e.baseExecutor.Close() +} + func (e *memtableRetriever) setDataFromEngines() { var rows [][]types.Datum rows = append(rows, @@ -1941,24 +1969,6 @@ func (e *tableStorageStatsRetriever) setDataForTableStorageStats(ctx sessionctx. return rows, nil } -func (e *memtableRetriever) setDataFromSessionVar(ctx sessionctx.Context) error { - var err error - sessionVars := ctx.GetSessionVars() - sysVars := variable.GetSysVars() - rows := make([][]types.Datum, 0, len(sysVars)) - for _, v := range sysVars { - var value string - value, err = variable.GetSessionOrGlobalSystemVar(sessionVars, v.Name) - if err != nil { - return err - } - row := types.MakeDatums(v.Name, value) - rows = append(rows, row) - } - e.rows = rows - return nil -} - // dataForAnalyzeStatusHelper is a helper function which can be used in show_stats.go func dataForAnalyzeStatusHelper(sctx sessionctx.Context) (rows [][]types.Datum, err error) { const maxAnalyzeJobs = 30 diff --git a/executor/infoschema_reader_test.go b/executor/infoschema_reader_test.go index 3f5631d43bff1..97531b2489140 100644 --- a/executor/infoschema_reader_test.go +++ b/executor/infoschema_reader_test.go @@ -243,6 +243,11 @@ func TestDDLJobs(t *testing.T) { DDLJobsTester.MustExec("set role r_priv") DDLJobsTester.MustQuery("select DB_NAME, TABLE_NAME from information_schema.DDL_JOBS where DB_NAME = 'test_ddl_jobs' and TABLE_NAME = 't';").Check( testkit.Rows("test_ddl_jobs t")) + + tk.MustExec("create table tt (a int);") + tk.MustExec("alter table tt add index t(a), add column b int") + tk.MustQuery("select db_name, table_name, job_type from information_schema.DDL_JOBS limit 3").Check( + testkit.Rows("test_ddl_jobs tt alter table multi-schema change", "test_ddl_jobs tt add index /* subjob */", "test_ddl_jobs tt add column /* subjob */")) } func TestKeyColumnUsage(t *testing.T) { diff --git a/executor/insert_common.go b/executor/insert_common.go index 9d31cf44f030f..dee087b13ae91 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/ast" @@ -642,6 +643,23 @@ func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue } } } + tbl := e.Table.Meta() + // Handle exchange partition + if tbl.ExchangePartitionInfo != nil && tbl.ExchangePartitionInfo.ExchangePartitionFlag { + is := e.ctx.GetDomainInfoSchema().(infoschema.InfoSchema) + pt, tableFound := is.TableByID(tbl.ExchangePartitionInfo.ExchangePartitionID) + if !tableFound { + return nil, errors.Errorf("exchange partition process table by id failed") + } + p, ok := pt.(table.PartitionedTable) + if !ok { + return nil, errors.Errorf("exchange partition process assert table partition failed") + } + err := p.CheckForExchangePartition(e.ctx, pt.Meta().Partition, row, tbl.ExchangePartitionInfo.ExchangePartitionDefID) + if err != nil { + return nil, err + } + } for i, gCol := range gCols { colIdx := gCol.ColumnInfo.Offset val, err := e.GenExprs[i].Eval(chunk.MutRowFromDatums(row).ToRow()) diff --git a/executor/point_get.go b/executor/point_get.go index 04687403c0d4e..bd33c47f33739 100644 --- a/executor/point_get.go +++ b/executor/point_get.go @@ -71,6 +71,9 @@ func (b *executorBuilder) buildPointGet(p *plannercore.PointGetPlan) Executor { b.err = err return nil } + if b.ctx.GetSessionVars().GetReplicaRead() == kv.ReplicaReadClosestAdaptive { + e.snapshot.SetOption(kv.ReplicaReadAdjuster, newReplicaReadAdjuster(e.ctx, p.GetAvgRowSize())) + } if e.runtimeStats != nil { snapshotStats := &txnsnapshot.SnapshotRuntimeStats{} e.stats = &runtimeStatsWithSnapshot{ @@ -237,6 +240,17 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { return err } + // lockNonExistIdxKey indicates the key will be locked regardless of its existence. + lockNonExistIdxKey := !e.ctx.GetSessionVars().IsPessimisticReadConsistency() + // Non-exist keys are also locked if the isolation level is not read consistency, + // lock it before read here, then it's able to read from pessimistic lock cache. + if lockNonExistIdxKey { + err = e.lockKeyIfNeeded(ctx, e.idxKey) + if err != nil { + return err + } + } + e.handleVal, err = e.get(ctx, e.idxKey) if err != nil { if !kv.ErrNotExist.Equal(err) { @@ -244,12 +258,14 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { } } - // try lock the index key if isolation level is not read consistency // also lock key if read consistency read a value - if !e.ctx.GetSessionVars().IsPessimisticReadConsistency() || len(e.handleVal) > 0 { - err = e.lockKeyIfNeeded(ctx, e.idxKey) - if err != nil { - return err + // TODO: pessimistic lock support lock-if-exist. + if lockNonExistIdxKey || len(e.handleVal) > 0 { + if !lockNonExistIdxKey { + err = e.lockKeyIfNeeded(ctx, e.idxKey) + if err != nil { + return err + } } // Change the unique index LOCK into PUT record. if e.lock && len(e.handleVal) > 0 { @@ -377,7 +393,7 @@ func (e *PointGetExecutor) lockKeyIfNeeded(ctx context.Context, key []byte) erro return err } lockCtx.IterateValuesNotLocked(func(k, v []byte) { - seVars.TxnCtx.SetPessimisticLockCache(kv.Key(k), v) + seVars.TxnCtx.SetPessimisticLockCache(k, v) }) if len(e.handleVal) > 0 { seVars.TxnCtx.SetPessimisticLockCache(e.idxKey, e.handleVal) diff --git a/executor/resource_tag_test.go b/executor/resource_tag_test.go index 605a7f323b573..db59828aa72be 100644 --- a/executor/resource_tag_test.go +++ b/executor/resource_tag_test.go @@ -196,6 +196,10 @@ func TestResourceGroupTag(t *testing.T) { p, ok := info.Plan.(plannercore.Plan) require.True(t, ok) _, expectPlanDigest = plannercore.NormalizePlan(p) + + flat := plannercore.FlattenPhysicalPlan(p, false) + _, newPlanDigest := plannercore.NormalizeFlatPlan(flat) + require.Equal(t, expectPlanDigest, newPlanDigest) } require.Equal(t, sqlDigest.String(), expectSQLDigest.String(), "%v", ca.sql) require.Equal(t, planDigest.String(), expectPlanDigest.String()) diff --git a/executor/seqtest/seq_executor_test.go b/executor/seqtest/seq_executor_test.go index 16b556cde9ca9..52e1eabb551b1 100644 --- a/executor/seqtest/seq_executor_test.go +++ b/executor/seqtest/seq_executor_test.go @@ -329,7 +329,7 @@ func TestShow(t *testing.T) { )) testSQL = "show create database if not exists show_test_DB;" tk.MustQuery(testSQL).Check(testkit.RowsWithSep("|", - "show_test_DB|CREATE DATABASE /*!32312 IF NOT EXISTS*/ `show_test_DB` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", + "show_test_DB|CREATE DATABASE IF NOT EXISTS `show_test_DB` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", )) tk.MustExec("use show_test_DB") @@ -941,7 +941,7 @@ func TestBatchInsertDelete(t *testing.T) { atomic.StoreUint64(&kv.TxnTotalSizeLimit, originLimit) }() // Set the limitation to a small value, make it easier to reach the limitation. - atomic.StoreUint64(&kv.TxnTotalSizeLimit, 5600) + atomic.StoreUint64(&kv.TxnTotalSizeLimit, 5700) tk := testkit.NewTestKit(t, store) tk.MustExec("use test") diff --git a/executor/set_test.go b/executor/set_test.go index f91d1f1e80388..0ca8f53c53134 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -676,11 +676,11 @@ func TestSetVar(t *testing.T) { tk.MustQuery("show global variables like 'tidb_ignore_prepared_cache_close_stmt'").Check(testkit.Rows("tidb_ignore_prepared_cache_close_stmt OFF")) // test for tidb_enable_new_cost_interface - tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("0")) // default value is 0 - tk.MustExec("set global tidb_enable_new_cost_interface=1") - tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("1")) // default value is 1 tk.MustExec("set global tidb_enable_new_cost_interface=0") tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_enable_new_cost_interface=1") + tk.MustQuery("select @@global.tidb_enable_new_cost_interface").Check(testkit.Rows("1")) // test for tidb_remove_orderby_in_subquery tk.MustQuery("select @@session.tidb_remove_orderby_in_subquery").Check(testkit.Rows("0")) // default value is 0 @@ -690,6 +690,14 @@ func TestSetVar(t *testing.T) { tk.MustExec("set global tidb_remove_orderby_in_subquery=1") tk.MustQuery("select @@global.tidb_remove_orderby_in_subquery").Check(testkit.Rows("1")) + // test for tidb_opt_skew_distinct_agg + tk.MustQuery("select @@session.tidb_opt_skew_distinct_agg").Check(testkit.Rows("0")) // default value is 0 + tk.MustExec("set session tidb_opt_skew_distinct_agg=1") + tk.MustQuery("select @@session.tidb_opt_skew_distinct_agg").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.tidb_opt_skew_distinct_agg").Check(testkit.Rows("0")) // default value is 0 + tk.MustExec("set global tidb_opt_skew_distinct_agg=1") + tk.MustQuery("select @@global.tidb_opt_skew_distinct_agg").Check(testkit.Rows("1")) + // the value of max_allowed_packet should be a multiple of 1024 tk.MustExec("set @@global.max_allowed_packet=16385") tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect max_allowed_packet value: '16385'")) @@ -733,6 +741,16 @@ func TestSetVar(t *testing.T) { tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_cost_model_version value: '0'")) tk.MustExec("set tidb_cost_model_version=2") tk.MustQuery("select @@tidb_cost_model_version").Check(testkit.Rows("2")) + + tk.MustQuery("select @@tidb_enable_analyze_snapshot").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_enable_analyze_snapshot = 1") + tk.MustQuery("select @@global.tidb_enable_analyze_snapshot").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_enable_analyze_snapshot = 0") + tk.MustQuery("select @@global.tidb_enable_analyze_snapshot").Check(testkit.Rows("0")) + tk.MustExec("set session tidb_enable_analyze_snapshot = 1") + tk.MustQuery("select @@session.tidb_enable_analyze_snapshot").Check(testkit.Rows("1")) + tk.MustExec("set session tidb_enable_analyze_snapshot = 0") + tk.MustQuery("select @@session.tidb_enable_analyze_snapshot").Check(testkit.Rows("0")) } func TestGetSetNoopVars(t *testing.T) { diff --git a/executor/show.go b/executor/show.go index 1ea1b658cd1de..2f1d366dc7c1e 100644 --- a/executor/show.go +++ b/executor/show.go @@ -41,6 +41,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + field_types "github.com/pingcap/tidb/parser/types" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/plugin" "github.com/pingcap/tidb/privilege" @@ -957,7 +958,7 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T buf.WriteString(",\n") } fmt.Fprintf(buf, " %s %s", stringutil.Escape(col.Name.O, sqlMode), col.GetTypeDesc()) - if col.GetCharset() != "binary" { + if field_types.HasCharset(&col.FieldType) { if col.GetCharset() != tblCharset { fmt.Fprintf(buf, " CHARACTER SET %s", col.GetCharset()) } @@ -1358,7 +1359,7 @@ func appendPartitionInfo(partitionInfo *model.PartitionInfo, buf *bytes.Buffer, } } // this if statement takes care of lists/range columns case - if partitionInfo.Columns != nil { + if len(partitionInfo.Columns) > 0 { // partitionInfo.Type == model.PartitionTypeRange || partitionInfo.Type == model.PartitionTypeList // Notice that MySQL uses two spaces between LIST and COLUMNS... fmt.Fprintf(buf, "\nPARTITION BY %s COLUMNS(", partitionInfo.Type.String()) @@ -1414,7 +1415,7 @@ func ConstructResultOfShowCreateDatabase(ctx sessionctx.Context, dbInfo *model.D sqlMode := ctx.GetSessionVars().SQLMode var ifNotExistsStr string if ifNotExists { - ifNotExistsStr = "/*!32312 IF NOT EXISTS*/ " + ifNotExistsStr = "IF NOT EXISTS " } fmt.Fprintf(buf, "CREATE DATABASE %s%s", ifNotExistsStr, stringutil.Escape(dbInfo.Name.O, sqlMode)) if dbInfo.Charset != "" { @@ -2024,8 +2025,19 @@ func (e *ShowExec) fetchShowSessionStates(ctx context.Context) error { if err = stateJSON.UnmarshalJSON(stateBytes); err != nil { return err } - // This will be implemented in future PRs. - tokenBytes, err := gjson.Marshal("") + // session token + var token *sessionstates.SessionToken + // In testing, user may be nil. + if user := e.ctx.GetSessionVars().User; user != nil { + // The token may be leaked without secure transport, so we enforce secure transport (TLS or Unix Socket). + if !e.ctx.GetSessionVars().ConnectionInfo.IsSecureTransport() { + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("the token must be queried with secure transport") + } + if token, err = sessionstates.CreateSessionToken(user.Username); err != nil { + return err + } + } + tokenBytes, err := gjson.Marshal(token) if err != nil { return errors.Trace(err) } diff --git a/executor/show_stats.go b/executor/show_stats.go index af5c1e27ad696..ed931889b48b4 100644 --- a/executor/show_stats.go +++ b/executor/show_stats.go @@ -476,7 +476,7 @@ func (e *ShowExec) fetchShowColumnStatsUsage() error { partitionName = "global" } for _, col := range tbl.Columns { - tblColID := model.TableColumnID{TableID: tblID, ColumnID: col.ID} + tblColID := model.TableItemID{TableID: tblID, ID: col.ID, IsIndex: false} colStatsUsage, ok := colStatsMap[tblColID] if !ok { continue diff --git a/executor/showtest/show_test.go b/executor/showtest/show_test.go index 2994069bcb0f6..e983bc3a2746e 100644 --- a/executor/showtest/show_test.go +++ b/executor/showtest/show_test.go @@ -458,6 +458,17 @@ func TestShowCreateTable(t *testing.T) { " `b` varchar(20) DEFAULT '\\\\',\n"+ " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(" + + "a set('a', 'b') charset binary," + + "b enum('a', 'b') charset ascii);") + tk.MustQuery("show create table t;").Check(testkit.RowsWithSep("|", + ""+ + "t CREATE TABLE `t` (\n"+ + " `a` set('a','b') CHARACTER SET binary COLLATE binary DEFAULT NULL,\n"+ + " `b` enum('a','b') CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) } func TestShowCreateTablePlacement(t *testing.T) { @@ -1445,7 +1456,7 @@ func TestShowBuiltin(t *testing.T) { res := tk.MustQuery("show builtins;") require.NotNil(t, res) rows := res.Rows() - const builtinFuncNum = 275 + const builtinFuncNum = 276 require.Equal(t, len(rows), builtinFuncNum) require.Equal(t, rows[0][0].(string), "abs") require.Equal(t, rows[builtinFuncNum-1][0].(string), "yearweek") @@ -1738,7 +1749,7 @@ func TestShowTemporaryTable(t *testing.T) { " `i` int(11) NOT NULL AUTO_INCREMENT,\n" + " `j` int(11) DEFAULT NULL,\n" + " PRIMARY KEY (`i`) /*T![clustered_index] CLUSTERED */\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=2" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=3" tk.MustQuery("show create table t7").Check(testkit.Rows("t7 " + expect)) } diff --git a/executor/slow_query.go b/executor/slow_query.go index 1708ebe7cc6f4..395d8f4eba8ac 100755 --- a/executor/slow_query.go +++ b/executor/slow_query.go @@ -740,6 +740,14 @@ func getColumnValueFactoryByName(sctx sessionctx.Context, colName string, column row[columnIdx] = types.NewStringDatum(plan) return true, nil }, nil + case variable.SlowLogBinaryPlan: + return func(row []types.Datum, value string, tz *time.Location, checker *slowLogChecker) (bool, error) { + if strings.HasPrefix(value, variable.SlowLogBinaryPlanPrefix) { + value = value[len(variable.SlowLogBinaryPlanPrefix) : len(value)-len(variable.SlowLogPlanSuffix)] + } + row[columnIdx] = types.NewStringDatum(value) + return true, nil + }, nil case variable.SlowLogConnIDStr, variable.SlowLogExecRetryCount, variable.SlowLogPreprocSubQueriesStr, execdetails.WriteKeysStr, execdetails.WriteSizeStr, execdetails.PrewriteRegionStr, execdetails.TxnRetryStr, execdetails.RequestCountStr, execdetails.TotalKeysStr, execdetails.ProcessKeysStr, diff --git a/executor/slow_query_test.go b/executor/slow_query_test.go index dea0ab2cb16cd..32412d2f1ac70 100644 --- a/executor/slow_query_test.go +++ b/executor/slow_query_test.go @@ -163,7 +163,7 @@ select * from t;` `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,` + - `update t set i = 1;,select * from t;` + `,update t set i = 1;,select * from t;` require.Equal(t, expectRecordString, recordString) // Issue 20928 @@ -186,7 +186,7 @@ select * from t;` `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,` + - `update t set i = 1;,select * from t;` + `,update t set i = 1;,select * from t;` require.Equal(t, expectRecordString, recordString) // fix sql contain '# ' bug diff --git a/executor/table_reader.go b/executor/table_reader.go index 560eb1fd2ecd8..457822796ea91 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -82,6 +82,9 @@ type TableReaderExecutor struct { txnScope string readReplicaScope string isStaleness bool + // FIXME: in some cases the data size can be more accurate after get the handles count, + // but we keep things simple as it needn't to be that accurate for now. + netDataSize float64 // columns are only required by union scan and virtual column. columns []*model.ColumnInfo @@ -340,7 +343,9 @@ func (e *TableReaderExecutor) buildKVReqSeparately(ctx context.Context, ranges [ SetMemTracker(e.memTracker). SetStoreType(e.storeType). SetPaging(e.paging). - SetAllowBatchCop(e.batchCop).Build() + SetAllowBatchCop(e.batchCop). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &reqBuilder.Request, e.netDataSize)). + Build() if err != nil { return nil, err } @@ -379,7 +384,9 @@ func (e *TableReaderExecutor) buildKVReqForPartitionTableScan(ctx context.Contex SetMemTracker(e.memTracker). SetStoreType(e.storeType). SetPaging(e.paging). - SetAllowBatchCop(e.batchCop).Build() + SetAllowBatchCop(e.batchCop). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &reqBuilder.Request, e.netDataSize)). + Build() if err != nil { return nil, err } @@ -411,6 +418,7 @@ func (e *TableReaderExecutor) buildKVReq(ctx context.Context, ranges []*ranger.R SetMemTracker(e.memTracker). SetStoreType(e.storeType). SetAllowBatchCop(e.batchCop). + SetClosestReplicaReadAdjuster(newClosestReadAdjuster(e.ctx, &reqBuilder.Request, e.netDataSize)). SetPaging(e.paging) return reqBuilder.Build() } diff --git a/executor/testdata/analyze_test_data.sql b/executor/testdata/analyze_test_data.sql new file mode 100644 index 0000000000000..3f468ffdd2a63 --- /dev/null +++ b/executor/testdata/analyze_test_data.sql @@ -0,0 +1,726 @@ +INSERT INTO t1 (id,num) VALUES + (6404,0.44816685), + (6532,0.7986926), + (6660,0.00085072), + (6788,0.00002967), + (6916,0.0), + (7044,0.03088332), + (7172,0.00046703), + (7300,0.00568179), + (7428,0.33018935), + (7556,0.00455456); +INSERT INTO t1 (id,num) VALUES + (7684,0.36683157), + (7812,0.6140698), + (7940,0.10177323), + (8068,0.00434905), + (8196,0.07348831), + (8324,0.00006405), + (8452,0.02007892), + (8580,0.01050341), + (8708,0.00030031), + (8836,0.02070964); +INSERT INTO t1 (id,num) VALUES + (8964,0.02303072), + (9092,0.44560316), + (9220,0.00069178), + (9348,0.06521516), + (9476,NULL), + (9604,0.01747504), + (9732,0.6579575), + (9860,0.0025045), + (9988,0.03484399), + (10116,0.00193867); +INSERT INTO t1 (id,num) VALUES + (10244,0.0), + (10372,0.0007868), + (10500,0.00031922), + (10628,0.09769934), + (10756,0.00715676), + (10884,NULL), + (11012,0.30375117), + (11140,0.7572566), + (11268,0.00018916), + (11396,0.00969914); +INSERT INTO t1 (id,num) VALUES + (11524,0.05069033), + (11652,0.25621885), + (11780,0.00468599), + (11908,NULL), + (12036,0.00011619), + (12164,0.05855278), + (12292,0.00367099), + (12420,0.9929275), + (12548,0.15242451), + (12676,NULL); +INSERT INTO t1 (id,num) VALUES + (12804,0.0246472), + (12932,0.00472382), + (13060,NULL), + (13188,0.93716323), + (13316,NULL), + (13444,0.01234986), + (13572,0.00076421), + (13700,0.0), + (13828,NULL), + (13956,0.12757756); +INSERT INTO t1 (id,num) VALUES + (14084,0.00484138), + (14212,0.02226818), + (14340,0.00265866), + (14468,0.0016064), + (14596,0.8862497), + (14724,0.00004634), + (14852,0.00835311), + (14980,0.55768555), + (15108,0.04359115), + (15236,0.00277844); +INSERT INTO t1 (id,num) VALUES + (15364,NULL), + (15492,NULL), + (15620,0.01908805), + (15748,0.12949005), + (15876,0.00305156), + (16004,0.00148819), + (16132,0.5249692), + (16260,0.14020711), + (16388,0.16946065), + (16516,NULL); +INSERT INTO t1 (id,num) VALUES + (16644,0.00692773), + (16772,0.00527069), + (16900,NULL), + (17028,0.00114955), + (17156,0.00134839), + (17284,0.02818464), + (17412,NULL), + (17540,0.0), + (17668,0.00351416), + (17796,0.00437542); +INSERT INTO t1 (id,num) VALUES + (17924,0.0012496), + (18052,0.00040084), + (18180,0.35637453), + (18308,0.0220884), + (18436,0.0020587), + (18564,0.00297463), + (18692,0.00487483), + (18820,0.00246549), + (18948,NULL), + (19076,0.9188499); +INSERT INTO t1 (id,num) VALUES + (19204,0.0168393), + (19332,0.00016338), + (19460,0.0), + (19588,0.28465533), + (19716,0.00008774), + (19844,0.0), + (19972,0.46484554), + (20100,0.00113875), + (20228,0.02503506), + (20356,0.01585903); +INSERT INTO t1 (id,num) VALUES + (20484,0.84865177), + (20612,0.00004633), + (20740,0.00002771), + (20868,0.17606646), + (20996,NULL), + (21124,NULL), + (21252,0.06745174), + (21380,NULL), + (21508,0.06476934), + (21636,NULL); +INSERT INTO t1 (id,num) VALUES + (21764,0.05436462), + (21892,0.0), + (22020,0.01013111), + (22148,0.72076213), + (22276,0.00758889), + (22404,NULL), + (22532,0.01502812), + (22660,0.03836808), + (22788,0.01743244), + (22916,0.90398115); +INSERT INTO t1 (id,num) VALUES + (23044,0.39467624), + (23172,0.9271143), + (23300,0.0), + (23428,NULL), + (23556,0.01379231), + (23684,0.0557244), + (23812,NULL), + (23940,0.00256223), + (24068,0.05586718), + (24196,0.00675368); +INSERT INTO t1 (id,num) VALUES + (24324,0.00235754), + (24452,0.00048123), + (24580,0.00684315), + (24708,0.00022108), + (24836,0.8159851), + (24964,0.00049652), + (25092,0.11392157), + (25220,0.21413554), + (25348,0.00061148), + (25476,0.00622709); +INSERT INTO t1 (id,num) VALUES + (25604,0.00213495), + (25732,NULL), + (25860,NULL), + (25988,0.0), + (26116,0.02214408), + (26244,0.03450824), + (26372,0.85039985), + (26500,0.00969678), + (26628,0.01092109), + (26756,0.07614598); +INSERT INTO t1 (id,num) VALUES + (26884,0.02030184), + (27012,0.0), + (27140,0.7304159), + (27268,0.05062966), + (27396,0.07090286), + (27524,0.00589924), + (27652,0.00982369), + (27780,0.01139362), + (27908,0.12942761), + (28036,NULL); +INSERT INTO t1 (id,num) VALUES + (28164,0.973725), + (28292,0.0), + (28420,0.9658361), + (28548,0.7608606), + (28676,0.00033382), + (28804,0.0006193), + (28932,0.01344005), + (29060,0.00213988), + (29188,0.20606396), + (29316,NULL); +INSERT INTO t1 (id,num) VALUES + (29444,0.00029995), + (29572,0.11128831), + (29700,0.00022049), + (29828,0.09755096), + (29956,0.0), + (30084,0.15368505), + (30212,0.00385346), + (30340,NULL), + (30468,0.03264421), + (30596,NULL); +INSERT INTO t1 (id,num) VALUES + (30724,0.02093143), + (30852,0.00251696), + (30980,NULL), + (31108,0.5892975), + (31236,0.15591888), + (31364,NULL), + (31492,0.13643512), + (31620,0.0), + (31748,0.0124521), + (31876,0.10001199); +INSERT INTO t1 (id,num) VALUES + (32004,0.9572708), + (32132,0.2702167), + (32260,0.0), + (32388,NULL), + (32516,0.00197053), + (32644,NULL), + (32772,0.00294003), + (32900,0.0001796), + (33028,0.00109745), + (33156,0.00084148); +INSERT INTO t1 (id,num) VALUES + (33284,0.02335174), + (33412,NULL), + (33540,NULL), + (33668,0.00069347), + (33796,0.00317112), + (33924,0.00514138), + (34052,0.0), + (34180,0.20418067), + (34308,0.21699235), + (34436,0.00151851); +INSERT INTO t1 (id,num) VALUES + (34564,0.00260781), + (34692,0.00042542), + (34820,NULL), + (34948,0.0001932), + (35076,0.0), + (35204,0.00023503), + (35332,0.27567366), + (35460,0.00029132), + (35588,0.0038553), + (35716,0.00028413); +INSERT INTO t1 (id,num) VALUES + (35844,0.0001824), + (35972,0.8047172), + (36100,0.9117202), + (36228,0.00090282), + (36356,0.00003453), + (36484,0.00177934), + (36612,0.02046586), + (36740,0.00146691), + (36868,0.00613281), + (36996,0.02881232); +INSERT INTO t1 (id,num) VALUES + (37124,0.0), + (37252,0.5468523), + (37380,0.0), + (37508,NULL), + (37636,NULL), + (37764,0.08866176), + (37892,0.01583531), + (38020,0.00258847), + (38148,0.0), + (38276,0.0013263); +INSERT INTO t1 (id,num) VALUES + (38404,0.00610365), + (38532,0.0022153), + (38660,0.00080778), + (38788,0.19915293), + (38916,NULL), + (39044,0.0266057), + (39172,0.02324441), + (39300,0.00193156), + (39428,0.00059531), + (39556,0.10964896); +INSERT INTO t1 (id,num) VALUES + (39684,0.02697241), + (39812,0.00929319), + (39940,0.00053213), + (40068,0.0), + (40196,0.00294272), + (40324,NULL), + (40452,NULL), + (40580,NULL), + (40708,0.08479243), + (40836,NULL); +INSERT INTO t1 (id,num) VALUES + (40964,NULL), + (41092,0.2487916), + (41220,NULL), + (41348,0.00043917), + (41476,0.0), + (41604,0.00049506), + (41732,0.00250602), + (41860,0.00011041), + (41988,0.01406988), + (42116,0.00199188); +INSERT INTO t1 (id,num) VALUES + (42244,0.2924709), + (42372,NULL), + (42500,0.01702607), + (42628,NULL), + (42756,0.15324448), + (42884,0.13135524), + (43012,0.01943198), + (43140,0.00188494), + (43268,0.00071816), + (43396,0.00012918); +INSERT INTO t1 (id,num) VALUES + (43524,0.00498049), + (43652,0.13445085), + (43780,0.14880875), + (43908,0.00077732), + (44036,0.54969823), + (44164,0.02765146), + (44292,0.00238847), + (44420,0.93815935), + (44548,0.00112602), + (44676,0.00970578); +INSERT INTO t1 (id,num) VALUES + (44804,0.00539565), + (44932,0.00198959), + (45060,NULL), + (45188,0.0004845), + (45316,0.11085703), + (45444,0.00036987), + (45572,0.00451057), + (45700,0.00005143), + (45828,NULL), + (45956,0.02388487); +INSERT INTO t1 (id,num) VALUES + (46084,0.00037795), + (46212,NULL), + (46340,0.05443271), + (46468,0.02153216), + (46596,NULL), + (46724,0.0), + (46852,0.38851526), + (46980,0.7427731), + (47108,0.03969904), + (47236,0.00078965); +INSERT INTO t1 (id,num) VALUES + (47364,0.03562958), + (47492,0.00100583), + (47620,0.03697728), + (47748,0.08408318), + (47876,0.00057393), + (48004,0.00710408), + (48132,0.01589785), + (48260,NULL), + (48388,0.0029398), + (48516,0.0168582); +INSERT INTO t1 (id,num) VALUES + (48644,0.15535928), + (48772,0.04729551), + (48900,0.00045675), + (49028,0.111338), + (49156,0.05104741), + (49284,0.00957311), + (49412,0.00032368), + (49540,0.0011836), + (49668,0.59423715), + (49796,0.07930596); +INSERT INTO t1 (id,num) VALUES + (49924,0.00970574), + (50052,0.1389579), + (50180,0.01344621), + (50308,0.02605027), + (50436,0.81112456), + (50564,0.08266076), + (50692,0.00064055), + (50820,0.00506184), + (50948,0.07310118), + (51076,0.08932291); +INSERT INTO t1 (id,num) VALUES + (51204,0.00027035), + (51332,0.00340637), + (51460,0.03478277), + (51588,0.00016421), + (51716,0.01174176), + (51844,0.28394622), + (51972,0.09893544), + (52100,0.9233999), + (52228,0.00086335), + (52356,0.0101455); +INSERT INTO t1 (id,num) VALUES + (52484,0.0), + (52612,0.04069425), + (52740,0.00043829), + (52868,0.00023583), + (52996,0.00259821), + (53124,NULL), + (53252,0.13227282), + (53380,NULL), + (53508,0.00010061), + (53636,0.00038794); +INSERT INTO t1 (id,num) VALUES + (53764,0.34211513), + (53892,0.02905787), + (54020,0.06862675), + (54148,NULL), + (54276,0.0), + (54404,0.0), + (54532,0.00019574), + (54660,0.03211332), + (54788,0.61193645), + (54916,0.00076543); +INSERT INTO t1 (id,num) VALUES + (55044,0.0), + (55172,0.00331305), + (55300,0.28308892), + (55428,0.34937865), + (55556,0.0749846), + (55684,0.00009996), + (55812,0.0188099), + (55940,0.0161851), + (56068,NULL), + (56196,0.4822152); +INSERT INTO t1 (id,num) VALUES + (56324,0.00293867), + (56452,0.00180932), + (56580,0.00598398), + (56708,0.9666414), + (56836,0.01628674), + (56964,0.97586924), + (57092,0.000337), + (57220,0.01060274), + (57348,0.0002598), + (57476,0.00377207); +INSERT INTO t1 (id,num) VALUES + (57604,0.00066885), + (57732,0.12196585), + (57860,0.00030946), + (57988,0.20773576), + (58116,0.00061379), + (58244,0.01043255), + (58372,0.00191419), + (58500,0.001862), + (58628,NULL), + (58756,NULL); +INSERT INTO t1 (id,num) VALUES + (58884,NULL), + (59012,0.0), + (59140,0.00029226), + (59268,0.0), + (59396,0.00449778), + (59524,0.02558722), + (59652,NULL), + (59780,0.01153614), + (59908,0.0), + (60036,0.2763834); +INSERT INTO t1 (id,num) VALUES + (60164,NULL), + (60292,NULL), + (60420,0.00149), + (60548,0.9590044), + (60676,0.0), + (60804,0.02398982), + (60932,0.05412427), + (61060,0.00005242), + (61188,0.01232633), + (61316,0.0005189); +INSERT INTO t1 (id,num) VALUES + (61444,0.0), + (61572,0.00196546), + (61700,0.00716419), + (61828,0.0), + (61956,0.0), + (62084,0.00122224), + (62212,0.00988189), + (62340,NULL), + (62468,0.00006262), + (62596,0.00334187); +INSERT INTO t1 (id,num) VALUES + (62724,NULL), + (62852,0.11244337), + (62980,NULL), + (63108,0.4137224), + (63236,0.00094869), + (63364,0.00037691), + (63492,0.09065232), + (63620,0.70078176), + (63748,0.2610763), + (63876,0.58452475); +INSERT INTO t1 (id,num) VALUES + (64004,0.00037725), + (64132,0.01363691), + (64260,0.03295722), + (64388,0.00775894), + (64516,0.00597924), + (64644,0.00098757), + (64772,0.0), + (64900,0.02986313), + (65028,0.00005731), + (65156,0.259131); +INSERT INTO t1 (id,num) VALUES + (65284,0.00433746), + (65412,0.03780772), + (65540,0.00255001), + (65668,0.33036566), + (65796,0.00004995), + (65924,0.00010118), + (66052,0.0), + (66180,0.00053285), + (66308,NULL), + (66436,NULL); +INSERT INTO t1 (id,num) VALUES + (66564,0.00215946), + (66692,0.00012339), + (66820,0.20895952), + (66948,0.01364484), + (67076,0.00161306), + (67204,0.01784489), + (67332,0.51345026), + (67460,0.00022264), + (67588,0.5755771), + (67716,0.07973811); +INSERT INTO t1 (id,num) VALUES + (67844,0.00075325), + (67972,0.02588654), + (68100,0.0066424), + (68228,0.0), + (68356,NULL), + (68484,0.00452684), + (68612,0.0), + (68740,NULL), + (68868,0.00148165), + (68996,0.00069906); +INSERT INTO t1 (id,num) VALUES + (69124,0.36696395), + (69252,0.00176318), + (69380,0.0), + (69508,0.00322113), + (69636,0.66234267), + (69764,NULL), + (69892,0.17466402), + (70020,NULL), + (70148,0.3849655), + (70276,0.00634581); +INSERT INTO t1 (id,num) VALUES + (70404,0.00898295), + (70532,0.10214821), + (70660,0.03422715), + (70788,0.01116229), + (70916,0.40757605), + (71044,0.76234627), + (71172,0.00059572), + (71300,0.00323015), + (71428,0.00015896), + (71556,0.04674813); +INSERT INTO t1 (id,num) VALUES + (71684,0.00002449), + (71812,0.5066135), + (71940,0.94456), + (72068,0.00022794), + (72196,0.00155764), + (72324,0.00060991), + (72452,NULL), + (72580,0.0), + (72708,0.23283394), + (72836,0.04149162); +INSERT INTO t1 (id,num) VALUES + (72964,0.00059429), + (73092,0.0), + (73220,0.0), + (73348,0.19649409), + (73476,0.0017861), + (73604,0.0), + (73732,NULL), + (73860,0.02864335), + (73988,0.9), + (74116,0.01258155); +INSERT INTO t1 (id,num) VALUES + (74244,0.00925873), + (74372,0.00323526), + (74500,0.00258794), + (74628,0.09800948), + (74756,0.00680334), + (74884,NULL), + (75012,0.02857617), + (75140,0.06355022), + (75268,0.0), + (75396,0.01389665); +INSERT INTO t1 (id,num) VALUES + (75524,0.49072826), + (75652,0.00250901), + (75780,0.00081248), + (75908,0.02927421), + (76036,NULL), + (76164,0.01670666), + (76292,0.01635653), + (76420,NULL), + (76548,0.1040872), + (76676,0.10566042); +INSERT INTO t1 (id,num) VALUES + (76804,NULL), + (76932,0.00663577), + (77060,0.21661888), + (77188,0.45707023), + (77316,0.00272538), + (77444,0.00419203), + (77572,NULL), + (77700,0.00237827), + (77828,0.00146376), + (77956,0.03254667); +INSERT INTO t1 (id,num) VALUES + (78084,0.00237725), + (78212,NULL), + (78340,0.02337047), + (78468,0.6066429), + (78596,NULL), + (78724,0.99989676), + (78852,0.02890464), + (78980,0.07082515), + (79108,NULL), + (79236,0.0019473); +INSERT INTO t1 (id,num) VALUES + (79364,0.00358919), + (79492,NULL), + (79620,0.28481358), + (79748,0.00222982), + (79876,NULL), + (80004,0.00547454), + (80132,NULL), + (80260,0.0002941), + (80388,0.00061776), + (80516,0.00002488); +INSERT INTO t1 (id,num) VALUES + (80644,0.09067673), + (80772,0.97947466), + (80900,NULL), + (81028,0.00611359), + (81156,0.0001545), + (81284,NULL), + (81412,0.02183841), + (81540,0.01013091), + (81668,0.00044435), + (81796,0.00101722); +INSERT INTO t1 (id,num) VALUES + (81924,0.0), + (82052,0.01291962), + (82180,0.00089332), + (82308,NULL), + (82436,0.38697731), + (82564,0.0), + (82692,0.06748839), + (82820,0.00505329), + (82948,0.00197535), + (83076,NULL); +INSERT INTO t1 (id,num) VALUES + (83204,NULL), + (83332,0.02577116), + (83460,0.00040706), + (83588,0.00387944), + (83716,0.00060442), + (83844,0.00140539), + (83972,0.02212065), + (84100,0.0009958), + (84228,0.21305683), + (84356,0.01075263); +INSERT INTO t1 (id,num) VALUES + (84484,NULL), + (84612,0.04209423), + (84740,0.00016298), + (84868,0.00030807), + (84996,0.0033516), + (85124,0.01264506), + (85252,NULL), + (85380,0.00797018), + (85508,0.03014666), + (85636,0.0); +INSERT INTO t1 (id,num) VALUES + (85764,0.0198979), + (85892,NULL), + (86020,NULL), + (86148,0.00323176), + (86276,0.56539536), + (86404,0.04482054), + (86532,0.07097953), + (86660,0.00034572), + (86788,0.0), + (86916,0.00194455); +INSERT INTO t1 (id,num) VALUES + (87044,0.0), + (87172,0.0), + (87300,0.00335881), + (87428,0.6016782), + (87556,0.02347282), + (87684,0.0), + (87812,0.00998413), + (87940,0.10825046), + (88068,0.11218246), + (88196,NULL); +INSERT INTO t1 (id,num) VALUES + (88324,0.16741024), + (88452,0.00222767), + (88580,0.00215809), + (3,0.05589541), + (131,0.0), + (259,0.00747037), + (387,0.00063459), + (515,0.28516522), + (643,0.07687332), + (771,0.00015758); +INSERT INTO t1 (id,num) VALUES + (6019,0.36197448), + (6147,0.00694031), + (6275,NULL), + (6403,0.05160758), + (6531,0.98084956), + (6659,0.0), + (6787,0.00084533), + (6915,0.05876909), + (7043,NULL), + (7171,NULL); diff --git a/executor/tiflashtest/tiflash_test.go b/executor/tiflashtest/tiflash_test.go index d3c69b3988762..886c2012b0b00 100644 --- a/executor/tiflashtest/tiflash_test.go +++ b/executor/tiflashtest/tiflash_test.go @@ -72,7 +72,7 @@ func TestNonsupportCharsetTable(t *testing.T) { tk.MustExec("create table t(a int, b char(10) charset gbk collate gbk_bin)") err := tk.ExecToErr("alter table t set tiflash replica 1") require.Error(t, err) - require.Equal(t, "[ddl:8200]Unsupported ALTER table replica for table contain gbk charset", err.Error()) + require.Equal(t, "[ddl:8200]Unsupported ALTER TiFlash settings for tables not supported by TiFlash: table contains gbk charset", err.Error()) tk.MustExec("drop table if exists t") tk.MustExec("create table t(a char(10) charset utf8)") diff --git a/executor/write.go b/executor/write.go index 49707f6417bf5..2c9c8fe4107fa 100644 --- a/executor/write.go +++ b/executor/write.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/ast" @@ -80,6 +81,24 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old } } + // Handle exchange partition + tbl := t.Meta() + if tbl.ExchangePartitionInfo != nil && tbl.ExchangePartitionInfo.ExchangePartitionFlag { + is := sctx.GetDomainInfoSchema().(infoschema.InfoSchema) + pt, tableFound := is.TableByID(tbl.ExchangePartitionInfo.ExchangePartitionID) + if !tableFound { + return false, errors.Errorf("exchange partition process table by id failed") + } + p, ok := pt.(table.PartitionedTable) + if !ok { + return false, errors.Errorf("exchange partition process assert table partition failed") + } + err := p.CheckForExchangePartition(sctx, pt.Meta().Partition, newData, tbl.ExchangePartitionInfo.ExchangePartitionDefID) + if err != nil { + return false, err + } + } + // Compare datum, then handle some flags. for i, col := range t.Cols() { // We should use binary collation to compare datum, otherwise the result will be incorrect. diff --git a/expression/aggregation/aggregation.go b/expression/aggregation/aggregation.go index 19ab63afb28d3..5d22c587f3c34 100644 --- a/expression/aggregation/aggregation.go +++ b/expression/aggregation/aggregation.go @@ -222,8 +222,11 @@ func CheckAggPushFlash(aggFunc *AggFuncDesc) bool { } } switch aggFunc.Name { - case ast.AggFuncSum, ast.AggFuncCount, ast.AggFuncMin, ast.AggFuncMax, ast.AggFuncAvg, ast.AggFuncFirstRow, ast.AggFuncApproxCountDistinct, ast.AggFuncGroupConcat: + case ast.AggFuncCount, ast.AggFuncMin, ast.AggFuncMax, ast.AggFuncFirstRow, ast.AggFuncApproxCountDistinct: return true + case ast.AggFuncSum, ast.AggFuncAvg, ast.AggFuncGroupConcat: + // Now tiflash doesn't support CastJsonAsReal and CastJsonAsString. + return aggFunc.Args[0].GetType().GetType() != mysql.TypeJSON } return false } diff --git a/expression/builtin.go b/expression/builtin.go index 772ef5c5d48f1..b56b7208249f7 100644 --- a/expression/builtin.go +++ b/expression/builtin.go @@ -834,6 +834,7 @@ var funcs = map[string]functionClass{ ast.TiDBVersion: &tidbVersionFunctionClass{baseFunctionClass{ast.TiDBVersion, 0, 0}}, ast.TiDBIsDDLOwner: &tidbIsDDLOwnerFunctionClass{baseFunctionClass{ast.TiDBIsDDLOwner, 0, 0}}, ast.TiDBDecodePlan: &tidbDecodePlanFunctionClass{baseFunctionClass{ast.TiDBDecodePlan, 1, 1}}, + ast.TiDBDecodeBinaryPlan: &tidbDecodePlanFunctionClass{baseFunctionClass{ast.TiDBDecodeBinaryPlan, 1, 1}}, ast.TiDBDecodeSQLDigests: &tidbDecodeSQLDigestsFunctionClass{baseFunctionClass{ast.TiDBDecodeSQLDigests, 1, 2}}, // TiDB Sequence function. diff --git a/expression/builtin_arithmetic.go b/expression/builtin_arithmetic.go index 29579fb06a3f1..067b5c2b50d76 100644 --- a/expression/builtin_arithmetic.go +++ b/expression/builtin_arithmetic.go @@ -63,16 +63,32 @@ var ( // performed with the / operator. const precIncrement = 4 +// isConstantBinaryLiteral return true if expr is constant binary literal +func isConstantBinaryLiteral(expr Expression) bool { + if types.IsBinaryStr(expr.GetType()) { + if v, ok := expr.(*Constant); ok { + if k := v.Value.Kind(); k == types.KindBinaryLiteral { + return true + } + } + } + return false +} + // numericContextResultType returns types.EvalType for numeric function's parameters. // the returned types.EvalType should be one of: types.ETInt, types.ETDecimal, types.ETReal -func numericContextResultType(ft *types.FieldType) types.EvalType { +func numericContextResultType(expr Expression) types.EvalType { + ft := expr.GetType() if types.IsTypeTemporal(ft.GetType()) { if ft.GetDecimal() > 0 { return types.ETDecimal } return types.ETInt } - if types.IsBinaryStr(ft) || ft.GetType() == mysql.TypeBit { + // to solve https://github.com/pingcap/tidb/issues/27698 + // if expression is constant binary literal, like `0x1234`, `0b00011`, cast to integer + // for other binary str column related expression, like varbinary, cast to float/double. + if isConstantBinaryLiteral(expr) || ft.GetType() == mysql.TypeBit { return types.ETInt } evalTp4Ft := types.ETReal @@ -153,8 +169,7 @@ func (c *arithmeticPlusFunctionClass) getFunction(ctx sessionctx.Context, args [ if err := c.verifyArgs(args); err != nil { return nil, err } - lhsTp, rhsTp := args[0].GetType(), args[1].GetType() - lhsEvalTp, rhsEvalTp := numericContextResultType(lhsTp), numericContextResultType(rhsTp) + lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1]) if lhsEvalTp == types.ETReal || rhsEvalTp == types.ETReal { bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETReal, types.ETReal) if err != nil { @@ -305,8 +320,7 @@ func (c *arithmeticMinusFunctionClass) getFunction(ctx sessionctx.Context, args if err := c.verifyArgs(args); err != nil { return nil, err } - lhsTp, rhsTp := args[0].GetType(), args[1].GetType() - lhsEvalTp, rhsEvalTp := numericContextResultType(lhsTp), numericContextResultType(rhsTp) + lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1]) if lhsEvalTp == types.ETReal || rhsEvalTp == types.ETReal { bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETReal, types.ETReal) if err != nil { @@ -492,7 +506,7 @@ func (c *arithmeticMultiplyFunctionClass) getFunction(ctx sessionctx.Context, ar return nil, err } lhsTp, rhsTp := args[0].GetType(), args[1].GetType() - lhsEvalTp, rhsEvalTp := numericContextResultType(lhsTp), numericContextResultType(rhsTp) + lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1]) if lhsEvalTp == types.ETReal || rhsEvalTp == types.ETReal { bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETReal, types.ETReal) if err != nil { @@ -639,7 +653,7 @@ func (c *arithmeticDivideFunctionClass) getFunction(ctx sessionctx.Context, args return nil, err } lhsTp, rhsTp := args[0].GetType(), args[1].GetType() - lhsEvalTp, rhsEvalTp := numericContextResultType(lhsTp), numericContextResultType(rhsTp) + lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1]) if lhsEvalTp == types.ETReal || rhsEvalTp == types.ETReal { bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETReal, types.ETReal) if err != nil { @@ -732,9 +746,8 @@ func (c *arithmeticIntDivideFunctionClass) getFunction(ctx sessionctx.Context, a if err := c.verifyArgs(args); err != nil { return nil, err } - lhsTp, rhsTp := args[0].GetType(), args[1].GetType() - lhsEvalTp, rhsEvalTp := numericContextResultType(lhsTp), numericContextResultType(rhsTp) + lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1]) if lhsEvalTp == types.ETInt && rhsEvalTp == types.ETInt { bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETInt, types.ETInt) if err != nil { @@ -897,7 +910,7 @@ func (c *arithmeticModFunctionClass) getFunction(ctx sessionctx.Context, args [] return nil, err } lhsTp, rhsTp := args[0].GetType(), args[1].GetType() - lhsEvalTp, rhsEvalTp := numericContextResultType(lhsTp), numericContextResultType(rhsTp) + lhsEvalTp, rhsEvalTp := numericContextResultType(args[0]), numericContextResultType(args[1]) if lhsEvalTp == types.ETReal || rhsEvalTp == types.ETReal { bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETReal, types.ETReal) if err != nil { diff --git a/expression/builtin_cast.go b/expression/builtin_cast.go index cc7b9d3683b71..df7d66bce0b54 100644 --- a/expression/builtin_cast.go +++ b/expression/builtin_cast.go @@ -26,6 +26,7 @@ import ( "math" "strconv" "strings" + gotime "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/ast" @@ -524,7 +525,6 @@ func (b *builtinCastIntAsDecimalSig) evalDecimal(row chunk.Row) (res *types.MyDe if isNull || err != nil { return res, isNull, err } - if unsignedArgs0 := mysql.HasUnsignedFlag(b.args[0].GetType().GetFlag()); !mysql.HasUnsignedFlag(b.tp.GetFlag()) && !unsignedArgs0 { res = types.NewDecFromInt(val) // Round up to 0 if the value is negative but the expression eval type is unsigned in `UNION` statement @@ -1607,7 +1607,11 @@ func (b *builtinCastDurationAsTimeSig) evalTime(row chunk.Row) (res types.Time, return res, isNull, err } sc := b.ctx.GetSessionVars().StmtCtx - res, err = val.ConvertToTime(sc, b.tp.GetType()) + ts, err := getStmtTimestamp(b.ctx) + if err != nil { + ts = gotime.Now() + } + res, err = val.ConvertToTimeWithTimestamp(sc, b.tp.GetType(), ts) if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) } @@ -1773,7 +1777,7 @@ func (b *builtinCastJSONAsDurationSig) evalDuration(row chunk.Row) (res types.Du // in special cast context that negative unsigned num will be zero. type inCastContext int -func (i inCastContext) String() string { +func (inCastContext) String() string { return "__cast_ctx" } diff --git a/expression/builtin_cast_test.go b/expression/builtin_cast_test.go index 388925eb3d14a..bf37b37d5206e 100644 --- a/expression/builtin_cast_test.go +++ b/expression/builtin_cast_test.go @@ -255,14 +255,15 @@ func TestCastFunctions(t *testing.T) { } var ( - year, month, day = time.Now().In(time.UTC).Date() - curDateInt = int64(year*10000 + int(month)*100 + day) - curTimeInt = curDateInt*1000000 + 125959 - curTimeWithFspReal = float64(curTimeInt) + 0.555 - curTimeString = fmt.Sprintf("%4d-%02d-%02d 12:59:59", year, int(month), day) - curTimeWithFspString = fmt.Sprintf("%4d-%02d-%02d 12:59:59.555000", year, int(month), day) - tm = types.NewTime(types.FromDate(year, int(month), day, 12, 59, 59, 0), mysql.TypeDatetime, types.DefaultFsp) - tmWithFsp = types.NewTime(types.FromDate(year, int(month), day, 12, 59, 59, 555000), mysql.TypeDatetime, types.MaxFsp) + year, month, day = time.Now().In(time.UTC).Date() + curDateInt = int64(year*10000 + int(month)*100 + day) + curTimeInt = curDateInt*1000000 + 125959 + curTimeWithFspReal = float64(curTimeInt) + 0.555 + curTimeString = fmt.Sprintf("%4d-%02d-%02d 12:59:59", year, int(month), day) + curTimeWithFspString = fmt.Sprintf("%4d-%02d-%02d 12:59:59.555000", year, int(month), day) + tm = types.NewTime(types.FromDate(year, int(month), day, 12, 59, 59, 0), mysql.TypeDatetime, types.DefaultFsp) + tmWithFsp = types.NewTime(types.FromDate(year, int(month), day, 12, 59, 59, 555000), mysql.TypeDatetime, types.MaxFsp) + tmWithFspAndZeroMicrosecond = types.NewTime(types.FromDate(year, int(month), day, 12, 59, 59, 000000), mysql.TypeDatetime, types.MaxFsp) // timeDatum indicates datetime "curYear-curMonth-curDay 12:59:59". timeDatum = types.NewDatum(tm) // timeWithFspDatum indicates datetime "curYear-curMonth-curDay 12:59:59.555000". @@ -275,6 +276,9 @@ var ( durationWithFsp = types.Duration{ Duration: 12*time.Hour + 59*time.Minute + 59*time.Second + 555*time.Millisecond, Fsp: 3} + durationWithFspAndZeroMicrosecond = types.Duration{ + Duration: 12*time.Hour + 59*time.Minute + 59*time.Second, + Fsp: 3} // durationWithFspDatum indicates duration "12:59:59.555" durationWithFspDatum = types.NewDatum(durationWithFsp) dt = types.NewTime(types.FromDate(year, int(month), day, 0, 0, 0, 0), mysql.TypeDate, types.DefaultFsp) diff --git a/expression/builtin_cast_vec.go b/expression/builtin_cast_vec.go index 141ff49c26f13..2482739d0a9df 100644 --- a/expression/builtin_cast_vec.go +++ b/expression/builtin_cast_vec.go @@ -18,6 +18,7 @@ import ( "math" "strconv" "strings" + gotime "time" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -63,7 +64,7 @@ func (b *builtinCastIntAsDurationSig) vecEvalDuration(input *chunk.Chunk, result return nil } -func (b *builtinCastIntAsDurationSig) vectorized() bool { +func (*builtinCastIntAsDurationSig) vectorized() bool { return true } @@ -84,7 +85,7 @@ func (b *builtinCastIntAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.Co return nil } -func (b *builtinCastIntAsIntSig) vectorized() bool { +func (*builtinCastIntAsIntSig) vectorized() bool { return true } @@ -128,7 +129,7 @@ func (b *builtinCastIntAsRealSig) vecEvalReal(input *chunk.Chunk, result *chunk. return nil } -func (b *builtinCastIntAsRealSig) vectorized() bool { +func (*builtinCastIntAsRealSig) vectorized() bool { return true } @@ -153,11 +154,11 @@ func (b *builtinCastRealAsRealSig) vecEvalReal(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastRealAsRealSig) vectorized() bool { +func (*builtinCastRealAsRealSig) vectorized() bool { return true } -func (b *builtinCastTimeAsJSONSig) vectorized() bool { +func (*builtinCastTimeAsJSONSig) vectorized() bool { return true } @@ -189,7 +190,7 @@ func (b *builtinCastTimeAsJSONSig) vecEvalJSON(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastRealAsStringSig) vectorized() bool { +func (*builtinCastRealAsStringSig) vectorized() bool { return true } @@ -239,7 +240,7 @@ func (b *builtinCastRealAsStringSig) vecEvalString(input *chunk.Chunk, result *c return nil } -func (b *builtinCastDecimalAsStringSig) vectorized() bool { +func (*builtinCastDecimalAsStringSig) vectorized() bool { return true } @@ -279,7 +280,7 @@ func (b *builtinCastDecimalAsStringSig) vecEvalString(input *chunk.Chunk, result return nil } -func (b *builtinCastTimeAsDecimalSig) vectorized() bool { +func (*builtinCastTimeAsDecimalSig) vectorized() bool { return true } @@ -315,7 +316,7 @@ func (b *builtinCastTimeAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, result return nil } -func (b *builtinCastDurationAsIntSig) vectorized() bool { +func (*builtinCastDurationAsIntSig) vectorized() bool { return true } @@ -353,10 +354,9 @@ func (b *builtinCastDurationAsIntSig) vecEvalInt(input *chunk.Chunk, result *chu } } return nil - } -func (b *builtinCastIntAsTimeSig) vectorized() bool { +func (*builtinCastIntAsTimeSig) vectorized() bool { return true } @@ -406,7 +406,7 @@ func (b *builtinCastIntAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk. return nil } -func (b *builtinCastRealAsJSONSig) vectorized() bool { +func (*builtinCastRealAsJSONSig) vectorized() bool { return true } @@ -433,7 +433,7 @@ func (b *builtinCastRealAsJSONSig) vecEvalJSON(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastJSONAsRealSig) vectorized() bool { +func (*builtinCastJSONAsRealSig) vectorized() bool { return true } @@ -464,7 +464,7 @@ func (b *builtinCastJSONAsRealSig) vecEvalReal(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastJSONAsTimeSig) vectorized() bool { +func (*builtinCastJSONAsTimeSig) vectorized() bool { return true } @@ -509,7 +509,7 @@ func (b *builtinCastJSONAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastRealAsTimeSig) vectorized() bool { +func (*builtinCastRealAsTimeSig) vectorized() bool { return true } @@ -556,7 +556,7 @@ func (b *builtinCastRealAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastDecimalAsDecimalSig) vectorized() bool { +func (*builtinCastDecimalAsDecimalSig) vectorized() bool { return true } @@ -587,7 +587,7 @@ func (b *builtinCastDecimalAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, resu return nil } -func (b *builtinCastDurationAsTimeSig) vectorized() bool { +func (*builtinCastDurationAsTimeSig) vectorized() bool { return true } @@ -608,6 +608,10 @@ func (b *builtinCastDurationAsTimeSig) vecEvalTime(input *chunk.Chunk, result *c ds := buf.GoDurations() times := result.Times() stmtCtx := b.ctx.GetSessionVars().StmtCtx + ts, err := getStmtTimestamp(b.ctx) + if err != nil { + ts = gotime.Now() + } fsp := b.tp.GetDecimal() for i := 0; i < n; i++ { if result.IsNull(i) { @@ -616,7 +620,7 @@ func (b *builtinCastDurationAsTimeSig) vecEvalTime(input *chunk.Chunk, result *c duration.Duration = ds[i] duration.Fsp = fsp - tm, err := duration.ConvertToTime(stmtCtx, b.tp.GetType()) + tm, err := duration.ConvertToTimeWithTimestamp(stmtCtx, b.tp.GetType(), ts) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return err @@ -633,7 +637,7 @@ func (b *builtinCastDurationAsTimeSig) vecEvalTime(input *chunk.Chunk, result *c return nil } -func (b *builtinCastIntAsStringSig) vectorized() bool { +func (*builtinCastIntAsStringSig) vectorized() bool { return true } @@ -685,7 +689,7 @@ func (b *builtinCastIntAsStringSig) vecEvalString(input *chunk.Chunk, result *ch return nil } -func (b *builtinCastRealAsIntSig) vectorized() bool { +func (*builtinCastRealAsIntSig) vectorized() bool { return true } @@ -730,7 +734,7 @@ func (b *builtinCastRealAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.C return nil } -func (b *builtinCastTimeAsRealSig) vectorized() bool { +func (*builtinCastTimeAsRealSig) vectorized() bool { return true } @@ -768,7 +772,7 @@ func (b *builtinCastTimeAsRealSig) vecEvalReal(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastStringAsJSONSig) vectorized() bool { +func (*builtinCastStringAsJSONSig) vectorized() bool { return true } @@ -810,7 +814,7 @@ func (b *builtinCastStringAsJSONSig) vecEvalJSON(input *chunk.Chunk, result *chu return nil } -func (b *builtinCastRealAsDecimalSig) vectorized() bool { +func (*builtinCastRealAsDecimalSig) vectorized() bool { return true } @@ -855,7 +859,7 @@ func (b *builtinCastRealAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, result return nil } -func (b *builtinCastStringAsIntSig) vectorized() bool { +func (*builtinCastStringAsIntSig) vectorized() bool { return true } @@ -918,7 +922,7 @@ func (b *builtinCastStringAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastStringAsDurationSig) vectorized() bool { +func (*builtinCastStringAsDurationSig) vectorized() bool { return true } @@ -957,7 +961,7 @@ func (b *builtinCastStringAsDurationSig) vecEvalDuration(input *chunk.Chunk, res return nil } -func (b *builtinCastDurationAsDecimalSig) vectorized() bool { +func (*builtinCastDurationAsDecimalSig) vectorized() bool { return true } @@ -996,7 +1000,7 @@ func (b *builtinCastDurationAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, res return nil } -func (b *builtinCastIntAsDecimalSig) vectorized() bool { +func (*builtinCastIntAsDecimalSig) vectorized() bool { return true } @@ -1042,7 +1046,7 @@ func (b *builtinCastIntAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, result * return nil } -func (b *builtinCastIntAsJSONSig) vectorized() bool { +func (*builtinCastIntAsJSONSig) vectorized() bool { return true } @@ -1087,7 +1091,7 @@ func (b *builtinCastIntAsJSONSig) vecEvalJSON(input *chunk.Chunk, result *chunk. return nil } -func (b *builtinCastJSONAsJSONSig) vectorized() bool { +func (*builtinCastJSONAsJSONSig) vectorized() bool { return true } @@ -1095,7 +1099,7 @@ func (b *builtinCastJSONAsJSONSig) vecEvalJSON(input *chunk.Chunk, result *chunk return b.args[0].VecEvalJSON(b.ctx, input, result) } -func (b *builtinCastJSONAsStringSig) vectorized() bool { +func (*builtinCastJSONAsStringSig) vectorized() bool { return true } @@ -1121,7 +1125,7 @@ func (b *builtinCastJSONAsStringSig) vecEvalString(input *chunk.Chunk, result *c return nil } -func (b *builtinCastDurationAsRealSig) vectorized() bool { +func (*builtinCastDurationAsRealSig) vectorized() bool { return true } @@ -1160,7 +1164,7 @@ func (b *builtinCastDurationAsRealSig) vecEvalReal(input *chunk.Chunk, result *c return nil } -func (b *builtinCastJSONAsIntSig) vectorized() bool { +func (*builtinCastJSONAsIntSig) vectorized() bool { return true } @@ -1191,7 +1195,7 @@ func (b *builtinCastJSONAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.C return nil } -func (b *builtinCastRealAsDurationSig) vectorized() bool { +func (*builtinCastRealAsDurationSig) vectorized() bool { return true } @@ -1231,7 +1235,7 @@ func (b *builtinCastRealAsDurationSig) vecEvalDuration(input *chunk.Chunk, resul return nil } -func (b *builtinCastTimeAsDurationSig) vectorized() bool { +func (*builtinCastTimeAsDurationSig) vectorized() bool { return true } @@ -1266,7 +1270,7 @@ func (b *builtinCastTimeAsDurationSig) vecEvalDuration(input *chunk.Chunk, resul return nil } -func (b *builtinCastDurationAsDurationSig) vectorized() bool { +func (*builtinCastDurationAsDurationSig) vectorized() bool { return true } @@ -1295,7 +1299,7 @@ func (b *builtinCastDurationAsDurationSig) vecEvalDuration(input *chunk.Chunk, r return nil } -func (b *builtinCastDurationAsStringSig) vectorized() bool { +func (*builtinCastDurationAsStringSig) vectorized() bool { return true } @@ -1337,7 +1341,7 @@ func (b *builtinCastDurationAsStringSig) vecEvalString(input *chunk.Chunk, resul return nil } -func (b *builtinCastDecimalAsRealSig) vectorized() bool { +func (*builtinCastDecimalAsRealSig) vectorized() bool { return true } @@ -1383,7 +1387,7 @@ func (b *builtinCastDecimalAsRealSig) vecEvalReal(input *chunk.Chunk, result *ch return nil } -func (b *builtinCastDecimalAsTimeSig) vectorized() bool { +func (*builtinCastDecimalAsTimeSig) vectorized() bool { return true } @@ -1425,7 +1429,7 @@ func (b *builtinCastDecimalAsTimeSig) vecEvalTime(input *chunk.Chunk, result *ch return nil } -func (b *builtinCastTimeAsIntSig) vectorized() bool { +func (*builtinCastTimeAsIntSig) vectorized() bool { return true } @@ -1461,7 +1465,7 @@ func (b *builtinCastTimeAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.C return nil } -func (b *builtinCastTimeAsTimeSig) vectorized() bool { +func (*builtinCastTimeAsTimeSig) vectorized() bool { return true } @@ -1500,7 +1504,7 @@ func (b *builtinCastTimeAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk return nil } -func (b *builtinCastTimeAsStringSig) vectorized() bool { +func (*builtinCastTimeAsStringSig) vectorized() bool { return true } @@ -1542,7 +1546,7 @@ func (b *builtinCastTimeAsStringSig) vecEvalString(input *chunk.Chunk, result *c return nil } -func (b *builtinCastJSONAsDecimalSig) vectorized() bool { +func (*builtinCastJSONAsDecimalSig) vectorized() bool { return true } @@ -1577,7 +1581,7 @@ func (b *builtinCastJSONAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, result return nil } -func (b *builtinCastStringAsRealSig) vectorized() bool { +func (*builtinCastStringAsRealSig) vectorized() bool { return true } @@ -1626,7 +1630,7 @@ func (b *builtinCastStringAsRealSig) vecEvalReal(input *chunk.Chunk, result *chu return nil } -func (b *builtinCastStringAsDecimalSig) vectorized() bool { +func (*builtinCastStringAsDecimalSig) vectorized() bool { return true } @@ -1668,7 +1672,7 @@ func (b *builtinCastStringAsDecimalSig) vecEvalDecimal(input *chunk.Chunk, resul return nil } -func (b *builtinCastStringAsTimeSig) vectorized() bool { +func (*builtinCastStringAsTimeSig) vectorized() bool { return true } @@ -1717,7 +1721,7 @@ func (b *builtinCastStringAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chu return nil } -func (b *builtinCastDecimalAsIntSig) vectorized() bool { +func (*builtinCastDecimalAsIntSig) vectorized() bool { return true } @@ -1770,7 +1774,7 @@ func (b *builtinCastDecimalAsIntSig) vecEvalInt(input *chunk.Chunk, result *chun return nil } -func (b *builtinCastDecimalAsDurationSig) vectorized() bool { +func (*builtinCastDecimalAsDurationSig) vectorized() bool { return true } @@ -1811,7 +1815,7 @@ func (b *builtinCastDecimalAsDurationSig) vecEvalDuration(input *chunk.Chunk, re return nil } -func (b *builtinCastStringAsStringSig) vectorized() bool { +func (*builtinCastStringAsStringSig) vectorized() bool { return true } @@ -1852,7 +1856,7 @@ func (b *builtinCastStringAsStringSig) vecEvalString(input *chunk.Chunk, result return nil } -func (b *builtinCastJSONAsDurationSig) vectorized() bool { +func (*builtinCastJSONAsDurationSig) vectorized() bool { return true } @@ -1892,7 +1896,7 @@ func (b *builtinCastJSONAsDurationSig) vecEvalDuration(input *chunk.Chunk, resul return nil } -func (b *builtinCastDecimalAsJSONSig) vectorized() bool { +func (*builtinCastDecimalAsJSONSig) vectorized() bool { return true } @@ -1925,7 +1929,7 @@ func (b *builtinCastDecimalAsJSONSig) vecEvalJSON(input *chunk.Chunk, result *ch return nil } -func (b *builtinCastDurationAsJSONSig) vectorized() bool { +func (*builtinCastDurationAsJSONSig) vectorized() bool { return true } diff --git a/expression/builtin_compare.go b/expression/builtin_compare.go index 6ef85a4b9c057..f02e45cc8bbac 100644 --- a/expression/builtin_compare.go +++ b/expression/builtin_compare.go @@ -135,11 +135,6 @@ func (c *coalesceFunctionClass) getFunction(ctx sessionctx.Context, args []Expre fieldEvalTps = append(fieldEvalTps, retEvalTp) } - fsp, err := getExpressionFsp(ctx, args[0]) - if err != nil { - return nil, err - } - bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, retEvalTp, fieldEvalTps...) if err != nil { return nil, err @@ -214,10 +209,11 @@ func (c *coalesceFunctionClass) getFunction(ctx sessionctx.Context, args []Expre sig = &builtinCoalesceStringSig{bf} sig.setPbCode(tipb.ScalarFuncSig_CoalesceString) case types.ETDatetime, types.ETTimestamp: + bf.tp.SetDecimal(resultFieldType.GetDecimal()) sig = &builtinCoalesceTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_CoalesceTime) case types.ETDuration: - bf.tp.SetDecimal(fsp) + bf.tp.SetDecimal(resultFieldType.GetDecimal()) sig = &builtinCoalesceDurationSig{bf} sig.setPbCode(tipb.ScalarFuncSig_CoalesceDuration) case types.ETJson: @@ -329,8 +325,10 @@ func (b *builtinCoalesceTimeSig) Clone() builtinFunc { } func (b *builtinCoalesceTimeSig) evalTime(row chunk.Row) (res types.Time, isNull bool, err error) { + fsp := b.tp.GetDecimal() for _, a := range b.getArgs() { res, isNull, err = a.EvalTime(b.ctx, row) + res.SetFsp(fsp) if err != nil || !isNull { break } @@ -353,6 +351,7 @@ func (b *builtinCoalesceDurationSig) Clone() builtinFunc { func (b *builtinCoalesceDurationSig) evalDuration(row chunk.Row) (res types.Duration, isNull bool, err error) { for _, a := range b.getArgs() { res, isNull, err = a.EvalDuration(b.ctx, row) + res.Fsp = b.tp.GetDecimal() if err != nil || !isNull { break } diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index 89439f245dd82..9e006da275fdf 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -185,7 +185,13 @@ func TestCoalesce(t *testing.T) { {[]interface{}{nil, types.NewDecFromFloatForTest(123.456)}, types.NewDecFromFloatForTest(123.456), false, false}, {[]interface{}{1, types.NewDecFromFloatForTest(123.456)}, types.NewDecFromInt(1), false, false}, {[]interface{}{nil, duration}, duration, false, false}, + {[]interface{}{nil, durationWithFsp}, durationWithFsp, false, false}, + {[]interface{}{durationWithFsp, duration}, durationWithFsp, false, false}, + {[]interface{}{duration, durationWithFsp}, durationWithFspAndZeroMicrosecond, false, false}, {[]interface{}{nil, tm, nil}, tm, false, false}, + {[]interface{}{nil, tmWithFsp, nil}, tmWithFsp, false, false}, + {[]interface{}{tmWithFsp, tm, nil}, tmWithFsp, false, false}, + {[]interface{}{tm, tmWithFsp, nil}, tmWithFspAndZeroMicrosecond, false, false}, {[]interface{}{nil, dt, nil}, dt, false, false}, {[]interface{}{tm, dt}, tm, false, false}, } @@ -203,7 +209,11 @@ func TestCoalesce(t *testing.T) { if test.isNil { require.Equal(t, types.KindNull, d.Kind()) } else { - require.Equal(t, test.expected, d.GetValue()) + if f.GetType().EvalType() == types.ETDuration { + require.Equal(t, test.expected.(types.Duration).String(), d.GetValue().(types.Duration).String()) + } else { + require.Equal(t, test.expected, d.GetValue()) + } } } } diff --git a/expression/builtin_compare_vec_generated.go b/expression/builtin_compare_vec_generated.go index f93ba43005e63..7149807860aa1 100644 --- a/expression/builtin_compare_vec_generated.go +++ b/expression/builtin_compare_vec_generated.go @@ -1883,6 +1883,7 @@ func (b *builtinCoalesceTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk.C beforeWarns := sc.WarningCount() for j := 0; j < len(b.args); j++ { err := b.args[j].VecEvalTime(b.ctx, input, buf1) + fsp := b.tp.GetDecimal() afterWarns := sc.WarningCount() if err != nil || afterWarns > beforeWarns { if afterWarns > beforeWarns { @@ -1894,6 +1895,7 @@ func (b *builtinCoalesceTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk.C for i := 0; i < n; i++ { if !buf1.IsNull(i) && result.IsNull(i) { i64s[i] = args[i] + i64s[i].SetFsp(fsp) result.SetNull(i, false) } } diff --git a/expression/builtin_info.go b/expression/builtin_info.go index 1e61039b5d018..446f38fd9c409 100644 --- a/expression/builtin_info.go +++ b/expression/builtin_info.go @@ -25,6 +25,7 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/privilege" @@ -938,8 +939,12 @@ func (c *tidbDecodePlanFunctionClass) getFunction(ctx sessionctx.Context, args [ if err != nil { return nil, err } - sig := &builtinTiDBDecodePlanSig{bf} - return sig, nil + if c.funcName == ast.TiDBDecodePlan { + return &builtinTiDBDecodePlanSig{bf}, nil + } else if c.funcName == ast.TiDBDecodeBinaryPlan { + return &builtinTiDBDecodeBinaryPlanSig{bf}, nil + } + return nil, errors.New("unknown decode plan function") } type builtinTiDBDecodePlanSig struct { @@ -964,6 +969,29 @@ func (b *builtinTiDBDecodePlanSig) evalString(row chunk.Row) (string, bool, erro return planTree, false, nil } +type builtinTiDBDecodeBinaryPlanSig struct { + baseBuiltinFunc +} + +func (b *builtinTiDBDecodeBinaryPlanSig) Clone() builtinFunc { + newSig := &builtinTiDBDecodeBinaryPlanSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinTiDBDecodeBinaryPlanSig) evalString(row chunk.Row) (string, bool, error) { + planString, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return "", isNull, err + } + planTree, err := plancodec.DecodeBinaryPlan(planString) + if err != nil { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return "", false, nil + } + return planTree, false, nil +} + type nextValFunctionClass struct { baseFunctionClass } diff --git a/expression/builtin_time.go b/expression/builtin_time.go index d5d17bd4a6ecb..c54e0aecd79a6 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -2565,36 +2565,40 @@ func (c *extractFunctionClass) getFunction(ctx sessionctx.Context, args []Expres return nil, err } - datetimeUnits := map[string]struct{}{ - "DAY": {}, - "WEEK": {}, - "MONTH": {}, - "QUARTER": {}, - "YEAR": {}, - "DAY_MICROSECOND": {}, - "DAY_SECOND": {}, - "DAY_MINUTE": {}, - "DAY_HOUR": {}, - "YEAR_MONTH": {}, - } - isDatetimeUnit := true args[0] = WrapWithCastAsString(ctx, args[0]) - if _, isCon := args[0].(*Constant); isCon { - unit, _, err1 := args[0].EvalString(ctx, chunk.Row{}) - if err1 != nil { - return nil, err1 - } - _, isDatetimeUnit = datetimeUnits[unit] + unit, _, err := args[0].EvalString(ctx, chunk.Row{}) + if err != nil { + return nil, err } + isClockUnit := types.IsClockUnit(unit) + isDateUnit := types.IsDateUnit(unit) var bf baseBuiltinFunc - if isDatetimeUnit { - if args[1].GetType().EvalType() != types.ETString { + if isClockUnit && isDateUnit { + // For unit DAY_MICROSECOND/DAY_SECOND/DAY_MINUTE/DAY_HOUR, the interpretation of the second argument depends on its evaluation type: + // 1. Datetime/timestamp are interpreted as datetime. For example: + // extract(day_second from datetime('2001-01-01 02:03:04')) = 120304 + // Note that MySQL 5.5+ has a bug of no day portion in the result (20304) for this case, see https://bugs.mysql.com/bug.php?id=73240. + // 2. Time is interpreted as is. For example: + // extract(day_second from time('02:03:04')) = 20304 + // Note that time shouldn't be implicitly cast to datetime, or else the date portion will be padded with the current date and this will adjust time portion accordingly. + // 3. Otherwise, string/int/float are interpreted as arbitrarily either datetime or time, depending on which fits. For example: + // extract(day_second from '2001-01-01 02:03:04') = 1020304 // datetime + // extract(day_second from 20010101020304) = 1020304 // datetime + // extract(day_second from '01 02:03:04') = 260304 // time + if args[1].GetType().EvalType() == types.ETDatetime || args[1].GetType().EvalType() == types.ETTimestamp { bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDatetime) if err != nil { return nil, err } sig = &builtinExtractDatetimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_ExtractDatetime) + } else if args[1].GetType().EvalType() == types.ETDuration { + bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDuration) + if err != nil { + return nil, err + } + sig = &builtinExtractDurationSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_ExtractDuration) } else { bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETString) if err != nil { @@ -2604,13 +2608,22 @@ func (c *extractFunctionClass) getFunction(ctx sessionctx.Context, args []Expres sig = &builtinExtractDatetimeFromStringSig{bf} sig.setPbCode(tipb.ScalarFuncSig_ExtractDatetimeFromString) } - } else { + } else if isClockUnit { + // Clock units interpret the second argument as time. bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDuration) if err != nil { return nil, err } sig = &builtinExtractDurationSig{bf} sig.setPbCode(tipb.ScalarFuncSig_ExtractDuration) + } else { + // Date units interpret the second argument as datetime. + bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDatetime) + if err != nil { + return nil, err + } + sig = &builtinExtractDatetimeSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_ExtractDatetime) } return sig, nil } @@ -2625,7 +2638,7 @@ func (b *builtinExtractDatetimeFromStringSig) Clone() builtinFunc { return newSig } -// evalInt evals a builtinExtractDatetimeSig. +// 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(row chunk.Row) (int64, bool, error) { unit, isNull, err := b.args[0].EvalString(b.ctx, row) @@ -2637,8 +2650,7 @@ func (b *builtinExtractDatetimeFromStringSig) evalInt(row chunk.Row) (int64, boo return 0, isNull, err } sc := b.ctx.GetSessionVars().StmtCtx - switch strings.ToUpper(unit) { - case "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", "DAY_HOUR": + if types.IsClockUnit(unit) && types.IsDateUnit(unit) { dur, _, err := types.ParseDuration(sc, dtStr, types.GetFsp(dtStr)) if err != nil { return 0, true, err @@ -2656,22 +2668,8 @@ func (b *builtinExtractDatetimeFromStringSig) evalInt(row chunk.Row) (int64, boo } return res, err != nil, err } - dt, err := types.ParseDatetime(sc, dtStr) - if err != nil { - if !terror.ErrorEqual(err, types.ErrWrongValue) { - return 0, true, err - } - } - if dt.IsZero() { - dt.SetFsp(b.args[1].GetType().GetDecimal()) - if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - isNull, err := handleInvalidZeroTime(b.ctx, dt) - return 0, isNull, err - } - return 0, false, nil - } - res, err := types.ExtractDatetimeNum(&dt, unit) - return res, err != nil, err + + panic("Unexpected unit for extract") } type builtinExtractDatetimeSig struct { @@ -6454,19 +6452,6 @@ func (b *builtinTidbParseTsoSig) evalTime(row chunk.Row) (types.Time, bool, erro return result, false, nil } -func handleInvalidZeroTime(ctx sessionctx.Context, t types.Time) (bool, error) { - // MySQL compatibility, #11203 - // 0 | 0.0 should be converted to null without warnings - n, err := t.ToNumber().ToInt() - isOriginalIntOrDecimalZero := err == nil && n == 0 - // Args like "0000-00-00", "0000-00-00 00:00:00" set Fsp to 6 - isOriginalStringZero := t.Fsp() > 0 - if isOriginalIntOrDecimalZero && !isOriginalStringZero { - return false, nil - } - return true, handleInvalidTimeError(ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())) -} - // tidbBoundedStalenessFunctionClass reads a time window [a, b] and compares it with the latest SafeTS // to determine which TS to use in a read only transaction. type tidbBoundedStalenessFunctionClass struct { diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 4baf924a1b4ff..d63bc2b95af40 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -522,6 +522,7 @@ func TestExprPushDownToFlash(t *testing.T) { int32Column := genColumn(mysql.TypeLong, 8) float32Column := genColumn(mysql.TypeFloat, 9) enumColumn := genColumn(mysql.TypeEnum, 10) + durationColumn := genColumn(mysql.TypeDuration, 11) function, err := NewFunction(mock.NewContext(), ast.JSONLength, types.NewFieldType(mysql.TypeLonglong), jsonColumn) require.NoError(t, err) @@ -550,7 +551,10 @@ func TestExprPushDownToFlash(t *testing.T) { exprs = append(exprs, function) // ExtractDatetime: can be pushed - function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, datetimeColumn) + extractDatetimeUnitCol := new(Constant) + extractDatetimeUnitCol.Value = types.NewStringDatum("day") + extractDatetimeUnitCol.RetType = types.NewFieldType(mysql.TypeString) + function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), extractDatetimeUnitCol, datetimeColumn) require.NoError(t, err) exprs = append(exprs, function) @@ -849,6 +853,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.Equal(t, tipb.ScalarFuncSig_DayOfMonth, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.Repeat, types.NewFieldType(mysql.TypeString), stringColumn, intColumn) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_Repeat, function.(*ScalarFunction).Function.PbCode()) + exprs = append(exprs, function) + // Datediff function, err = NewFunction(mock.NewContext(), ast.DateDiff, types.NewFieldType(mysql.TypeLonglong), datetimeColumn, datetimeColumn) require.NoError(t, err) @@ -955,7 +964,10 @@ func TestExprPushDownToFlash(t *testing.T) { exprs = append(exprs, function) // ExtractDatetimeFromString: can not be pushed - function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, stringColumn) + extractDatetimeFromStringUnitCol := new(Constant) + extractDatetimeFromStringUnitCol.Value = types.NewStringDatum("day_microsecond") + extractDatetimeFromStringUnitCol.RetType = types.NewFieldType(mysql.TypeString) + function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), extractDatetimeFromStringUnitCol, stringColumn) require.NoError(t, err) exprs = append(exprs, function) @@ -1125,6 +1137,26 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // TimeToSec + function, err = NewFunction(mock.NewContext(), ast.TimeToSec, types.NewFieldType(mysql.TypeDuration), durationColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // ScalarFuncSig_RightShift + function, err = NewFunction(mock.NewContext(), ast.RightShift, types.NewFieldType(mysql.TypeLonglong), intColumn, intColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // ReverseUTF8 test + function, err = NewFunction(mock.NewContext(), ast.Reverse, types.NewFieldType(mysql.TypeString), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // Reverse + function, err = NewFunction(mock.NewContext(), ast.Reverse, types.NewFieldType(mysql.TypeBlob), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) require.Len(t, pushed, len(exprs)) require.Len(t, remained, 0) @@ -1158,6 +1190,10 @@ func TestExprOnlyPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.GetFormat, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.TimestampDiff, types.NewFieldType(mysql.TypeLonglong), stringColumn, datetimeColumn, datetimeColumn) require.NoError(t, err) exprs = append(exprs, function) diff --git a/expression/expression.go b/expression/expression.go index 9965ce0a7cecc..81252879688f2 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -1043,7 +1043,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { return true } case - ast.LogicOr, ast.LogicAnd, ast.UnaryNot, ast.BitNeg, ast.Xor, ast.And, ast.Or, + ast.LogicOr, ast.LogicAnd, ast.UnaryNot, ast.BitNeg, ast.Xor, ast.And, ast.Or, ast.RightShift, ast.GE, ast.LE, ast.EQ, ast.NE, ast.LT, ast.GT, ast.In, ast.IsNull, ast.Like, ast.Strcmp, ast.Plus, ast.Minus, ast.Div, ast.Mul, ast.Abs, ast.Mod, ast.If, ast.Ifnull, ast.Case, @@ -1055,11 +1055,12 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { 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.JSONLength, ast.Repeat, ast.InetNtoa, ast.InetAton, ast.Inet6Ntoa, ast.Inet6Aton, ast.Coalesce, ast.ASCII, ast.Length, ast.Trim, ast.Position, ast.Format, ast.LTrim, ast.RTrim, ast.Lpad, ast.Rpad, ast.Regexp, - ast.Hour, ast.Minute, ast.Second, ast.MicroSecond: + ast.Hour, ast.Minute, ast.Second, ast.MicroSecond, + ast.TimeToSec: switch function.Function.PbCode() { case tipb.ScalarFuncSig_InDuration, tipb.ScalarFuncSig_CoalesceDuration, @@ -1069,7 +1070,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { return false } return true - case ast.Substr, ast.Substring, ast.Left, ast.Right, ast.CharLength, ast.SubstringIndex: + case ast.Substr, ast.Substring, ast.Left, ast.Right, ast.CharLength, ast.SubstringIndex, ast.Reverse: switch function.Function.PbCode() { case tipb.ScalarFuncSig_LeftUTF8, @@ -1077,7 +1078,9 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { tipb.ScalarFuncSig_CharLengthUTF8, tipb.ScalarFuncSig_Substring2ArgsUTF8, tipb.ScalarFuncSig_Substring3ArgsUTF8, - tipb.ScalarFuncSig_SubstringIndex: + tipb.ScalarFuncSig_SubstringIndex, + tipb.ScalarFuncSig_ReverseUTF8, + tipb.ScalarFuncSig_Reverse: return true } case ast.Cast: @@ -1155,6 +1158,8 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { } case ast.IsTruthWithNull, ast.IsTruthWithoutNull, ast.IsFalsity: return true + case ast.GetFormat: + return true } return false } diff --git a/expression/generator/compare_vec.go b/expression/generator/compare_vec.go index dac52ca5a1be1..42004f3d5006c 100644 --- a/expression/generator/compare_vec.go +++ b/expression/generator/compare_vec.go @@ -224,6 +224,9 @@ func (b *builtin{{ .compare.CompareName }}{{ .type.TypeName }}Sig) vecEval{{ .ty beforeWarns := sc.WarningCount() for j := 0; j < len(b.args); j++{ err := b.args[j].VecEval{{ .type.TypeName }}(b.ctx, input, buf1) + {{- if eq .type.TypeName "Time" }} + fsp := b.tp.GetDecimal() + {{- end }} afterWarns := sc.WarningCount() if err != nil || afterWarns > beforeWarns { if afterWarns > beforeWarns { @@ -235,6 +238,9 @@ func (b *builtin{{ .compare.CompareName }}{{ .type.TypeName }}Sig) vecEval{{ .ty for i := 0; i < n; i++ { if !buf1.IsNull(i) && result.IsNull(i) { i64s[i] = args[i] + {{- if eq .type.TypeName "Time" }} + i64s[i].SetFsp(fsp) + {{- end }} result.SetNull(i, false) } } diff --git a/expression/integration_serial_test.go b/expression/integration_serial_test.go index fc4ecda462208..bedb737134f6e 100644 --- a/expression/integration_serial_test.go +++ b/expression/integration_serial_test.go @@ -2612,6 +2612,10 @@ func TestTimeBuiltin(t *testing.T) { result.Check(testkit.Rows("112 36 12 24")) result = tk.MustQuery("select extract(day_microsecond from cast('2017-01-01 12:12:12' as datetime)), extract(day_second from cast('2017-01-01 12:12:12' as datetime)), extract(day_minute from cast('2017-01-01 12:12:12' as datetime)), extract(day_hour from cast('2017-01-01 12:12:12' as datetime))") result.Check(testkit.Rows("1121212000000 1121212 11212 112")) + result = tk.MustQuery("select extract(day_microsecond from cast(20010101020304.050607 as decimal(20,6))), extract(day_second from cast(20010101020304.050607 as decimal(20,6))), extract(day_minute from cast(20010101020304.050607 as decimal(20,6))), extract(day_hour from cast(20010101020304.050607 as decimal(20,6))), extract(day from cast(20010101020304.050607 as decimal(20,6)))") + result.Check(testkit.Rows("1020304050607 1020304 10203 102 1")) + result = tk.MustQuery("select extract(day_microsecond from cast(1020304.050607 as decimal(20,6))), extract(day_second from cast(1020304.050607 as decimal(20,6))), extract(day_minute from cast(1020304.050607 as decimal(20,6))), extract(day_hour from cast(1020304.050607 as decimal(20,6))), extract(day from cast(1020304.050607 as decimal(20,6)))") + result.Check(testkit.Rows("1020304050607 1020304 10203 102 4")) // for adddate, subdate dateArithmeticalTests := []struct { @@ -3826,6 +3830,7 @@ func TestSetVariables(t *testing.T) { require.Error(t, err) require.Error(t, err, variable.ErrWrongTypeForVar.GenWithStackByArgs("max_prepared_stmt_count").Error()) + tk.MustExec("set @@global.tidb_enable_concurrent_ddl=1") tk.MustQuery("select @@global.tidb_enable_concurrent_ddl").Check(testkit.Rows("1")) require.True(t, variable.EnableConcurrentDDL.Load()) tk.MustExec("set @@global.tidb_enable_concurrent_ddl=0") diff --git a/expression/integration_test.go b/expression/integration_test.go index b3dc43fe084d1..8b2aa0139347f 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -7396,6 +7396,79 @@ func TestIssue31867(t *testing.T) { tk.MustExec("drop table t") } +func TestIssue31600(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("set time_zone = '+00:00'") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (tm_fsp0 time(0), tm_fsp1 time(1), tm_fsp3 time(3),tm_fsp6 time(6), d date, dt_fsp0 datetime(0), dt_fsp1 datetime(1), dt_fsp3 datetime(3), dt_fsp6 datetime(6))") + tk.MustExec("insert into t values(null, '12:12:01.1', '12:12:02.123', '12:12:03.123456', '20221212', null, '2020/12/11 12:12:11.1', '2020/12/12 12:12:12.123', '2020/12/13 12:12:13.123456')") + tk.MustExec("insert into t values('12:12:00', null, '12:12:02.123', '12:12:03.123456', '20221212', '2020/12/10 12:12:10', null, '2020/12/12 12:12:12.123', '2020/12/13 12:12:13.123456')") + tk.MustExec("insert into t values('12:12:00', '12:12:01.1', null, '12:12:03.123456', '20221212', '2020/12/10 12:12:10', '2020/12/11 12:12:11.1', null, '2020/12/13 12:12:13.123456')") + tk.MustExec("insert into t values('12:12:00', '12:12:01.1', '12:12:02.123', null, '20221212', '2020/12/10 12:12:10', '2020/12/11 12:12:11.1', '2020/12/12 12:12:12.123', null)") + tk.MustQuery("select coalesce(null, tm_fsp0, tm_fsp1, tm_fsp3, tm_fsp6) from t").Check([][]interface{}{ + {"12:12:01.100000"}, + {"12:12:00.000000"}, + {"12:12:00.000000"}, + {"12:12:00.000000"}, + }) + tk.MustQuery("select coalesce(tm_fsp1, tm_fsp0, tm_fsp3) from t").Check([][]interface{}{ + {"12:12:01.100"}, + {"12:12:00.000"}, + {"12:12:01.100"}, + {"12:12:01.100"}, + }) + tk.MustQuery("select coalesce(tm_fsp3, tm_fsp0) from t").Check([][]interface{}{ + {"12:12:02.123"}, + {"12:12:02.123"}, + {"12:12:00.000"}, + {"12:12:02.123"}, + }) + tk.MustQuery("select coalesce(tm_fsp6) from t").Check([][]interface{}{ + {"12:12:03.123456"}, + {"12:12:03.123456"}, + {"12:12:03.123456"}, + {""}, + }) + + tk.MustQuery("select coalesce(null, dt_fsp0, dt_fsp1, dt_fsp3, dt_fsp6) from t").Check([][]interface{}{ + {"2020-12-11 12:12:11.100000"}, + {"2020-12-10 12:12:10.000000"}, + {"2020-12-10 12:12:10.000000"}, + {"2020-12-10 12:12:10.000000"}, + }) + tk.MustQuery("select coalesce(dt_fsp0, dt_fsp1, dt_fsp3) from t").Check([][]interface{}{ + {"2020-12-11 12:12:11.100"}, + {"2020-12-10 12:12:10.000"}, + {"2020-12-10 12:12:10.000"}, + {"2020-12-10 12:12:10.000"}, + }) + tk.MustQuery("select coalesce(dt_fsp3, dt_fsp0) from t").Check([][]interface{}{ + {"2020-12-12 12:12:12.123"}, + {"2020-12-12 12:12:12.123"}, + {"2020-12-10 12:12:10.000"}, + {"2020-12-12 12:12:12.123"}, + }) + tk.MustQuery("select coalesce(dt_fsp6) from t").Check([][]interface{}{ + {"2020-12-13 12:12:13.123456"}, + {"2020-12-13 12:12:13.123456"}, + {"2020-12-13 12:12:13.123456"}, + {""}, + }) + + tk.MustQuery("select coalesce(null, d) from t").Check([][]interface{}{ + {"2022-12-12"}, + {"2022-12-12"}, + {"2022-12-12"}, + {"2022-12-12"}, + }) + + tk.MustExec("drop table t") +} + func TestDateAddForNonExistingTimestamp(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -7448,3 +7521,42 @@ func TestImcompleteDateFunc(t *testing.T) { tk.MustQuery("select YEARWEEK('1998-10-00')").Check(testkit.Rows("")) tk.MustQuery("select YEARWEEK('1998-00-11')").Check(testkit.Rows("")) } + +func TestIssue36279(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("SET timestamp=UNIX_TIMESTAMP('2011-11-01 17:48:00')") + + // test const + tk.MustQuery("SELECT cast(cast('12:12:12' as time) as datetime(6))").Check(testkit.Rows("2011-11-01 12:12:12.000000")) + + // test vec + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (tm time(6))") + tk.MustExec("insert into t values('23:59:59')") + tk.MustQuery("SELECT cast(tm as datetime(6)) from t").Check(testkit.Rows("2011-11-01 23:59:59.000000")) +} + +func TestIssue34998(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE `PK_S_MULTI_43`(`COL1` time(2) NOT NULL, `COL2` time(2) NOT NULL, `COL3` time(2) DEFAULT NULL, PRIMARY KEY(`COL1`,`COL2`))") + tk.MustExec("insert into PK_S_MULTI_43(col1, col2) values('-512:37:22.00', '-512:37:22.00')") + tk.MustQuery("select extract(day_microsecond from '-512:37:22.00')").Check(testkit.Rows("-5123722000000")) + tk.MustQuery("select extract(day_microsecond from col1) from PK_S_MULTI_43").Check(testkit.Rows("-5123722000000")) +} + +func TestIssue36358(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(c datetime(6))") + tk.MustExec("insert into t values('2001-01-01 02:03:04.050607')") + tk.MustQuery("select extract(day_microsecond from cast('2001-01-01 02:03:04.050607' as datetime(6))) from t").Check(testkit.Rows("1020304050607")) + tk.MustQuery("select extract(day_microsecond from c) from t").Check(testkit.Rows("1020304050607")) +} diff --git a/expression/util.go b/expression/util.go index f81737e4b7369..f3bddcc0e8e52 100644 --- a/expression/util.go +++ b/expression/util.go @@ -688,6 +688,21 @@ func pushNotAcrossExpr(ctx sessionctx.Context, expr Expression, not bool) (_ Exp return expr, not } +// GetExprInsideIsTruth get the expression inside the `istrue_with_null` and `istrue`. +// This is useful when handling expressions from "not" or "!", because we might wrap `istrue_with_null` or `istrue` +// when handling them. See pushNotAcrossExpr() and wrapWithIsTrue() for details. +func GetExprInsideIsTruth(expr Expression) Expression { + if f, ok := expr.(*ScalarFunction); ok { + switch f.FuncName.L { + case ast.IsTruthWithNull, ast.IsTruthWithoutNull: + return GetExprInsideIsTruth(f.GetArgs()[0]) + default: + return expr + } + } + return expr +} + // PushDownNot pushes the `not` function down to the expression's arguments. func PushDownNot(ctx sessionctx.Context, expr Expression) Expression { newExpr, _ := pushNotAcrossExpr(ctx, expr, false) diff --git a/go.mod b/go.mod index 2d67c63904fc3..0f4a71f419707 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/Jeffail/gabs/v2 v2.5.1 github.com/Shopify/sarama v1.29.0 - github.com/aws/aws-sdk-go v1.35.3 + github.com/aws/aws-sdk-go v1.36.30 github.com/blacktear23/go-proxyprotocol v1.0.0 github.com/carlmjohnson/flagext v0.21.0 github.com/cheggaaa/pb/v3 v3.0.8 @@ -30,9 +30,9 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 github.com/golang/snappy v0.0.4 - github.com/google/btree v1.0.1 + github.com/google/btree v1.1.2 github.com/google/pprof v0.0.0-20211122183932-1daafda22083 - github.com/google/uuid v1.1.2 + github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/iancoleman/strcase v0.2.0 @@ -46,11 +46,11 @@ require ( github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c github.com/pingcap/failpoint v0.0.0-20220423142525-ae43b7f4e5c3 github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 - github.com/pingcap/kvproto v0.0.0-20220705053936-aa9c2d20cd2a + github.com/pingcap/kvproto v0.0.0-20220711062932-08b02befd813 github.com/pingcap/log v1.1.0 github.com/pingcap/sysutil v0.0.0-20220114020952-ea68d2dbf5b4 github.com/pingcap/tidb/parser v0.0.0-20211011031125-9b13dc409c5e - github.com/pingcap/tipb v0.0.0-20220706024432-7be3cc83a7d5 + github.com/pingcap/tipb v0.0.0-20220718022156-3e2483c20a9e github.com/prometheus/client_golang v1.12.2 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.32.1 @@ -62,7 +62,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.2-0.20220504104629-106ec21d14df github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 - github.com/tikv/client-go/v2 v2.0.1-0.20220627063500-947d923945fd + github.com/tikv/client-go/v2 v2.0.1-0.20220721031657-e38d2b07de3f github.com/tikv/pd/client v0.0.0-20220307081149-841fa61e9710 github.com/twmb/murmur3 v1.1.3 github.com/uber/jaeger-client-go v2.22.1+incompatible @@ -80,16 +80,16 @@ require ( go.uber.org/multierr v1.8.0 go.uber.org/zap v1.21.0 golang.org/x/exp v0.0.0-20220428152302-39d4317da171 - golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd - golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 + golang.org/x/net v0.0.0-20220412020605-290c469a71a5 + golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 golang.org/x/sync v0.0.0-20220513210516-0976fa681c29 golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 golang.org/x/tools v0.1.11 - google.golang.org/api v0.69.0 - google.golang.org/grpc v1.44.0 + google.golang.org/api v0.74.0 + google.golang.org/grpc v1.45.0 gopkg.in/yaml.v2 v2.4.0 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 @@ -107,20 +107,28 @@ require ( github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 github.com/kisielk/errcheck v1.6.1 github.com/kyoh86/exportloopref v0.1.8 + github.com/mgechev/revive v1.2.1 github.com/nishanths/predeclared v0.2.2 github.com/tdakkota/asciicheck v0.1.1 honnef.co/go/tools v0.3.1 ) require ( + cloud.google.com/go/compute v1.5.0 // indirect + github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/googleapis/gax-go/v2 v2.2.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/kisielk/gotool v1.0.0 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/rogpeppe/go-internal v1.6.1 // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect ) require ( cloud.google.com/go v0.100.2 // indirect - cloud.google.com/go/compute v1.2.0 // indirect cloud.google.com/go/iam v0.1.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v0.20.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.1 // indirect @@ -150,7 +158,6 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 github.com/google/go-cmp v0.5.7 // indirect - github.com/googleapis/gax-go/v2 v2.1.1 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect @@ -188,7 +195,6 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.6.1 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/stathat/consistent v1.0.0 // indirect @@ -213,12 +219,10 @@ require ( go.opentelemetry.io/otel/sdk/metric v0.20.0 // indirect go.opentelemetry.io/otel/trace v0.20.0 // indirect go.opentelemetry.io/proto/otlp v0.7.0 // indirect - golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect diff --git a/go.sum b/go.sum index f4e4fb8b40f4f..b965ef3ee013b 100644 --- a/go.sum +++ b/go.sum @@ -36,8 +36,10 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.2.0 h1:EKki8sSdvDU0OO9mAXGwPXOTOgPz2l08R0/IutDH11I= cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -108,8 +110,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 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/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.35.3 h1:r0puXncSaAfRt7Btml2swUo74Kao+vKhO3VLjwDjK54= -github.com/aws/aws-sdk-go v1.35.3/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= +github.com/aws/aws-sdk-go v1.36.30 h1:hAwyfe7eZa7sM+S5mIJZFiNFwJMia9Whz6CYblioLoU= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -134,6 +136,8 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4 h1:tFXjAxje9thrTF4h57Ckik+scJjTWdwAtZqZPtOT48M= +github.com/chavacava/garif v0.0.0-20220316182200-5cad0b5181d4/go.mod h1:W8EnPSQ8Nv4fUjc/v1/8tHFqhuOJXnRub0dTfuAQktU= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= github.com/cheynewallace/tabby v1.1.1 h1:JvUR8waht4Y0S3JF17G6Vhyt+FRhnqVCkk8l4YrOU54= @@ -238,6 +242,8 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= 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/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= @@ -281,7 +287,6 @@ github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LB github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= @@ -339,7 +344,6 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -358,8 +362,9 @@ github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -393,19 +398,20 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 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/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U= github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= @@ -421,7 +427,6 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA 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/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 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= @@ -577,6 +582,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.2.1 h1:GjFml7ZsoR0IrQ2E2YIvWFNS5GPDV7xNwvA5GM1HZC4= +github.com/mgechev/revive v1.2.1/go.mod h1:+Ro3wqY4vakcYNtkBWdZC7dBg1xSB6sp054wWwmeFm0= 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/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -614,23 +622,18 @@ github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= 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/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +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.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 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/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= 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.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -664,9 +667,8 @@ github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN 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-20220302110454-c696585a961b/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20220525022339-6aaebf466305/go.mod h1:OYtxs0786qojVTmkVeufx93xe+jUgm56GUYRIKnmaGI= -github.com/pingcap/kvproto v0.0.0-20220705053936-aa9c2d20cd2a h1:nP2wmyw9JTRsk5rm+tZtfAso6c/1FvuaFNbXTaYz3FE= -github.com/pingcap/kvproto v0.0.0-20220705053936-aa9c2d20cd2a/go.mod h1:OYtxs0786qojVTmkVeufx93xe+jUgm56GUYRIKnmaGI= +github.com/pingcap/kvproto v0.0.0-20220711062932-08b02befd813 h1:PAXtUVMJnyQQS8t9GzihIFmh6FBXu0JziWbIVknLniA= +github.com/pingcap/kvproto v0.0.0-20220711062932-08b02befd813/go.mod h1:OYtxs0786qojVTmkVeufx93xe+jUgm56GUYRIKnmaGI= github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= @@ -675,8 +677,8 @@ github.com/pingcap/log v1.1.0 h1:ELiPxACz7vdo1qAvvaWJg1NrYFoY6gqAh/+Uo6aXdD8= github.com/pingcap/log v1.1.0/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/sysutil v0.0.0-20220114020952-ea68d2dbf5b4 h1:HYbcxtnkN3s5tqrZ/z3eJS4j3Db8wMphEm1q10lY/TM= github.com/pingcap/sysutil v0.0.0-20220114020952-ea68d2dbf5b4/go.mod h1:sDCsM39cGiv2vwunZkaFA917vVkqDTGSPbbV7z4Oops= -github.com/pingcap/tipb v0.0.0-20220706024432-7be3cc83a7d5 h1:XaTE4ZhQbQtQZtAVzlZh/Pf6SjFfMSTe1ia2nGcl36Y= -github.com/pingcap/tipb v0.0.0-20220706024432-7be3cc83a7d5/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= +github.com/pingcap/tipb v0.0.0-20220718022156-3e2483c20a9e h1:FBaTXU8C3xgt/drM58VHxojHo/QoG1oPsgWTGvaSpO4= +github.com/pingcap/tipb v0.0.0-20220718022156-3e2483c20a9e/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -791,8 +793,8 @@ github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTX github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 h1:mbAskLJ0oJfDRtkanvQPiooDH8HvJ2FBh+iKT/OmiQQ= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= -github.com/tikv/client-go/v2 v2.0.1-0.20220627063500-947d923945fd h1:VAyYcN1Nw7RupQszUYqOkueEVapWSxKFU7uBaYY5Dv8= -github.com/tikv/client-go/v2 v2.0.1-0.20220627063500-947d923945fd/go.mod h1:uoZHYWKB+PsDueEnZ0EvF5zvNJPEauEWN26Tgi7qvNI= +github.com/tikv/client-go/v2 v2.0.1-0.20220721031657-e38d2b07de3f h1:fCAWVzUJYee1pDqYTBt5j2G1WuUfOL7A2mZoONoaHgs= +github.com/tikv/client-go/v2 v2.0.1-0.20220721031657-e38d2b07de3f/go.mod h1:UmDQEoeHXza8RSHBXVFERpxH54VBOf8yKZVphyel3l4= github.com/tikv/pd/client v0.0.0-20220307081149-841fa61e9710 h1:jxgmKOscXSjaFEKQGRyY5qOpK8hLqxs2irb/uDJMtwk= github.com/tikv/pd/client v0.0.0-20220307081149-841fa61e9710/go.mod h1:AtvppPwkiyUgQlR1W9qSqfTB+OsOIu19jDCOxOsPkmU= github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= @@ -938,9 +940,8 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 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= @@ -1036,14 +1037,16 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210427231257-85d9c07bbe3a/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 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= @@ -1059,8 +1062,11 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= @@ -1128,7 +1134,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1159,6 +1164,8 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664 h1:wEZYwx+kK+KlZ0hpvP2Ls1Xr4+RWnlzGFwPP0aiDjIU= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1238,7 +1245,6 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= @@ -1294,8 +1300,12 @@ google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3h google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= google.golang.org/api v0.66.0/go.mod h1:I1dmXYpX7HGwz/ejRxwQp2qj5bFAz93HiCU1C1oYd9M= -google.golang.org/api v0.69.0 h1:yHW5s2SFyDapr/43kYtIQmoaaFVW4baLMLwqV4auj2A= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7C80= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0 h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= 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= @@ -1371,10 +1381,17 @@ google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220114231437-d2e6a121cae0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220201184016-50beb8ab5c44/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220211171837-173942840c17/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8 h1:divpuJZKgX3Qt7MFDE5v62yu0yQcQbTCD9VJp9leX58= google.golang.org/genproto v0.0.0-20220216160803-4663080d8bc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= 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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1405,8 +1422,9 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1473,4 +1491,3 @@ sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1 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/infoschema/builder.go b/infoschema/builder.go index 6799de641750b..4e7b767aecdb0 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -16,7 +16,6 @@ package infoschema import ( "fmt" - "sort" "strings" "github.com/ngaut/pools" @@ -806,7 +805,9 @@ func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, policies []*model.Pol // Sort all tables by `ID` for _, v := range info.sortedTablesBuckets { - sort.Sort(v) + slices.SortFunc(v, func(a, b table.Table) bool { + return a.Meta().ID < b.Meta().ID + }) } return b, nil } diff --git a/infoschema/cache.go b/infoschema/cache.go index 1e2191e4699da..22ea012a9be28 100644 --- a/infoschema/cache.go +++ b/infoschema/cache.go @@ -67,7 +67,26 @@ func (h *InfoCache) GetByVersion(version int64) InfoSchema { i := sort.Search(len(h.cache), func(i int) bool { return h.cache[i].SchemaMetaVersion() <= version }) - if i < len(h.cache) && h.cache[i].SchemaMetaVersion() == version { + + // `GetByVersion` is allowed to load the latest schema that is less than argument `version`. + // Consider cache has values [10, 9, _, _, 6, 5, 4, 3, 2, 1], version 8 and 7 is empty because of the diff is empty. + // If we want to get version 8, we can return version 6 because v7 and v8 do not change anything, they are totally the same, + // in this case the `i` will not be 0. + // If i == 0, it means the argument version is `10`, or greater than `10`, if `version` is 10 + // `h.cache[i].SchemaMetaVersion() == version` will be true, so we can return the latest schema, return nil if not. + // The following code is equivalent to: + // ``` + // if h.GetLatest().SchemaMetaVersion() < version { + // return nil + // } + // + // if i < len(h.cache) { + // hitVersionCounter.Inc() + // return h.cache[i] + // } + // ``` + + if i < len(h.cache) && (i != 0 || h.cache[i].SchemaMetaVersion() == version) { hitVersionCounter.Inc() return h.cache[i] } diff --git a/infoschema/cache_test.go b/infoschema/cache_test.go index 977b9906c34b9..c229df8c8747c 100644 --- a/infoschema/cache_test.go +++ b/infoschema/cache_test.go @@ -107,7 +107,7 @@ func TestGetByVersion(t *testing.T) { require.Equal(t, is1, ic.GetByVersion(1)) require.Equal(t, is3, ic.GetByVersion(3)) require.Nilf(t, ic.GetByVersion(0), "index == 0, but not found") - require.Nilf(t, ic.GetByVersion(2), "index in the middle, but not found") + require.Equal(t, int64(1), ic.GetByVersion(2).SchemaMetaVersion()) require.Nilf(t, ic.GetByVersion(4), "index == length, but not found") } diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index 2510e6e45b56c..04dc3c4395284 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -64,18 +64,6 @@ type InfoSchema interface { type sortedTables []table.Table -func (s sortedTables) Len() int { - return len(s) -} - -func (s sortedTables) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s sortedTables) Less(i, j int) bool { - return s[i].Meta().ID < s[j].Meta().ID -} - func (s sortedTables) searchTable(id int64) int { idx := sort.Search(len(s), func(i int) bool { return s[i].Meta().ID >= id diff --git a/infoschema/perfschema/const.go b/infoschema/perfschema/const.go index 13ab10a699eeb..1683afe782347 100644 --- a/infoschema/perfschema/const.go +++ b/infoschema/perfschema/const.go @@ -29,6 +29,7 @@ var perfSchemaTables = []string{ tableTransCurrent, tableTransHistory, tableTransHistoryLong, + tableSessionVariables, tableStagesCurrent, tableStagesHistory, tableStagesHistoryLong, @@ -544,3 +545,8 @@ const tablePDProfileGoroutines = "CREATE TABLE IF NOT EXISTS " + tableNamePDProf "ID INT(8) NOT NULL," + "STATE VARCHAR(16) NOT NULL," + "LOCATION VARCHAR(512) NOT NULL);" + +// tableSessionVariables contains the +const tableSessionVariables = "CREATE TABLE IF NOT EXISTS " + tableNameSessionVariables + " (" + + "VARIABLE_NAME VARCHAR(64) NOT NULL," + + "VARIABLE_VALUE VARCHAR(1024) NOT NULL);" diff --git a/infoschema/perfschema/tables.go b/infoschema/perfschema/tables.go index 149336c3bf87d..5046dd318ec19 100644 --- a/infoschema/perfschema/tables.go +++ b/infoschema/perfschema/tables.go @@ -68,6 +68,7 @@ const ( tableNamePDProfileAllocs = "pd_profile_allocs" tableNamePDProfileBlock = "pd_profile_block" tableNamePDProfileGoroutines = "pd_profile_goroutines" + tableNameSessionVariables = "session_variables" ) var tableIDMap = map[string]int64{ @@ -101,6 +102,7 @@ var tableIDMap = map[string]int64{ tableNamePDProfileAllocs: autoid.PerformanceSchemaDBID + 28, tableNamePDProfileBlock: autoid.PerformanceSchemaDBID + 29, tableNamePDProfileGoroutines: autoid.PerformanceSchemaDBID + 30, + tableNameSessionVariables: autoid.PerformanceSchemaDBID + 31, } // perfSchemaTable stands for the fake table all its data is in the memory. @@ -247,6 +249,8 @@ func (vt *perfSchemaTable) getRows(ctx sessionctx.Context, cols []*table.Column) fullRows, err = dataForRemoteProfile(ctx, "pd", "/pd/api/v1/debug/pprof/block", false) case tableNamePDProfileGoroutines: fullRows, err = dataForRemoteProfile(ctx, "pd", "/pd/api/v1/debug/pprof/goroutine?debug=2", true) + case tableNameSessionVariables: + fullRows, err = infoschema.GetDataFromSessionVariables(ctx) } if err != nil { return diff --git a/infoschema/perfschema/tables_test.go b/infoschema/perfschema/tables_test.go index 24952625aa22d..3fa8f0cd51c1c 100644 --- a/infoschema/perfschema/tables_test.go +++ b/infoschema/perfschema/tables_test.go @@ -51,6 +51,15 @@ func TestPerfSchemaTables(t *testing.T) { tk.MustQuery("select * from events_stages_history_long").Check(testkit.Rows()) } +func TestSessionVariables(t *testing.T) { + store, clean := newMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + res := tk.MustQuery("select variable_value from performance_schema.session_variables order by variable_name limit 10;") + tk.MustQuery("select variable_value from information_schema.session_variables order by variable_name limit 10;").Check(res.Rows()) +} + func TestTiKVProfileCPU(t *testing.T) { store, clean := newMockStore(t) defer clean() diff --git a/infoschema/tables.go b/infoschema/tables.go index 03720ee66216d..f8584724b2704 100644 --- a/infoschema/tables.go +++ b/infoschema/tables.go @@ -888,6 +888,7 @@ var slowQueryCols = []columnInfo{ {name: variable.SlowLogHasMoreResults, tp: mysql.TypeTiny, size: 1}, {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}, {name: variable.SlowLogPrevStmt, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, {name: variable.SlowLogQuerySQLStr, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, } @@ -1294,6 +1295,7 @@ var tableStatementsSummaryCols = []columnInfo{ {name: stmtsummary.PrevSampleTextStr, tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "The previous statement before commit"}, {name: stmtsummary.PlanDigestStr, tp: mysql.TypeVarchar, size: 64, comment: "Digest of its execution plan"}, {name: stmtsummary.PlanStr, tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "Sampled execution plan"}, + {name: stmtsummary.BinaryPlan, tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "Sampled binary plan"}, } var tableStorageStatsCols = []columnInfo{ @@ -1832,6 +1834,23 @@ func GetTiFlashStoreCount(ctx sessionctx.Context) (cnt uint64, err error) { return cnt, nil } +// GetDataFromSessionVariables return the [name, value] of all session variables +func GetDataFromSessionVariables(ctx sessionctx.Context) ([][]types.Datum, error) { + sessionVars := ctx.GetSessionVars() + sysVars := variable.GetSysVars() + rows := make([][]types.Datum, 0, len(sysVars)) + for _, v := range sysVars { + var value string + value, err := variable.GetSessionOrGlobalSystemVar(sessionVars, v.Name) + if err != nil { + return nil, err + } + row := types.MakeDatums(v.Name, value) + rows = append(rows, row) + } + return rows, nil +} + var tableNameToColumns = map[string][]columnInfo{ TableSchemata: schemataCols, TableTables: tablesCols, diff --git a/infoschema/tables_test.go b/infoschema/tables_test.go index 42a1cc3ece50d..36aff22cdfaaf 100644 --- a/infoschema/tables_test.go +++ b/infoschema/tables_test.go @@ -567,13 +567,13 @@ func TestSlowQuery(t *testing.T) { tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", slowLogFileName)) tk.MustExec("set time_zone = '+08:00';") re := tk.MustQuery("select * from information_schema.slow_query") - re.Check(testkit.RowsWithSep("|", "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|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|10||0|1|0|0|1|0|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;", - "2021-09-08|14:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0|0||||INSERT INTO ...;", + re.Check(testkit.RowsWithSep("|", "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|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|10||0|1|0|0|1|0|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4||update t set i = 2;|select * from t_slim;", + "2021-09-08|14:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0|0|||||INSERT INTO ...;", )) tk.MustExec("set time_zone = '+00:00';") re = tk.MustQuery("select * from information_schema.slow_query") - re.Check(testkit.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|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|10||0|1|0|0|1|0|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;", - "2021-09-08|06:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0|0||||INSERT INTO ...;", + re.Check(testkit.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|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|10||0|1|0|0|1|0|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4||update t set i = 2;|select * from t_slim;", + "2021-09-08|06:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0|0|||||INSERT INTO ...;", )) // Test for long query. @@ -825,10 +825,10 @@ func TestStmtSummaryTable(t *testing.T) { "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + "from information_schema.statements_summary " + "where digest_text like 'select * from `t`%'" - tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10 \troot \t100 \t\n" + - "\t├─IndexRangeScan_8\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableRowIDScan_9\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t100 \t\n" + + "\t├─IndexRangeScan_8(Build)\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9(Probe)\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) // select ... order by tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, @@ -847,10 +847,10 @@ func TestStmtSummaryTable(t *testing.T) { "from information_schema.statements_summary " + "where digest_text like 'select * from `t`%'" tk.MustQuery(sql).Check(testkit.Rows( - "Select test test.t t:k 2 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10 \troot \t100 \t\n" + - "\t├─IndexRangeScan_8\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableRowIDScan_9\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) + "Select test test.t t:k 2 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t100 \t\n" + + "\t├─IndexRangeScan_8(Build)\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9(Probe)\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) // Disable it again. tk.MustExec("set global tidb_enable_stmt_summary = false") @@ -894,10 +894,10 @@ func TestStmtSummaryTable(t *testing.T) { "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + "from information_schema.statements_summary " + "where digest_text like 'select * from `t`%'" - tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10 \troot \t1000 \t\n" + - "\t├─IndexRangeScan_8\tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableRowIDScan_9\tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 0 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t1000 \t\n" + + "\t├─IndexRangeScan_8(Build)\tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9(Probe)\tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) // Disable it in global scope. tk.MustExec("set global tidb_enable_stmt_summary = false") diff --git a/kv/checker.go b/kv/checker.go index bec1d98d46af0..80115927fa41f 100644 --- a/kv/checker.go +++ b/kv/checker.go @@ -43,7 +43,7 @@ func (d RequestTypeSupportedChecker) IsRequestTypeSupported(reqType, subType int // 1. we have more than one storage engine available for push-down. // 2. we'd better do an accurate push-down check at the planner stage, instead of here. // currently, we do aggregation push-down check in `CheckAggCanPushCop`. -func (d RequestTypeSupportedChecker) supportExpr(exprType tipb.ExprType) bool { +func (RequestTypeSupportedChecker) supportExpr(exprType tipb.ExprType) bool { switch exprType { case tipb.ExprType_Null, tipb.ExprType_Int64, tipb.ExprType_Uint64, tipb.ExprType_String, tipb.ExprType_Bytes, tipb.ExprType_MysqlDuration, tipb.ExprType_MysqlTime, tipb.ExprType_MysqlDecimal, diff --git a/kv/key.go b/kv/key.go index 561cc2a03fd78..e285aca4c1e7c 100644 --- a/kv/key.go +++ b/kv/key.go @@ -172,7 +172,7 @@ var _ Handle = PartitionHandle{} type IntHandle int64 // IsInt implements the Handle interface. -func (ih IntHandle) IsInt() bool { +func (IntHandle) IsInt() bool { return true } @@ -213,17 +213,17 @@ func (ih IntHandle) Encoded() []byte { } // Len implements the Handle interface. -func (ih IntHandle) Len() int { +func (IntHandle) Len() int { return 8 } // NumCols implements the Handle interface, not supported for IntHandle type. -func (ih IntHandle) NumCols() int { +func (IntHandle) NumCols() int { panic("not supported in IntHandle") } // EncodedCol implements the Handle interface., not supported for IntHandle type. -func (ih IntHandle) EncodedCol(idx int) []byte { +func (IntHandle) EncodedCol(_ int) []byte { panic("not supported in IntHandle") } @@ -238,12 +238,12 @@ func (ih IntHandle) String() string { } // MemUsage implements the Handle interface. -func (ih IntHandle) MemUsage() uint64 { +func (IntHandle) MemUsage() uint64 { return 8 } // ExtraMemSize implements the Handle interface. -func (ih IntHandle) ExtraMemSize() uint64 { +func (IntHandle) ExtraMemSize() uint64 { return 0 } @@ -281,12 +281,12 @@ func NewCommonHandle(encoded []byte) (*CommonHandle, error) { } // IsInt implements the Handle interface. -func (ch *CommonHandle) IsInt() bool { +func (*CommonHandle) IsInt() bool { return false } // IntValue implements the Handle interface, not supported for CommonHandle type. -func (ch *CommonHandle) IntValue() int64 { +func (*CommonHandle) IntValue() int64 { panic("not supported in CommonHandle") } diff --git a/kv/kv.go b/kv/kv.go index d65d6498c12d1..86b592e093b04 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -79,33 +79,33 @@ type Retriever interface { type EmptyIterator struct{} // Valid returns true if the current iterator is valid. -func (i *EmptyIterator) Valid() bool { return false } +func (*EmptyIterator) Valid() bool { return false } // Key returns the current key. Always return nil for this iterator -func (i *EmptyIterator) Key() Key { return nil } +func (*EmptyIterator) Key() Key { return nil } // Value returns the current value. Always return nil for this iterator -func (i *EmptyIterator) Value() []byte { return nil } +func (*EmptyIterator) Value() []byte { return nil } // Next goes the next position. Always return error for this iterator -func (i *EmptyIterator) Next() error { return errors.New("iterator is invalid") } +func (*EmptyIterator) Next() error { return errors.New("iterator is invalid") } // Close closes the iterator. -func (i *EmptyIterator) Close() {} +func (*EmptyIterator) Close() {} // EmptyRetriever is a retriever without any entry type EmptyRetriever struct{} // Get gets the value for key k from kv store. Always return nil for this retriever -func (r *EmptyRetriever) Get(_ context.Context, _ Key) ([]byte, error) { +func (*EmptyRetriever) Get(_ context.Context, _ Key) ([]byte, error) { return nil, ErrNotExist } // Iter creates an Iterator. Always return EmptyIterator for this retriever -func (r *EmptyRetriever) Iter(_ Key, _ Key) (Iterator, error) { return &EmptyIterator{}, nil } +func (*EmptyRetriever) Iter(_ Key, _ Key) (Iterator, error) { return &EmptyIterator{}, nil } // IterReverse creates a reversed Iterator. Always return EmptyIterator for this retriever -func (r *EmptyRetriever) IterReverse(_ Key) (Iterator, error) { +func (*EmptyRetriever) IterReverse(_ Key) (Iterator, error) { return &EmptyIterator{}, nil } @@ -362,16 +362,24 @@ type Request struct { ReadReplicaScope string // IsStaleness indicates whether the request read staleness data IsStaleness bool + // ClosestReplicaReadAdjuster used to adjust a copr request. + ClosestReplicaReadAdjuster CoprRequestAdjuster // MatchStoreLabels indicates the labels the store should be matched MatchStoreLabels []*metapb.StoreLabel // ResourceGroupTagger indicates the kv request task group tagger. ResourceGroupTagger tikvrpc.ResourceGroupTagger // Paging indicates whether the request is a paging request. Paging bool + // MinPagingSize is used when Paging is true. + MinPagingSize uint64 // RequestSource indicates whether the request is an internal request. RequestSource util.RequestSource } +// CoprRequestAdjuster is used to check and adjust a copr request according to specific rules. +// return true if the request is changed. +type CoprRequestAdjuster func(*Request, int) bool + // PartitionIDAndRanges used by PartitionTableScan in tiflash. type PartitionIDAndRanges struct { ID int64 diff --git a/kv/option.go b/kv/option.go index 295cf60ee0c11..5ecf120802e27 100644 --- a/kv/option.go +++ b/kv/option.go @@ -89,6 +89,8 @@ const ( RequestSourceInternal // RequestSourceType set request source type of the current statement. RequestSourceType + // ReplicaReadAdjuster set the adjust function of cop requsts. + ReplicaReadAdjuster ) // ReplicaReadType is the type of replica to read data from @@ -103,6 +105,8 @@ const ( ReplicaReadMixed // ReplicaReadClosest stands for 'read from leader and follower which locates with the same zone' ReplicaReadClosest + // ReplicaReadClosestAdaptive stands for 'read from follower which locates in the same zone if the response size exceeds certain threshold' + ReplicaReadClosestAdaptive ) // IsFollowerRead checks if follower is going to be used to read data. diff --git a/kv/txn.go b/kv/txn.go index dfad0ee2efed0..c196166bc9c48 100644 --- a/kv/txn.go +++ b/kv/txn.go @@ -51,7 +51,6 @@ func (ib *innerTxnStartTsBox) storeInnerTxnTS(startTS uint64) { ib.innerTSLock.Lock() ib.innerTxnStartTsMap[startTS] = struct{}{} ib.innerTSLock.Unlock() - } func (ib *innerTxnStartTsBox) deleteInnerTxnTS(startTS uint64) { diff --git a/lock/lock.go b/lock/lock.go index 71d76ed924075..98b8d15e7cd3a 100644 --- a/lock/lock.go +++ b/lock/lock.go @@ -89,7 +89,6 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType } } } - } if !alterWriteable && c.ctx.HasLockedTables() { diff --git a/meta/autoid/autoid.go b/meta/autoid/autoid.go index 7082ea184b476..6309816c9f899 100644 --- a/meta/autoid/autoid.go +++ b/meta/autoid/autoid.go @@ -564,7 +564,7 @@ func NewAllocatorsFromTblInfo(store kv.Storage, schemaID int64, tblInfo *model.T // but actually we don't care about it, all we need is to calculate the new autoID corresponding to the // increment and offset at this time now. To simplify the rule is like (ID - offset) % increment = 0, // so the first autoID should be 9, then add increment to it to get 13. -func (alloc *allocator) Alloc(ctx context.Context, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *allocator) Alloc(ctx context.Context, n uint64, increment, offset int64) (min int64, max int64, err error) { if alloc.tbID == 0 { return 0, 0, errInvalidTableID.GenWithStackByArgs("Invalid tableID") } @@ -584,7 +584,7 @@ func (alloc *allocator) Alloc(ctx context.Context, n uint64, increment, offset i return alloc.alloc4Signed(ctx, n, increment, offset) } -func (alloc *allocator) AllocSeqCache() (int64, int64, int64, error) { +func (alloc *allocator) AllocSeqCache() (min int64, max int64, round int64, err error) { alloc.mu.Lock() defer alloc.mu.Unlock() return alloc.alloc4Sequence() @@ -615,65 +615,65 @@ func CalcNeededBatchSize(base, n, increment, offset int64, isUnsigned bool) int6 } // CalcSequenceBatchSize calculate the next sequence batch size. -func CalcSequenceBatchSize(base, size, increment, offset, MIN, MAX int64) (int64, error) { +func CalcSequenceBatchSize(base, size, increment, offset, min, max int64) (int64, error) { // The sequence is positive growth. if increment > 0 { if increment == 1 { // Sequence is already allocated to the end. - if base >= MAX { + if base >= max { return 0, ErrAutoincReadFailed } // The rest of sequence < cache size, return the rest. - if MAX-base < size { - return MAX - base, nil + if max-base < size { + return max - base, nil } // The rest of sequence is adequate. return size, nil } - nr, ok := SeekToFirstSequenceValue(base, increment, offset, MIN, MAX) + nr, ok := SeekToFirstSequenceValue(base, increment, offset, min, max) if !ok { return 0, ErrAutoincReadFailed } // The rest of sequence < cache size, return the rest. - if MAX-nr < (size-1)*increment { - return MAX - base, nil + if max-nr < (size-1)*increment { + return max - base, nil } return (nr - base) + (size-1)*increment, nil } // The sequence is negative growth. if increment == -1 { - if base <= MIN { + if base <= min { return 0, ErrAutoincReadFailed } - if base-MIN < size { - return base - MIN, nil + if base-min < size { + return base - min, nil } return size, nil } - nr, ok := SeekToFirstSequenceValue(base, increment, offset, MIN, MAX) + nr, ok := SeekToFirstSequenceValue(base, increment, offset, min, max) if !ok { return 0, ErrAutoincReadFailed } // The rest of sequence < cache size, return the rest. - if nr-MIN < (size-1)*(-increment) { - return base - MIN, nil + if nr-min < (size-1)*(-increment) { + return base - min, nil } return (base - nr) + (size-1)*(-increment), nil } -// SeekToFirstSequenceValue seeks to the next valid value (must be in range of [MIN, MAX]), +// SeekToFirstSequenceValue seeks to the next valid value (must be in range of [MIN, max]), // the bool indicates whether the first value is got. // The seeking formula is describe as below: // nr := (base + increment - offset) / increment // first := nr*increment + offset // Because formula computation will overflow Int64, so we transfer it to uint64 for distance computation. -func SeekToFirstSequenceValue(base, increment, offset, MIN, MAX int64) (int64, bool) { +func SeekToFirstSequenceValue(base, increment, offset, min, max int64) (int64, bool) { if increment > 0 { // Sequence is already allocated to the end. - if base >= MAX { + if base >= max { return 0, false } - uMax := EncodeIntToCmpUint(MAX) + uMax := EncodeIntToCmpUint(max) uBase := EncodeIntToCmpUint(base) uOffset := EncodeIntToCmpUint(offset) uIncrement := uint64(increment) @@ -692,10 +692,10 @@ func SeekToFirstSequenceValue(base, increment, offset, MIN, MAX int64) (int64, b return first, true } // Sequence is already allocated to the end. - if base <= MIN { + if base <= min { return 0, false } - uMin := EncodeIntToCmpUint(MIN) + uMin := EncodeIntToCmpUint(min) uBase := EncodeIntToCmpUint(base) uOffset := EncodeIntToCmpUint(offset) uIncrement := uint64(-increment) @@ -728,7 +728,7 @@ func SeekToFirstAutoIDUnSigned(base, increment, offset uint64) uint64 { return nr } -func (alloc *allocator) alloc4Signed(ctx context.Context, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *allocator) alloc4Signed(ctx context.Context, n uint64, increment, offset int64) (min int64, max int64, err error) { // Check offset rebase if necessary. if offset-1 > alloc.base { if err := alloc.rebase4Signed(ctx, offset-1, true); err != nil { @@ -813,12 +813,12 @@ func (alloc *allocator) alloc4Signed(ctx context.Context, n uint64, increment, o zap.Uint64("to ID", uint64(alloc.base+n1)), zap.Int64("table ID", alloc.tbID), zap.Int64("database ID", alloc.dbID)) - min := alloc.base + min = alloc.base alloc.base += n1 return min, alloc.base, nil } -func (alloc *allocator) alloc4Unsigned(ctx context.Context, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *allocator) alloc4Unsigned(ctx context.Context, n uint64, increment, offset int64) (min int64, max int64, err error) { // Check offset rebase if necessary. if uint64(offset-1) > uint64(alloc.base) { if err := alloc.rebase4Unsigned(ctx, uint64(offset-1), true); err != nil { @@ -903,7 +903,7 @@ func (alloc *allocator) alloc4Unsigned(ctx context.Context, n uint64, increment, zap.Uint64("to ID", uint64(alloc.base+n1)), zap.Int64("table ID", alloc.tbID), zap.Int64("database ID", alloc.dbID)) - min := alloc.base + min = alloc.base // Use uint64 n directly. alloc.base = int64(uint64(alloc.base) + uint64(n1)) return min, alloc.base, nil @@ -1083,7 +1083,7 @@ func NewShardIDLayout(fieldType *types.FieldType, shardBits uint64) *ShardIDLayo incrementalBits := typeBitsLength - shardBits hasSignBit := !mysql.HasUnsignedFlag(fieldType.GetFlag()) if hasSignBit { - incrementalBits -= 1 + incrementalBits-- } return &ShardIDLayout{ FieldType: fieldType, diff --git a/meta/autoid/memid.go b/meta/autoid/memid.go index 8abfee10677f4..f3a3b50bf5275 100644 --- a/meta/autoid/memid.go +++ b/meta/autoid/memid.go @@ -25,14 +25,22 @@ import ( func NewAllocatorFromTempTblInfo(tblInfo *model.TableInfo) Allocator { hasRowID := !tblInfo.PKIsHandle && !tblInfo.IsCommonHandle hasAutoIncID := tblInfo.GetAutoIncrementColInfo() != nil + var alloc Allocator // Temporary tables don't support auto_random and sequence. if hasRowID || hasAutoIncID { - return &inMemoryAllocator{ + alloc = &inMemoryAllocator{ isUnsigned: tblInfo.IsAutoIncColUnsigned(), allocType: RowIDAllocType, } } - return nil + // Rebase the allocator if the base is specified. + if alloc != nil && tblInfo.AutoIncID > 1 { + // Actually, `inMemoryAllocator.Rebase` always returns nil. + if err := alloc.Rebase(context.Background(), tblInfo.AutoIncID-1, false); err != nil { + return nil + } + } + return alloc } // inMemoryAllocator is typically used for temporary tables. @@ -53,7 +61,7 @@ func (alloc *inMemoryAllocator) Base() int64 { } // End implements autoid.Allocator End interface. -func (alloc *inMemoryAllocator) End() int64 { +func (*inMemoryAllocator) End() int64 { // It doesn't matter. return 0 } @@ -65,10 +73,13 @@ func (alloc *inMemoryAllocator) GetType() AllocatorType { // NextGlobalAutoID implements autoid.Allocator NextGlobalAutoID interface. func (alloc *inMemoryAllocator) NextGlobalAutoID() (int64, error) { - return alloc.base, nil + if alloc.isUnsigned { + return int64(uint64(alloc.base) + 1), nil + } + return alloc.base + 1, nil } -func (alloc *inMemoryAllocator) Alloc(ctx context.Context, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *inMemoryAllocator) Alloc(_ context.Context, n uint64, increment, offset int64) (min int64, max int64, err error) { if n == 0 { return 0, 0, nil } @@ -86,7 +97,7 @@ func (alloc *inMemoryAllocator) Alloc(ctx context.Context, n uint64, increment, // Rebase implements autoid.Allocator Rebase interface. // The requiredBase is the minimum base value after Rebase. // The real base may be greater than the required base. -func (alloc *inMemoryAllocator) Rebase(ctx context.Context, requiredBase int64, allocIDs bool) error { +func (alloc *inMemoryAllocator) Rebase(_ context.Context, requiredBase int64, _ bool) error { if alloc.isUnsigned { if uint64(requiredBase) > uint64(alloc.base) { alloc.base = requiredBase @@ -105,7 +116,7 @@ func (alloc *inMemoryAllocator) ForceRebase(requiredBase int64) error { return nil } -func (alloc *inMemoryAllocator) alloc4Signed(n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *inMemoryAllocator) alloc4Signed(n uint64, increment, offset int64) (min int64, max int64, err error) { // Check offset rebase if necessary. if offset-1 > alloc.base { alloc.base = offset - 1 @@ -118,12 +129,12 @@ func (alloc *inMemoryAllocator) alloc4Signed(n uint64, increment, offset int64) return 0, 0, ErrAutoincReadFailed } - min := alloc.base + min = alloc.base alloc.base += n1 return min, alloc.base, nil } -func (alloc *inMemoryAllocator) alloc4Unsigned(n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *inMemoryAllocator) alloc4Unsigned(n uint64, increment, offset int64) (min int64, max int64, err error) { // Check offset rebase if necessary. if uint64(offset)-1 > uint64(alloc.base) { alloc.base = int64(uint64(offset) - 1) @@ -137,16 +148,16 @@ func (alloc *inMemoryAllocator) alloc4Unsigned(n uint64, increment, offset int64 return 0, 0, ErrAutoincReadFailed } - min := alloc.base + min = alloc.base // Use uint64 n directly. alloc.base = int64(uint64(alloc.base) + uint64(n1)) return min, alloc.base, nil } -func (alloc *inMemoryAllocator) AllocSeqCache() (int64, int64, int64, error) { +func (*inMemoryAllocator) AllocSeqCache() (base int64, end int64, round int64, err error) { return 0, 0, 0, errNotImplemented.GenWithStackByArgs() } -func (alloc *inMemoryAllocator) RebaseSeq(requiredBase int64) (int64, bool, error) { +func (*inMemoryAllocator) RebaseSeq(_ int64) (res int64, alreadySatisfied bool, err error) { return 0, false, errNotImplemented.GenWithStackByArgs() } diff --git a/meta/autoid/memid_test.go b/meta/autoid/memid_test.go index 665d3022acddb..1f6efa1fefd49 100644 --- a/meta/autoid/memid_test.go +++ b/meta/autoid/memid_test.go @@ -47,11 +47,17 @@ func TestInMemoryAlloc(t *testing.T) { // alloc 1 ctx := context.Background() - _, id, err := alloc.Alloc(ctx, 1, 1, 1) + id, err := alloc.NextGlobalAutoID() require.NoError(t, err) require.Equal(t, int64(1), id) _, id, err = alloc.Alloc(ctx, 1, 1, 1) require.NoError(t, err) + require.Equal(t, int64(1), id) + id, err = alloc.NextGlobalAutoID() + require.NoError(t, err) + require.Equal(t, int64(2), id) + _, id, err = alloc.Alloc(ctx, 1, 1, 1) + require.NoError(t, err) require.Equal(t, int64(2), id) // alloc N @@ -75,6 +81,9 @@ func TestInMemoryAlloc(t *testing.T) { _, id, err = alloc.Alloc(ctx, 1, 1, 1) require.NoError(t, err) require.Equal(t, int64(41), id) + id, err = alloc.NextGlobalAutoID() + require.NoError(t, err) + require.Equal(t, int64(42), id) err = alloc.Rebase(context.Background(), int64(10), true) require.NoError(t, err) _, id, err = alloc.Alloc(ctx, 1, 1, 1) @@ -98,9 +107,23 @@ func TestInMemoryAlloc(t *testing.T) { var n uint64 = math.MaxUint64 - 2 err = alloc.Rebase(context.Background(), int64(n), true) require.NoError(t, err) + id, err = alloc.NextGlobalAutoID() + require.NoError(t, err) + require.Equal(t, int64(n+1), id) _, id, err = alloc.Alloc(ctx, 1, 1, 1) require.NoError(t, err) require.Equal(t, int64(n+1), id) _, _, err = alloc.Alloc(ctx, 1, 1, 1) require.True(t, terror.ErrorEqual(err, autoid.ErrAutoincReadFailed)) + + // test initial base + tblInfo.AutoIncID = 100 + alloc = autoid.NewAllocatorFromTempTblInfo(tblInfo) + require.NotNil(t, alloc) + id, err = alloc.NextGlobalAutoID() + require.NoError(t, err) + require.Equal(t, int64(100), id) + _, id, err = alloc.Alloc(ctx, 1, 1, 1) + require.NoError(t, err) + require.Equal(t, int64(100), id) } diff --git a/meta/meta.go b/meta/meta.go index aef346c47b59e..b4d9a56287e61 100644 --- a/meta/meta.go +++ b/meta/meta.go @@ -15,6 +15,7 @@ package meta import ( + "bytes" "encoding/binary" "encoding/json" "fmt" @@ -75,6 +76,8 @@ var ( mPolicyPrefix = "Policy" mPolicyGlobalID = []byte("PolicyGlobalID") mPolicyMagicByte = CurrentMagicByteVer + mDDLTableVersion = []byte("DDLTableVersion") + mConcurrentDDL = []byte("concurrentDDL") ) const ( @@ -90,6 +93,11 @@ const ( typeUnknown int = 0 typeJSON int = 1 // todo: customized handler. + + // MaxInt48 is the max value of int48. + MaxInt48 = 0x0000FFFFFFFFFFFF + // MaxGlobalID reserves 1000 IDs. Use MaxInt48 to reserves the high 2 bytes to compatible with Multi-tenancy. + MaxGlobalID = MaxInt48 - 1000 ) var ( @@ -147,7 +155,14 @@ func (m *Meta) GenGlobalID() (int64, error) { globalIDMutex.Lock() defer globalIDMutex.Unlock() - return m.txn.Inc(mNextGlobalIDKey, 1) + newID, err := m.txn.Inc(mNextGlobalIDKey, 1) + if err != nil { + return 0, errors.Trace(err) + } + if newID > MaxGlobalID { + return 0, errors.Errorf("global id:%d exceeds the limit:%d", newID, MaxGlobalID) + } + return newID, err } // GenGlobalIDs generates the next n global IDs. @@ -159,6 +174,9 @@ func (m *Meta) GenGlobalIDs(n int) ([]int64, error) { if err != nil { return nil, err } + if newID > MaxGlobalID { + return nil, errors.Errorf("global id:%d exceeds the limit:%d", newID, MaxGlobalID) + } origID := newID - int64(n) ids := make([]int64, 0, n) for i := origID + 1; i <= newID; i++ { @@ -185,11 +203,11 @@ func (m *Meta) GetPolicyID() (int64, error) { return m.txn.GetInt64(mPolicyGlobalID) } -func (m *Meta) policyKey(policyID int64) []byte { +func (*Meta) policyKey(policyID int64) []byte { return []byte(fmt.Sprintf("%s:%d", mPolicyPrefix, policyID)) } -func (m *Meta) dbKey(dbID int64) []byte { +func (*Meta) dbKey(dbID int64) []byte { return DBkey(dbID) } @@ -214,7 +232,7 @@ func IsDBkey(dbKey []byte) bool { return strings.HasPrefix(string(dbKey), mDBPrefix+":") } -func (m *Meta) autoTableIDKey(tableID int64) []byte { +func (*Meta) autoTableIDKey(tableID int64) []byte { return AutoTableIDKey(tableID) } @@ -239,11 +257,11 @@ func ParseAutoTableIDKey(key []byte) (int64, error) { return int64(id), err } -func (m *Meta) autoIncrementIDKey(tableID int64) []byte { +func (*Meta) autoIncrementIDKey(tableID int64) []byte { return []byte(fmt.Sprintf("%s:%d", mIncIDPrefix, tableID)) } -func (m *Meta) autoRandomTableIDKey(tableID int64) []byte { +func (*Meta) autoRandomTableIDKey(tableID int64) []byte { return AutoRandomTableIDKey(tableID) } @@ -268,7 +286,7 @@ func ParseAutoRandomTableIDKey(key []byte) (int64, error) { return int64(id), err } -func (m *Meta) tableKey(tableID int64) []byte { +func (*Meta) tableKey(tableID int64) []byte { return TableKey(tableID) } @@ -293,7 +311,7 @@ func ParseTableKey(tableKey []byte) (int64, error) { return int64(id), errors.Trace(err) } -func (m *Meta) sequenceKey(sequenceID int64) []byte { +func (*Meta) sequenceKey(sequenceID int64) []byte { return SequenceKey(sequenceID) } @@ -318,7 +336,7 @@ func ParseSequenceKey(key []byte) (int64, error) { return int64(id), errors.Trace(err) } -func (m *Meta) sequenceCycleKey(sequenceID int64) []byte { +func (*Meta) sequenceCycleKey(sequenceID int64) []byte { return []byte(fmt.Sprintf("%s:%d", mSeqCyclePrefix, sequenceID)) } @@ -339,6 +357,35 @@ func (m *Meta) GetAutoIDAccessors(dbID, tableID int64) AutoIDAccessors { return NewAutoIDAccessors(m, dbID, tableID) } +// GetSchemaVersionWithNonEmptyDiff gets current global schema version, if diff is nil, we should return version - 1. +// Consider the following scenario: +// t1 t2 t3 t4 +// | | | +// update schema version | set diff +// stale read ts +// At the first time, t2 reads the schema version v10, but the v10's diff is not set yet, so it loads v9 infoSchema. +// But at t4 moment, v10's diff has been set and been cached in the memory, so stale read on t2 will get v10 schema from cache, +// and inconsistency happen. +// To solve this problem, we always check the schema diff at first, if the diff is empty, we know at t2 moment we can only see the v9 schema, +// so make neededSchemaVersion = neededSchemaVersion - 1. +// For `Reload`, we can also do this: if the newest version's diff is not set yet, it is ok to load the previous version's infoSchema, and wait for the next reload. +func (m *Meta) GetSchemaVersionWithNonEmptyDiff() (int64, error) { + v, err := m.txn.GetInt64(mSchemaVersionKey) + if err != nil { + return 0, err + } + diff, err := m.GetSchemaDiff(v) + if err != nil { + return 0, err + } + + if diff == nil && v > 0 { + // Although the diff of v is undetermined, the last version's diff is deterministic(this is guaranteed by schemaVersionManager). + v-- + } + return v, err +} + // GetSchemaVersion gets current global schema version. func (m *Meta) GetSchemaVersion() (int64, error) { return m.txn.GetInt64(mSchemaVersionKey) @@ -489,6 +536,69 @@ func (m *Meta) CreateTableOrView(dbID int64, tableInfo *model.TableInfo) error { return m.txn.HSet(dbKey, tableKey, data) } +// SetDDLTables write a key into storage. +func (m *Meta) SetDDLTables() error { + err := m.txn.Set(mDDLTableVersion, []byte("1")) + return errors.Trace(err) +} + +// CreateMySQLDatabaseIfNotExists creates mysql schema and return its DB ID. +func (m *Meta) CreateMySQLDatabaseIfNotExists() (int64, error) { + dbs, err := m.ListDatabases() + if err != nil { + return 0, err + } + for _, db := range dbs { + if db.Name.L == mysql.SystemDB { + return db.ID, nil + } + } + + id, err := m.GenGlobalID() + if err != nil { + return 0, errors.Trace(err) + } + db := model.DBInfo{ + ID: id, + Name: model.NewCIStr(mysql.SystemDB), + Charset: mysql.UTF8MB4Charset, + Collate: mysql.UTF8MB4DefaultCollation, + State: model.StatePublic, + } + err = m.CreateDatabase(&db) + return db.ID, err +} + +// CheckDDLTableExists check if the tables related to concurrent DDL exists. +func (m *Meta) CheckDDLTableExists() (bool, error) { + v, err := m.txn.Get(mDDLTableVersion) + if err != nil { + return false, errors.Trace(err) + } + return len(v) != 0, nil +} + +// SetConcurrentDDL set the concurrent DDL flag. +func (m *Meta) SetConcurrentDDL(b bool) error { + var data []byte + if b { + data = []byte("1") + } else { + data = []byte("0") + } + return errors.Trace(m.txn.Set(mConcurrentDDL, data)) +} + +// IsConcurrentDDL returns true if the concurrent DDL flag is set. +func (m *Meta) IsConcurrentDDL() (bool, error) { + val, err := m.txn.Get(mConcurrentDDL) + if err != nil { + return false, errors.Trace(err) + } + + return len(val) == 0 || bytes.Equal(val, []byte("1")), nil +} + // 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 { @@ -802,8 +912,8 @@ var ( AddIndexJobListKey JobListKeyType = mDDLJobAddIdxList ) -func (m *Meta) enQueueDDLJob(key []byte, job *model.Job) error { - b, err := job.Encode(true) +func (m *Meta) enQueueDDLJob(key []byte, job *model.Job, updateRawArgs bool) error { + b, err := job.Encode(updateRawArgs) if err == nil { err = m.txn.RPush(key, b) } @@ -817,7 +927,17 @@ func (m *Meta) EnQueueDDLJob(job *model.Job, jobListKeys ...JobListKeyType) erro listKey = jobListKeys[0] } - return m.enQueueDDLJob(listKey, job) + return m.enQueueDDLJob(listKey, job, true) +} + +// EnQueueDDLJobNoUpdate adds a DDL job to the list without update raw args. +func (m *Meta) EnQueueDDLJobNoUpdate(job *model.Job, jobListKeys ...JobListKeyType) error { + listKey := m.jobListKey + if len(jobListKeys) != 0 { + listKey = jobListKeys[0] + } + + return m.enQueueDDLJob(listKey, job, false) } func (m *Meta) deQueueDDLJob(key []byte) (*model.Job, error) { @@ -938,7 +1058,7 @@ func (m *Meta) GetAllDDLJobsInQueue(jobListKeys ...JobListKeyType) ([]*model.Job return jobs, nil } -func (m *Meta) jobIDKey(id int64) []byte { +func (*Meta) jobIDKey(id int64) []byte { b := make([]byte, 8) binary.BigEndian.PutUint64(b, uint64(id)) return b @@ -961,7 +1081,7 @@ func (m *Meta) reorgJobStartHandle(id int64, element *Element) []byte { return b } -func (m *Meta) reorgJobEndHandle(id int64, element *Element) []byte { +func (*Meta) reorgJobEndHandle(id int64, element *Element) []byte { b := make([]byte, 8, 25) binary.BigEndian.PutUint64(b, uint64(id)) b = append(b, element.TypeKey...) @@ -972,7 +1092,7 @@ func (m *Meta) reorgJobEndHandle(id int64, element *Element) []byte { return b } -func (m *Meta) reorgJobPhysicalTableID(id int64, element *Element) []byte { +func (*Meta) reorgJobPhysicalTableID(id int64, element *Element) []byte { b := make([]byte, 8, 25) binary.BigEndian.PutUint64(b, uint64(id)) b = append(b, element.TypeKey...) @@ -1148,27 +1268,43 @@ func (m *Meta) UpdateDDLReorgStartHandle(job *model.Job, element *Element, start } // UpdateDDLReorgHandle saves the job reorganization latest processed information for later resuming. -func (m *Meta) UpdateDDLReorgHandle(job *model.Job, startKey, endKey kv.Key, physicalTableID int64, element *Element) error { - err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID), element.EncodeElement()) +func (m *Meta) UpdateDDLReorgHandle(jobID int64, startKey, endKey kv.Key, physicalTableID int64, element *Element) error { + err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(jobID), element.EncodeElement()) if err != nil { return errors.Trace(err) } if startKey != nil { - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID, element), startKey) + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobStartHandle(jobID, element), startKey) if err != nil { return errors.Trace(err) } } if endKey != nil { - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobEndHandle(job.ID, element), endKey) + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobEndHandle(jobID, element), endKey) if err != nil { return errors.Trace(err) } } - err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element), []byte(strconv.FormatInt(physicalTableID, 10))) + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobPhysicalTableID(jobID, element), []byte(strconv.FormatInt(physicalTableID, 10))) return errors.Trace(err) } +// ClearAllDDLReorgHandle clears all reorganization related handles. +func (m *Meta) ClearAllDDLReorgHandle() error { + return m.txn.HClear(mDDLJobReorgKey) +} + +// ClearALLDDLJob clears all DDL jobs. +func (m *Meta) ClearALLDDLJob() error { + if err := m.txn.LClear(mDDLJobAddIdxList); err != nil { + return errors.Trace(err) + } + if err := m.txn.LClear(mDDLJobListKey); err != nil { + return errors.Trace(err) + } + return nil +} + // ClearAllHistoryJob clears all history jobs. **IT IS VERY DANGEROUS** func (m *Meta) ClearAllHistoryJob() error { if err := m.txn.HClear(mDDLJobHistoryKey); err != nil { @@ -1270,7 +1406,7 @@ func getReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte) (kv. return bs, nil } -func (m *Meta) schemaDiffKey(schemaVersion int64) []byte { +func (*Meta) schemaDiffKey(schemaVersion int64) []byte { return []byte(fmt.Sprintf("%s:%d", mSchemaDiffPrefix, schemaVersion)) } diff --git a/meta/meta_test.go b/meta/meta_test.go index 7174eae38c66c..0529fdbcc5eda 100644 --- a/meta/meta_test.go +++ b/meta/meta_test.go @@ -511,10 +511,10 @@ func TestDDL(t *testing.T) { require.Equal(t, int64(0), k) element = &meta.Element{ID: 222, TypeKey: meta.ColumnElementKey} - err = m.UpdateDDLReorgHandle(job, tc.startHandle.Encoded(), tc.endHandle.Encoded(), 3, element) + err = m.UpdateDDLReorgHandle(job.ID, tc.startHandle.Encoded(), tc.endHandle.Encoded(), 3, element) require.NoError(t, err) element1 := &meta.Element{ID: 223, TypeKey: meta.IndexElementKey} - err = m.UpdateDDLReorgHandle(job, tc.startHandle.Encoded(), tc.endHandle.Encoded(), 3, element1) + err = m.UpdateDDLReorgHandle(job.ID, tc.startHandle.Encoded(), tc.endHandle.Encoded(), 3, element1) require.NoError(t, err) e, i, j, k, err = m.GetDDLReorgHandle(job) @@ -766,3 +766,104 @@ func TestSequenceKey(b *testing.T) { require.NoError(b, err) require.Equal(b, tableID, id) } + +func TestClearJob(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) + + job1 := &model.Job{ID: 1, TableID: 1, Type: model.ActionAddColumn} + job2 := &model.Job{ID: 2, TableID: 1, Type: model.ActionCreateTable} + job3 := &model.Job{ID: 3, TableID: 2, Type: model.ActionDropColumn} + + m := meta.NewMeta(txn) + + require.NoError(t, m.EnQueueDDLJob(job1)) + require.NoError(t, m.EnQueueDDLJob(job2)) + require.NoError(t, m.EnQueueDDLJob(job3)) + + require.NoError(t, m.AddHistoryDDLJob(job1, false)) + require.NoError(t, m.AddHistoryDDLJob(job2, false)) + + jobs, err := m.GetAllDDLJobsInQueue() + require.NoError(t, err) + require.Len(t, jobs, 3) + require.NoError(t, m.ClearALLDDLJob()) + jobs, err = m.GetAllDDLJobsInQueue() + require.NoError(t, err) + require.Len(t, jobs, 0) + + count, err := m.GetHistoryDDLCount() + require.NoError(t, err) + require.Equal(t, count, uint64(2)) + + err = txn.Rollback() + require.NoError(t, err) +} + +func TestCreateMySQLDatabase(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) + + m := meta.NewMeta(txn) + + dbID, err := m.CreateMySQLDatabaseIfNotExists() + require.NoError(t, err) + require.Greater(t, dbID, int64(0)) + + anotherDBID, err := m.CreateMySQLDatabaseIfNotExists() + require.NoError(t, err) + require.Equal(t, dbID, anotherDBID) + + err = txn.Rollback() + require.NoError(t, err) +} + +func TestDDLTable(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) + + m := meta.NewMeta(txn) + + exists, err := m.CheckDDLTableExists() + require.NoError(t, err) + require.False(t, exists) + + err = m.SetDDLTables() + require.NoError(t, err) + + exists, err = m.CheckDDLTableExists() + require.NoError(t, err) + require.True(t, exists) + + err = m.SetConcurrentDDL(true) + require.NoError(t, err) + b, err := m.IsConcurrentDDL() + require.NoError(t, err) + require.True(t, b) + err = m.SetConcurrentDDL(false) + require.NoError(t, err) + b, err = m.IsConcurrentDDL() + require.NoError(t, err) + require.False(t, b) + + err = txn.Rollback() + require.NoError(t, err) +} diff --git a/metrics/BUILD.bazel b/metrics/BUILD.bazel index 6ff2486d8c333..ad34ac544fa0e 100644 --- a/metrics/BUILD.bazel +++ b/metrics/BUILD.bazel @@ -9,6 +9,7 @@ go_library( "domain.go", "executor.go", "gc_worker.go", + "log_backup.go", "meta.go", "metrics.go", "owner.go", diff --git a/metrics/ddl.go b/metrics/ddl.go index 47e043519c9c5..5c3595231d143 100644 --- a/metrics/ddl.go +++ b/metrics/ddl.go @@ -14,7 +14,11 @@ package metrics -import "github.com/prometheus/client_golang/prometheus" +import ( + "strings" + + "github.com/prometheus/client_golang/prometheus" +) // Metrics for the DDL package. var ( @@ -123,6 +127,22 @@ var ( Name: "backfill_percentage_progress", Help: "Percentage progress of backfill", }, []string{LblType}) + + DDLJobTableDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "ddl", + Name: "job_table_duration_seconds", + Help: "Bucketed histogram of processing time (s) of the 3 DDL job tables", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s + }, []string{LblType}) + + DDLRunningJobCount = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "ddl", + Name: "running_job_count", + Help: "Running DDL jobs count", + }, []string{LblType}) ) // Label constants. @@ -133,7 +153,19 @@ const ( LblModifyColumn = "modify_column" ) +// GenerateReorgLabel returns the label with schema name and table name. +func GenerateReorgLabel(label string, schemaName string, tableName string) string { + var stringBuilder strings.Builder + stringBuilder.Grow(len(label) + len(schemaName) + len(tableName) + 2) + stringBuilder.WriteString(label) + stringBuilder.WriteString("_") + stringBuilder.WriteString(schemaName) + stringBuilder.WriteString("_") + stringBuilder.WriteString(tableName) + return stringBuilder.String() +} + // GetBackfillProgressByLabel returns the Gauge showing the percentage progress for the given type label. -func GetBackfillProgressByLabel(lbl string) prometheus.Gauge { - return BackfillProgressGauge.WithLabelValues(lbl) +func GetBackfillProgressByLabel(label string, schemaName string, tableName string) prometheus.Gauge { + return BackfillProgressGauge.WithLabelValues(GenerateReorgLabel(label, schemaName, tableName)) } diff --git a/metrics/distsql.go b/metrics/distsql.go index 0452f54ee9913..aecc70791b483 100644 --- a/metrics/distsql.go +++ b/metrics/distsql.go @@ -60,4 +60,19 @@ var ( Name: "copr_cache", Help: "coprocessor cache hit, evict and miss number", }, []string{LblType}) + DistSQLCoprClosestReadCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "distsql", + Name: "copr_closest_read", + Help: "counter of total copr read local read hit.", + }, []string{LblType}) + DistSQLCoprRespBodySize = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "distsql", + Name: "copr_resp_size", + Help: "copr task response data size in bytes.", + Buckets: prometheus.ExponentialBuckets(1024, 2, 20), + }, []string{LblStore}) ) diff --git a/metrics/grafana/tidb.json b/metrics/grafana/tidb.json index e03f651459408..9d43c02843357 100644 --- a/metrics/grafana/tidb.json +++ b/metrics/grafana/tidb.json @@ -2073,10 +2073,18 @@ }, { "expr": "tidb_server_memory_usage{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", + "hide": true, "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{type}}-{{instance}}", + "legendFormat": "{{module}}-{{type}}-{{instance}}", "refId": "H" + }, + { + "expr": "sum(tidb_server_memory_usage{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}) by (module, instance)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{module}}-{{instance}}", + "refId": "I" } ], "thresholds": [], @@ -6904,7 +6912,7 @@ "dashes": false, "datasource": "${DS_TEST-CLUSTER}", "decimals": null, - "description": "TiDB plan cache hit total", + "description": "TiDB plan cache miss total", "editable": true, "error": false, "fieldConfig": { @@ -6955,7 +6963,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_plan_cache_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (type)", + "expr": "sum(rate(tidb_server_plan_cache_miss_total{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -6967,7 +6975,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Queries Using Plan Cache OPS", + "title": "Plan Cache Miss OPS", "tooltip": { "msResolution": false, "shared": true, @@ -9311,6 +9319,117 @@ "align": false, "alignLevel": null } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "Time spent on the RPC layer between TiDB and TiKV, including the part used in the TiDB batch client", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 22 + }, + "hiddenSeries": false, + "id": 263, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_rpc_net_latency_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, store))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "99-store{{store}}", + "refId": "A" + }, + { + "exemplar": true, + "expr": "sum(rate(tidb_tikvclient_rpc_net_latency_seconds_sum{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, store) / sum(rate(tidb_tikvclient_rpc_net_latency_seconds_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m])) by (le, store)", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "avg-store{{store}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "RPC Layer Latency", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:132", + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:133", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } } ], "repeat": null, @@ -10511,6 +10630,204 @@ "align": false, "alignLevel": null } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "DDL job table duration", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 40 + }, + "hiddenSeries": false, + "id": 250, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.11", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.95, sum(rate(tidb_ddl_job_table_duration_seconds_bucket{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", }[1m])) by (le, type))", + "format": "time_series", + "hide": false, + "interval": "", + "legendFormat": "{{type}}-95", + "queryType": "randomWalk", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "DDL job table duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:629", + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:630", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "current count of the running DDL jobs", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 40 + }, + "hiddenSeries": false, + "id": 251, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.10", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "tidb_ddl_running_job_count{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ type }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "DDL Running Job Cnt", + "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": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } } ], "repeat": null, @@ -11938,7 +12255,7 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_ddl_backfill_percentage_progress{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", type=\"add_index\"}", + "expr": "tidb_ddl_backfill_percentage_progress{k8s_cluster=\"$k8s_cluster\", tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-{{type}}", @@ -16119,4 +16436,4 @@ "title": "Test-Cluster-TiDB", "uid": "000000011", "version": 1 -} \ No newline at end of file +} diff --git a/metrics/log_backup.go b/metrics/log_backup.go new file mode 100644 index 0000000000000..6c706b8027a79 --- /dev/null +++ b/metrics/log_backup.go @@ -0,0 +1,63 @@ +// 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 metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +// log backup metrics. +// see the `Help` field for details. +var ( + LastCheckpoint = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "last_checkpoint", + Help: "The last global checkpoint of log backup.", + }, []string{"task"}) + AdvancerOwner = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "advancer_owner", + Help: "If the node is the owner of advancers, set this to `1`, otherwise `0`.", + ConstLabels: map[string]string{}, + }) + AdvancerTickDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "advancer_tick_duration_sec", + Help: "The time cost of each step during advancer ticking.", + Buckets: prometheus.ExponentialBuckets(0.01, 3.0, 8), + }, []string{"step"}) + GetCheckpointBatchSize = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "advancer_batch_size", + Help: "The batch size of scanning region or get region checkpoint.", + Buckets: prometheus.ExponentialBuckets(1, 2.0, 12), + }, []string{"type"}) + RegionCheckpointRequest = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "region_request", + Help: "The failure / success stat requesting region checkpoints.", + }, []string{"result"}) + RegionCheckpointFailure = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: "tidb", + Subsystem: "log_backup", + Name: "region_request_failure", + Help: "The failure reasons of requesting region checkpoints.", + }, []string{"reason"}) +) diff --git a/metrics/metrics.go b/metrics/metrics.go index 19809bd9c85d2..dc358f1f078f4 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -41,7 +41,7 @@ var ( Subsystem: "server", Name: "memory_usage", Help: "Memory Usage", - }, []string{LblType}) + }, []string{LblModule, LblType}) ) // metrics labels. @@ -100,9 +100,13 @@ func RegisterMetrics() { prometheus.MustRegister(BackfillTotalCounter) prometheus.MustRegister(BackfillProgressGauge) prometheus.MustRegister(DDLWorkerHistogram) + prometheus.MustRegister(DDLJobTableDuration) + prometheus.MustRegister(DDLRunningJobCount) prometheus.MustRegister(DeploySyncerHistogram) prometheus.MustRegister(DistSQLPartialCountHistogram) prometheus.MustRegister(DistSQLCoprCacheCounter) + prometheus.MustRegister(DistSQLCoprClosestReadCounter) + prometheus.MustRegister(DistSQLCoprRespBodySize) prometheus.MustRegister(DistSQLQueryHistogram) prometheus.MustRegister(DistSQLScanKeysHistogram) prometheus.MustRegister(DistSQLScanKeysPartialHistogram) @@ -191,6 +195,12 @@ func RegisterMetrics() { prometheus.MustRegister(StatsHealthyGauge) prometheus.MustRegister(TxnStatusEnteringCounter) prometheus.MustRegister(TxnDurationHistogram) + prometheus.MustRegister(LastCheckpoint) + prometheus.MustRegister(AdvancerOwner) + prometheus.MustRegister(AdvancerTickDuration) + prometheus.MustRegister(GetCheckpointBatchSize) + prometheus.MustRegister(RegionCheckpointRequest) + prometheus.MustRegister(RegionCheckpointFailure) tikvmetrics.InitMetrics(TiDB, TiKVClient) tikvmetrics.RegisterMetrics() diff --git a/metrics/metrics_test.go b/metrics/metrics_test.go index 6c4536c8dc1e3..d2cc82a34f4b2 100644 --- a/metrics/metrics_test.go +++ b/metrics/metrics_test.go @@ -22,12 +22,12 @@ import ( "github.com/stretchr/testify/require" ) -func TestMetrics(t *testing.T) { +func TestMetrics(_ *testing.T) { // Make sure it doesn't panic. PanicCounter.WithLabelValues(LabelDomain).Inc() } -func TestRegisterMetrics(t *testing.T) { +func TestRegisterMetrics(_ *testing.T) { // Make sure it doesn't panic. RegisterMetrics() } diff --git a/metrics/session.go b/metrics/session.go index 4065d57baf992..c1349eccd2c45 100644 --- a/metrics/session.go +++ b/metrics/session.go @@ -187,4 +187,5 @@ const ( LblCommitting = "committing" LblRollingBack = "rolling_back" LblHasLock = "has_lock" + LblModule = "module" ) diff --git a/metrics/telemetry.go b/metrics/telemetry.go index 79bcbf7c9f9a1..e67af80d57204 100644 --- a/metrics/telemetry.go +++ b/metrics/telemetry.go @@ -112,3 +112,8 @@ func GetNonTransactionalStmtCounter() NonTransactionalStmtCounter { DeleteCount: readCounter(NonTransactionalDeleteCount), } } + +// GetSavepointStmtCounter gets the savepoint statement executed counter. +func GetSavepointStmtCounter() int64 { + return readCounter(StmtNodeCounter.With(prometheus.Labels{LblType: "Savepoint"})) +} diff --git a/owner/main_test.go b/owner/main_test.go index 501cae73e4c5b..57bc7021c5ca9 100644 --- a/owner/main_test.go +++ b/owner/main_test.go @@ -25,6 +25,7 @@ func TestMain(m *testing.M) { testsetup.SetupForCommonTest() opts := []goleak.Option{ goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), } goleak.VerifyTestMain(m, opts...) diff --git a/owner/manager.go b/owner/manager.go index 1f4eae6c11786..756b44b7688cf 100644 --- a/owner/manager.go +++ b/owner/manager.go @@ -117,7 +117,7 @@ func (m *ownerManager) Cancel() { } // RequireOwner implements Manager.RequireOwner interface. -func (m *ownerManager) RequireOwner(ctx context.Context) error { +func (*ownerManager) RequireOwner(_ context.Context) error { return nil } @@ -253,7 +253,7 @@ func (m *ownerManager) campaignLoop(etcdSession *concurrency.Session) { } } -func (m *ownerManager) revokeSession(logPrefix string, leaseID clientv3.LeaseID) { +func (m *ownerManager) revokeSession(_ string, leaseID clientv3.LeaseID) { // Revoke the session lease. // If revoke takes longer than the ttl, lease is expired anyway. cancelCtx, cancel := context.WithTimeout(context.Background(), diff --git a/owner/mock.go b/owner/mock.go index 559c46650d080..29552bfd3d14c 100644 --- a/owner/mock.go +++ b/owner/mock.go @@ -70,7 +70,7 @@ func (m *mockManager) Cancel() { } // GetOwnerID implements Manager.GetOwnerID interface. -func (m *mockManager) GetOwnerID(ctx context.Context) (string, error) { +func (m *mockManager) GetOwnerID(_ context.Context) (string, error) { if m.IsOwner() { return m.ID(), nil } @@ -84,7 +84,7 @@ func (m *mockManager) CampaignOwner() error { } // ResignOwner lets the owner start a new election. -func (m *mockManager) ResignOwner(ctx context.Context) error { +func (m *mockManager) ResignOwner(_ context.Context) error { if m.IsOwner() { m.RetireOwner() } @@ -92,7 +92,7 @@ func (m *mockManager) ResignOwner(ctx context.Context) error { } // RequireOwner implements Manager.RequireOwner interface. -func (m *mockManager) RequireOwner(context.Context) error { +func (*mockManager) RequireOwner(context.Context) error { return nil } diff --git a/parser/ast/ddl.go b/parser/ast/ddl.go index 19083d6e83abe..52d489a89cf85 100644 --- a/parser/ast/ddl.go +++ b/parser/ast/ddl.go @@ -2020,7 +2020,7 @@ const ( TableOptionEngine TableOptionCharset TableOptionCollate - TableOptionAutoIdCache + TableOptionAutoIdCache //nolint:revive TableOptionAutoIncrement TableOptionAutoRandomBase TableOptionComment @@ -2529,7 +2529,7 @@ const ( AlterTableAddPartitions // A tombstone for `AlterTableAlterPartition`. It will never be used anymore. // Just left a tombstone here to keep the enum number unchanged. - __DEPRECATED_AlterTableAlterPartition + __DEPRECATED_AlterTableAlterPartition //nolint:revive AlterTablePartitionAttributes AlterTablePartitionOptions AlterTableCoalescePartitions @@ -2562,7 +2562,7 @@ const ( AlterTableSetTiFlashReplica // A tombstone for `AlterTablePlacement`. It will never be used anymore. // Just left a tombstone here to keep the enum number unchanged. - __DEPRECATED_AlterTablePlacement + __DEPRECATED_AlterTablePlacement //nolint:revive AlterTableAddStatistics AlterTableDropStatistics AlterTableAttributes @@ -3309,14 +3309,13 @@ type AlterTableStmt struct { func (n *AlterTableStmt) HaveOnlyPlacementOptions() bool { for _, n := range n.Specs { - if n.Tp == AlterTablePartitionOptions { - if !n.IsAllPlacementRule() { - return false - } - } else { + if n.Tp != AlterTablePartitionOptions { return false - } + } + if !n.IsAllPlacementRule() { + return false + } } return true } @@ -3447,15 +3446,15 @@ type PartitionDefinitionClause interface { type PartitionDefinitionClauseNone struct{} -func (n *PartitionDefinitionClauseNone) restore(ctx *format.RestoreCtx) error { +func (*PartitionDefinitionClauseNone) restore(_ *format.RestoreCtx) error { return nil } -func (n *PartitionDefinitionClauseNone) acceptInPlace(v Visitor) bool { +func (*PartitionDefinitionClauseNone) acceptInPlace(_ Visitor) bool { return true } -func (n *PartitionDefinitionClauseNone) Validate(pt model.PartitionType, columns int) error { +func (*PartitionDefinitionClauseNone) Validate(pt model.PartitionType, _ int) error { switch pt { case 0: case model.PartitionTypeRange: @@ -3605,11 +3604,11 @@ func (n *PartitionDefinitionClauseHistory) restore(ctx *format.RestoreCtx) error return nil } -func (n *PartitionDefinitionClauseHistory) acceptInPlace(v Visitor) bool { +func (*PartitionDefinitionClauseHistory) acceptInPlace(_ Visitor) bool { return true } -func (n *PartitionDefinitionClauseHistory) Validate(pt model.PartitionType, columns int) error { +func (*PartitionDefinitionClauseHistory) Validate(pt model.PartitionType, _ int) error { switch pt { case 0, model.PartitionTypeSystemTime: default: diff --git a/parser/ast/functions.go b/parser/ast/functions.go index ae61e06682656..b911734a993e7 100644 --- a/parser/ast/functions.go +++ b/parser/ast/functions.go @@ -257,6 +257,7 @@ const ( TiDBVersion = "tidb_version" TiDBIsDDLOwner = "tidb_is_ddl_owner" TiDBDecodePlan = "tidb_decode_plan" + TiDBDecodeBinaryPlan = "tidb_decode_binary_plan" TiDBDecodeSQLDigests = "tidb_decode_sql_digests" FormatBytes = "format_bytes" FormatNanoTime = "format_nano_time" diff --git a/parser/ast/misc.go b/parser/ast/misc.go index 08e14575c53eb..307242273df7d 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -364,6 +364,9 @@ func (n *PlanReplayerStmt) Accept(v Visitor) (Node, bool) { type CompactReplicaKind string const ( + // CompactReplicaKindAll means compacting both TiKV and TiFlash replicas. + CompactReplicaKindAll = "ALL" + // CompactReplicaKindTiFlash means compacting TiFlash replicas. CompactReplicaKindTiFlash = "TIFLASH" @@ -386,10 +389,15 @@ func (n *CompactTableStmt) Restore(ctx *format.RestoreCtx) error { return errors.Annotate(err, "An error occurred while add table") } - // Note: There is only TiFlash replica available now. TiKV will be added later. - ctx.WriteKeyWord(" COMPACT ") - ctx.WriteKeyWord(string(n.ReplicaKind)) - ctx.WriteKeyWord(" REPLICA") + if n.ReplicaKind == CompactReplicaKindAll { + ctx.WriteKeyWord(" COMPACT") + } else { + // Note: There is only TiFlash replica available now. TiKV will be added later. + ctx.WriteKeyWord(" COMPACT ") + ctx.WriteKeyWord(string(n.ReplicaKind)) + ctx.WriteKeyWord(" REPLICA") + } + return nil } @@ -2349,11 +2357,10 @@ func (n *PrivElem) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord(n.Name) } else { str, ok := mysql.Priv2Str[n.Priv] - if ok { - ctx.WriteKeyWord(str) - } else { + if !ok { return errors.New("Undefined privilege type") } + ctx.WriteKeyWord(str) } if n.Cols != nil { ctx.WritePlain(" (") @@ -3535,7 +3542,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { } // Hints without args except query block. switch n.HintName.L { - case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "straight_join": + case "hash_agg", "stream_agg", "agg_to_cop", "read_consistent_replica", "no_index_merge", "qb_name", "ignore_plan_cache", "limit_to_cop", "straight_join", "merge": ctx.WritePlain(")") return nil } diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index b87f45c99af11..b7a5cac8bee02 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -276,6 +276,7 @@ func TestTableOptimizerHintRestore(t *testing.T) { {"AGG_TO_COP()", "AGG_TO_COP()"}, {"AGG_TO_COP(@sel_1)", "AGG_TO_COP(@`sel_1`)"}, {"LIMIT_TO_COP()", "LIMIT_TO_COP()"}, + {"MERGE()", "MERGE()"}, {"STRAIGHT_JOIN()", "STRAIGHT_JOIN()"}, {"NO_INDEX_MERGE()", "NO_INDEX_MERGE()"}, {"NO_INDEX_MERGE(@sel1)", "NO_INDEX_MERGE(@`sel1`)"}, @@ -344,6 +345,8 @@ func TestBRIESecureText(t *testing.T) { func TestCompactTableStmtRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"alter table abc compact tiflash replica", "ALTER TABLE `abc` COMPACT TIFLASH REPLICA"}, + {"alter table abc compact", "ALTER TABLE `abc` COMPACT"}, + {"alter table test.abc compact", "ALTER TABLE `test`.`abc` COMPACT"}, } extractNodeFunc := func(node ast.Node) ast.Node { return node.(*ast.CompactTableStmt) diff --git a/parser/auth/auth.go b/parser/auth/auth.go index e086ebfeb517a..109fdda04b644 100644 --- a/parser/auth/auth.go +++ b/parser/auth/auth.go @@ -20,7 +20,9 @@ import ( ) const ( + // UserNameMaxLength is the max length of username. UserNameMaxLength = 32 + // HostNameMaxLength is the max length of host name. HostNameMaxLength = 255 ) @@ -69,11 +71,13 @@ func (user *UserIdentity) LoginString() string { return fmt.Sprintf("%s@%s", user.Username, user.Hostname) } +// RoleIdentity represents a role name. type RoleIdentity struct { Username string Hostname string } +// Restore implements Node interface. func (role *RoleIdentity) Restore(ctx *format.RestoreCtx) error { ctx.WriteName(role.Username) if role.Hostname != "" { diff --git a/parser/auth/caching_sha2.go b/parser/auth/caching_sha2.go index 9fb684191346e..ff405b5dde14a 100644 --- a/parser/auth/caching_sha2.go +++ b/parser/auth/caching_sha2.go @@ -41,167 +41,170 @@ import ( ) const ( - MIXCHARS = 32 - SALT_LENGTH = 20 - ITERATION_MULTIPLIER = 1000 + // MIXCHARS is the number of characters to use in the mix + MIXCHARS = 32 + // SALT_LENGTH is the length of the salt + SALT_LENGTH = 20 //nolint: revive + // ITERATION_MULTIPLIER is the number of iterations to use + ITERATION_MULTIPLIER = 1000 //nolint: revive ) -func b64From24bit(b []byte, n int) []byte { +func b64From24bit(b []byte, n int, buf *bytes.Buffer) { b64t := []byte("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") w := (int64(b[0]) << 16) | (int64(b[1]) << 8) | int64(b[2]) - ret := make([]byte, 0, n) for n > 0 { n-- - ret = append(ret, b64t[w&0x3f]) + buf.WriteByte(b64t[w&0x3f]) w >>= 6 } - - return ret } func sha256crypt(plaintext string, salt []byte, iterations int) string { // Numbers in the comments refer to the description of the algorithm on https://www.akkadia.org/drepper/SHA-crypt.txt // 1, 2, 3 - tmpA := sha256.New() - tmpA.Write([]byte(plaintext)) - tmpA.Write(salt) + bufA := bytes.NewBuffer(make([]byte, 0, 4096)) + bufA.Write([]byte(plaintext)) + bufA.Write(salt) // 4, 5, 6, 7, 8 - tmpB := sha256.New() - tmpB.Write([]byte(plaintext)) - tmpB.Write(salt) - tmpB.Write([]byte(plaintext)) - sumB := tmpB.Sum(nil) + bufB := bytes.NewBuffer(make([]byte, 0, 4096)) + bufB.Write([]byte(plaintext)) + bufB.Write(salt) + bufB.Write([]byte(plaintext)) + sumB := sha256.Sum256(bufB.Bytes()) + bufB.Reset() // 9, 10 var i int for i = len(plaintext); i > MIXCHARS; i -= MIXCHARS { - tmpA.Write(sumB[:MIXCHARS]) + bufA.Write(sumB[:MIXCHARS]) } - tmpA.Write(sumB[:i]) + bufA.Write(sumB[:i]) // 11 for i = len(plaintext); i > 0; i >>= 1 { if i%2 == 0 { - tmpA.Write([]byte(plaintext)) + bufA.Write([]byte(plaintext)) } else { - tmpA.Write(sumB) + bufA.Write(sumB[:]) } } // 12 - sumA := tmpA.Sum(nil) + sumA := sha256.Sum256(bufA.Bytes()) + bufA.Reset() // 13, 14, 15 - tmpDP := sha256.New() + bufDP := bufA for range []byte(plaintext) { - tmpDP.Write([]byte(plaintext)) + bufDP.Write([]byte(plaintext)) } - sumDP := tmpDP.Sum(nil) + sumDP := sha256.Sum256(bufDP.Bytes()) + bufDP.Reset() // 16 p := make([]byte, 0, sha256.Size) for i = len(plaintext); i > 0; i -= MIXCHARS { if i > MIXCHARS { - p = append(p, sumDP...) + p = append(p, sumDP[:]...) } else { p = append(p, sumDP[0:i]...) } } // 17, 18, 19 - tmpDS := sha256.New() + bufDS := bufA for i = 0; i < 16+int(sumA[0]); i++ { - tmpDS.Write(salt) + bufDS.Write(salt) } - sumDS := tmpDS.Sum(nil) + sumDS := sha256.Sum256(bufDS.Bytes()) + bufDS.Reset() // 20 - s := []byte{} + s := make([]byte, 0, 32) for i = len(salt); i > 0; i -= MIXCHARS { if i > MIXCHARS { - s = append(s, sumDS...) + s = append(s, sumDS[:]...) } else { s = append(s, sumDS[0:i]...) } } // 21 - tmpC := sha256.New() - var sumC []byte + bufC := bufA + var sumC [32]byte for i = 0; i < iterations; i++ { - tmpC.Reset() - + bufC.Reset() if i&1 != 0 { - tmpC.Write(p) + bufC.Write(p) } else { - tmpC.Write(sumA) + bufC.Write(sumA[:]) } if i%3 != 0 { - tmpC.Write(s) + bufC.Write(s) } if i%7 != 0 { - tmpC.Write(p) + bufC.Write(p) } if i&1 != 0 { - tmpC.Write(sumA) + bufC.Write(sumA[:]) } else { - tmpC.Write(p) + bufC.Write(p) } - sumC = tmpC.Sum(nil) - copy(sumA, tmpC.Sum(nil)) + sumC = sha256.Sum256(bufC.Bytes()) + sumA = sumC } // 22 - buf := bytes.Buffer{} - buf.Grow(100) // FIXME + buf := bytes.NewBuffer(make([]byte, 0, 100)) buf.Write([]byte{'$', 'A', '$'}) rounds := fmt.Sprintf("%03d", iterations/ITERATION_MULTIPLIER) buf.Write([]byte(rounds)) buf.Write([]byte{'$'}) buf.Write(salt) - buf.Write(b64From24bit([]byte{sumC[0], sumC[10], sumC[20]}, 4)) - buf.Write(b64From24bit([]byte{sumC[21], sumC[1], sumC[11]}, 4)) - buf.Write(b64From24bit([]byte{sumC[12], sumC[22], sumC[2]}, 4)) - buf.Write(b64From24bit([]byte{sumC[3], sumC[13], sumC[23]}, 4)) - buf.Write(b64From24bit([]byte{sumC[24], sumC[4], sumC[14]}, 4)) - buf.Write(b64From24bit([]byte{sumC[15], sumC[25], sumC[5]}, 4)) - buf.Write(b64From24bit([]byte{sumC[6], sumC[16], sumC[26]}, 4)) - buf.Write(b64From24bit([]byte{sumC[27], sumC[7], sumC[17]}, 4)) - buf.Write(b64From24bit([]byte{sumC[18], sumC[28], sumC[8]}, 4)) - buf.Write(b64From24bit([]byte{sumC[9], sumC[19], sumC[29]}, 4)) - buf.Write(b64From24bit([]byte{0, sumC[31], sumC[30]}, 3)) + b64From24bit([]byte{sumC[0], sumC[10], sumC[20]}, 4, buf) + b64From24bit([]byte{sumC[21], sumC[1], sumC[11]}, 4, buf) + b64From24bit([]byte{sumC[12], sumC[22], sumC[2]}, 4, buf) + b64From24bit([]byte{sumC[3], sumC[13], sumC[23]}, 4, buf) + b64From24bit([]byte{sumC[24], sumC[4], sumC[14]}, 4, buf) + b64From24bit([]byte{sumC[15], sumC[25], sumC[5]}, 4, buf) + b64From24bit([]byte{sumC[6], sumC[16], sumC[26]}, 4, buf) + b64From24bit([]byte{sumC[27], sumC[7], sumC[17]}, 4, buf) + b64From24bit([]byte{sumC[18], sumC[28], sumC[8]}, 4, buf) + b64From24bit([]byte{sumC[9], sumC[19], sumC[29]}, 4, buf) + b64From24bit([]byte{0, sumC[31], sumC[30]}, 3, buf) return buf.String() } -// Checks if a MySQL style caching_sha2 authentication string matches a password +// CheckShaPassword is to checks if a MySQL style caching_sha2 authentication string matches a password func CheckShaPassword(pwhash []byte, password string) (bool, error) { - pwhash_parts := bytes.Split(pwhash, []byte("$")) - if len(pwhash_parts) != 4 { + pwhashParts := bytes.Split(pwhash, []byte("$")) + if len(pwhashParts) != 4 { return false, errors.New("failed to decode hash parts") } - hash_type := string(pwhash_parts[1]) - if hash_type != "A" { + hashType := string(pwhashParts[1]) + if hashType != "A" { return false, errors.New("digest type is incompatible") } - iterations, err := strconv.Atoi(string(pwhash_parts[2])) + iterations, err := strconv.Atoi(string(pwhashParts[2])) if err != nil { return false, errors.New("failed to decode iterations") } iterations = iterations * ITERATION_MULTIPLIER - salt := pwhash_parts[3][:SALT_LENGTH] + salt := pwhashParts[3][:SALT_LENGTH] newHash := sha256crypt(password, salt, iterations) return bytes.Equal(pwhash, []byte(newHash)), nil } +// NewSha2Password creates a new MySQL style caching_sha2 password hash func NewSha2Password(pwd string) string { salt := make([]byte, SALT_LENGTH) rand.Read(salt) diff --git a/parser/auth/caching_sha2_test.go b/parser/auth/caching_sha2_test.go index 73e42ba9d28a8..6af1d5dc859f9 100644 --- a/parser/auth/caching_sha2_test.go +++ b/parser/auth/caching_sha2_test.go @@ -20,10 +20,11 @@ import ( "github.com/stretchr/testify/require" ) +var foobarPwdHash, _ = hex.DecodeString("24412430303524031A69251C34295C4B35167C7F1E5A7B63091349503974624D34504B5A424679354856336868686F52485A736E4A733368786E427575516C73446469496537") + func TestCheckShaPasswordGood(t *testing.T) { pwd := "foobar" - pwhash, _ := hex.DecodeString("24412430303524031A69251C34295C4B35167C7F1E5A7B63091349503974624D34504B5A424679354856336868686F52485A736E4A733368786E427575516C73446469496537") - r, err := CheckShaPassword(pwhash, pwd) + r, err := CheckShaPassword(foobarPwdHash, pwd) require.NoError(t, err) require.True(t, r) } @@ -72,3 +73,11 @@ func TestNewSha2Password(t *testing.T) { require.NotEqual(t, pwhash[r], 36) // '$' } } + +func BenchmarkShaPassword(b *testing.B) { + for i := 0; i < b.N; i++ { + m, err := CheckShaPassword(foobarPwdHash, "foobar") + require.Nil(b, err) + require.True(b, m) + } +} diff --git a/parser/charset/charset.go b/parser/charset/charset.go index 6c02f1bcd1f43..6067e4f623424 100644 --- a/parser/charset/charset.go +++ b/parser/charset/charset.go @@ -25,7 +25,9 @@ import ( ) var ( - ErrUnknownCollation = terror.ClassDDL.NewStd(mysql.ErrUnknownCollation) + // ErrUnknownCollation is unknown collation. + ErrUnknownCollation = terror.ClassDDL.NewStd(mysql.ErrUnknownCollation) + // ErrCollationCharsetMismatch is collation charset mismatch. ErrCollationCharsetMismatch = terror.ClassDDL.NewStd(mysql.ErrCollationCharsetMismatch) ) @@ -52,7 +54,7 @@ var collationsIDMap = make(map[int]*Collation) var collationsNameMap = make(map[string]*Collation) var supportedCollations = make([]*Collation, 0, len(supportedCollationNames)) -// CharacterSetInfos: All the supported charsets should be in the following table. +// CharacterSetInfos contains all the supported charsets. var CharacterSetInfos = map[string]*Charset{ CharsetUTF8: {CharsetUTF8, CollationUTF8, make(map[string]*Collation), "UTF-8 Unicode", 3}, CharsetUTF8MB4: {CharsetUTF8MB4, CollationUTF8MB4, make(map[string]*Collation), "UTF-8 Unicode", 4}, @@ -140,7 +142,7 @@ func GetDefaultCollation(charset string) (string, error) { } // GetDefaultCharsetAndCollate returns the default charset and collation. -func GetDefaultCharsetAndCollate() (string, string) { +func GetDefaultCharsetAndCollate() (defaultCharset string, defaultCollationName string) { return mysql.DefaultCharset, mysql.DefaultCollationName } @@ -158,7 +160,7 @@ func GetCharsetInfo(cs string) (*Charset, error) { } // GetCharsetInfoByID returns charset and collation for id as cs_number. -func GetCharsetInfoByID(coID int) (string, string, error) { +func GetCharsetInfoByID(coID int) (charsetStr string, collateStr string, err error) { if coID == mysql.DefaultCollationID { return mysql.DefaultCharset, mysql.DefaultCollationName, nil } @@ -178,6 +180,7 @@ func GetCollations() []*Collation { return collations } +// GetCollationByName returns the collation by name. func GetCollationByName(name string) (*Collation, error) { collation, ok := collationsNameMap[strings.ToLower(name)] if !ok { @@ -207,8 +210,9 @@ const ( CollationASCII = "ascii_bin" // CollationLatin1 is the default collation for CharsetLatin1. CollationLatin1 = "latin1_bin" - - CollationGBKBin = "gbk_bin" + // CollationGBKBin is the default collation for CharsetGBK when new collation is disabled. + CollationGBKBin = "gbk_bin" + // CollationGBKChineseCI is the default collation for CharsetGBK when new collation is enabled. CollationGBKChineseCI = "gbk_chinese_ci" ) @@ -223,7 +227,7 @@ const ( CharsetUTF8 = "utf8" // CharsetUTF8MB4 represents 4 bytes utf8, which works the same way as utf8 in Go. CharsetUTF8MB4 = "utf8mb4" - + //revive:disable:exported CharsetARMSCII8 = "armscii8" CharsetBig5 = "big5" CharsetCP1250 = "cp1250" @@ -260,6 +264,7 @@ const ( CharsetUTF16 = "utf16" CharsetUTF16LE = "utf16le" CharsetUTF32 = "utf32" + //revive:enable:exported ) var charsets = map[string]*Charset{ diff --git a/parser/charset/encoding.go b/parser/charset/encoding.go index cc40c36100571..3f5debdf08e4a 100644 --- a/parser/charset/encoding.go +++ b/parser/charset/encoding.go @@ -86,8 +86,10 @@ type Encoding interface { ToLower(src string) string } +// EncodingTp is the type of the encoding. type EncodingTp int8 +//revive:disable const ( EncodingTpNone EncodingTp = iota EncodingTpUTF8 @@ -98,6 +100,8 @@ const ( EncodingTpGBK ) +//revive:enable + // Op is used by Encoding.Transform. type Op int16 @@ -111,7 +115,9 @@ const ( opSkipError ) +//revive:disable const ( + // OpReplaceNoErr is used to replace invalid bytes with '?'. OpReplaceNoErr = opFromUTF8 | opTruncateReplace | opCollectFrom | opSkipError OpReplace = opFromUTF8 | opTruncateReplace | opCollectFrom OpEncode = opFromUTF8 | opTruncateTrim | opCollectTo @@ -122,6 +128,8 @@ const ( OpDecodeReplace = opToUTF8 | opTruncateReplace | opCollectTo ) +//revive:enable + // CountValidBytes counts the first valid bytes in src that // can be encoded to the current encoding. func CountValidBytes(e Encoding, src []byte) int { diff --git a/parser/charset/encoding_ascii.go b/parser/charset/encoding_ascii.go index cf9100f699111..db34f8952e00a 100644 --- a/parser/charset/encoding_ascii.go +++ b/parser/charset/encoding_ascii.go @@ -33,17 +33,17 @@ type encodingASCII struct { } // Name implements Encoding interface. -func (e *encodingASCII) Name() string { +func (*encodingASCII) Name() string { return CharsetASCII } // Tp implements Encoding interface. -func (e *encodingASCII) Tp() EncodingTp { +func (*encodingASCII) Tp() EncodingTp { return EncodingTpASCII } // Peek implements Encoding interface. -func (e *encodingASCII) Peek(src []byte) []byte { +func (*encodingASCII) Peek(src []byte) []byte { if len(src) == 0 { return src } @@ -51,7 +51,7 @@ func (e *encodingASCII) Peek(src []byte) []byte { } // IsValid implements Encoding interface. -func (e *encodingASCII) IsValid(src []byte) bool { +func (*encodingASCII) IsValid(src []byte) bool { srcLen := len(src) for i := 0; i < srcLen; i++ { if src[i] > go_unicode.MaxASCII { @@ -61,6 +61,7 @@ func (e *encodingASCII) IsValid(src []byte) bool { return true } +// Transform implements Encoding interface. func (e *encodingASCII) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) { if e.IsValid(src) { return src, nil @@ -68,7 +69,8 @@ func (e *encodingASCII) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte return e.encodingBase.Transform(dest, src, op) } -func (e *encodingASCII) Foreach(src []byte, op Op, fn func(from, to []byte, ok bool) bool) { +// Foreach implements Encoding interface. +func (*encodingASCII) Foreach(src []byte, _ Op, fn func(from, to []byte, ok bool) bool) { for i, w := 0, 0; i < len(src); i += w { w = 1 ok := true diff --git a/parser/charset/encoding_base.go b/parser/charset/encoding_base.go index 58abc601318f3..529734fb8a0cf 100644 --- a/parser/charset/encoding_base.go +++ b/parser/charset/encoding_base.go @@ -35,15 +35,15 @@ type encodingBase struct { self Encoding } -func (b encodingBase) MbLen(_ string) int { +func (encodingBase) MbLen(_ string) int { return 0 } -func (b encodingBase) ToUpper(src string) string { +func (encodingBase) ToUpper(src string) string { return strings.ToUpper(src) } -func (b encodingBase) ToLower(src string) string { +func (encodingBase) ToLower(src string) string { return strings.ToLower(src) } diff --git a/parser/charset/encoding_bin.go b/parser/charset/encoding_bin.go index 3a9bf2e4f8968..8b904315458ac 100644 --- a/parser/charset/encoding_bin.go +++ b/parser/charset/encoding_bin.go @@ -32,17 +32,17 @@ type encodingBin struct { } // Name implements Encoding interface. -func (e *encodingBin) Name() string { +func (*encodingBin) Name() string { return CharsetBin } // Tp implements Encoding interface. -func (e *encodingBin) Tp() EncodingTp { +func (*encodingBin) Tp() EncodingTp { return EncodingTpBin } // Peek implements Encoding interface. -func (e *encodingBin) Peek(src []byte) []byte { +func (*encodingBin) Peek(src []byte) []byte { if len(src) == 0 { return src } @@ -50,12 +50,12 @@ func (e *encodingBin) Peek(src []byte) []byte { } // IsValid implements Encoding interface. -func (e *encodingBin) IsValid(src []byte) bool { +func (*encodingBin) IsValid(_ []byte) bool { return true } // Foreach implements Encoding interface. -func (e *encodingBin) Foreach(src []byte, op Op, fn func(from, to []byte, ok bool) bool) { +func (*encodingBin) Foreach(src []byte, _ Op, fn func(from, to []byte, ok bool) bool) { for i := 0; i < len(src); i++ { if !fn(src[i:i+1], src[i:i+1], true) { return @@ -63,6 +63,6 @@ func (e *encodingBin) Foreach(src []byte, op Op, fn func(from, to []byte, ok boo } } -func (e *encodingBin) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) { +func (*encodingBin) Transform(_ *bytes.Buffer, src []byte, _ Op) ([]byte, error) { return src, nil } diff --git a/parser/charset/encoding_gbk.go b/parser/charset/encoding_gbk.go index df8458b7a74d3..8b4589a4d176b 100644 --- a/parser/charset/encoding_gbk.go +++ b/parser/charset/encoding_gbk.go @@ -36,17 +36,17 @@ type encodingGBK struct { } // Name implements Encoding interface. -func (e *encodingGBK) Name() string { +func (*encodingGBK) Name() string { return CharsetGBK } // Tp implements Encoding interface. -func (e *encodingGBK) Tp() EncodingTp { +func (*encodingGBK) Tp() EncodingTp { return EncodingTpGBK } // Peek implements Encoding interface. -func (e *encodingGBK) Peek(src []byte) []byte { +func (*encodingGBK) Peek(src []byte) []byte { charLen := 2 if len(src) == 0 || src[0] < 0x80 { // A byte in the range 00–7F is a single byte that means the same thing as it does in ASCII. @@ -58,7 +58,7 @@ func (e *encodingGBK) Peek(src []byte) []byte { return src } -func (e *encodingGBK) MbLen(bs string) int { +func (*encodingGBK) MbLen(bs string) int { if len(bs) < 2 { return 0 } @@ -73,12 +73,12 @@ func (e *encodingGBK) MbLen(bs string) int { } // ToUpper implements Encoding interface. -func (e *encodingGBK) ToUpper(d string) string { +func (*encodingGBK) ToUpper(d string) string { return strings.ToUpperSpecial(GBKCase, d) } // ToLower implements Encoding interface. -func (e *encodingGBK) ToLower(d string) string { +func (*encodingGBK) ToLower(d string) string { return strings.ToLowerSpecial(GBKCase, d) } @@ -118,7 +118,7 @@ func NewCustomGBKEncoder() *encoding.Encoder { } // NewDecoder returns simplifiedchinese.GBK.NewDecoder(). -func (c customGBK) NewDecoder() *encoding.Decoder { +func (customGBK) NewDecoder() *encoding.Decoder { return &encoding.Decoder{ Transformer: customGBKDecoder{ gbkDecoder: simplifiedchinese.GBK.NewDecoder(), @@ -152,7 +152,7 @@ type customGBKEncoder struct { } // NewEncoder returns simplifiedchinese.gbk. -func (c customGBK) NewEncoder() *encoding.Encoder { +func (customGBK) NewEncoder() *encoding.Encoder { return &encoding.Encoder{ Transformer: customGBKEncoder{ gbkEncoder: simplifiedchinese.GBK.NewEncoder(), diff --git a/parser/charset/encoding_latin1.go b/parser/charset/encoding_latin1.go index 38f9bb601ac4e..613dd7e0b177b 100644 --- a/parser/charset/encoding_latin1.go +++ b/parser/charset/encoding_latin1.go @@ -33,12 +33,12 @@ type encodingLatin1 struct { } // Name implements Encoding interface. -func (e *encodingLatin1) Name() string { +func (*encodingLatin1) Name() string { return CharsetLatin1 } // Peek implements Encoding interface. -func (e *encodingLatin1) Peek(src []byte) []byte { +func (*encodingLatin1) Peek(src []byte) []byte { if len(src) == 0 { return src } @@ -46,15 +46,15 @@ func (e *encodingLatin1) Peek(src []byte) []byte { } // IsValid implements Encoding interface. -func (e *encodingLatin1) IsValid(src []byte) bool { +func (*encodingLatin1) IsValid(_ []byte) bool { return true } // Tp implements Encoding interface. -func (e *encodingLatin1) Tp() EncodingTp { +func (*encodingLatin1) Tp() EncodingTp { return EncodingTpLatin1 } -func (e *encodingLatin1) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, error) { +func (*encodingLatin1) Transform(_ *bytes.Buffer, src []byte, _ Op) ([]byte, error) { return src, nil } diff --git a/parser/charset/encoding_utf8.go b/parser/charset/encoding_utf8.go index 730c2bfc3d8ad..34e891d1eaf27 100644 --- a/parser/charset/encoding_utf8.go +++ b/parser/charset/encoding_utf8.go @@ -43,17 +43,17 @@ type encodingUTF8 struct { } // Name implements Encoding interface. -func (e *encodingUTF8) Name() string { +func (*encodingUTF8) Name() string { return CharsetUTF8MB4 } // Tp implements Encoding interface. -func (e *encodingUTF8) Tp() EncodingTp { +func (*encodingUTF8) Tp() EncodingTp { return EncodingTpUTF8 } // Peek implements Encoding interface. -func (e *encodingUTF8) Peek(src []byte) []byte { +func (*encodingUTF8) Peek(src []byte) []byte { nextLen := 4 if len(src) == 0 || src[0] < 0x80 { nextLen = 1 @@ -68,7 +68,7 @@ func (e *encodingUTF8) Peek(src []byte) []byte { return src[:nextLen] } -func (e *encodingUTF8) MbLen(bs string) int { +func (*encodingUTF8) MbLen(bs string) int { _, size := utf8.DecodeRuneInString(bs) if size <= 1 { return 0 @@ -93,7 +93,7 @@ func (e *encodingUTF8) Transform(dest *bytes.Buffer, src []byte, op Op) ([]byte, } // Foreach implements Encoding interface. -func (e *encodingUTF8) Foreach(src []byte, op Op, fn func(from, to []byte, ok bool) bool) { +func (*encodingUTF8) Foreach(src []byte, _ Op, fn func(from, to []byte, ok bool) bool) { var rv rune for i, w := 0, 0; i < len(src); i += w { rv, w = utf8.DecodeRune(src[i:]) @@ -116,7 +116,7 @@ func (e *encodingUTF8MB3Strict) IsValid(src []byte) bool { } // Foreach implements Encoding interface. -func (e *encodingUTF8MB3Strict) Foreach(src []byte, op Op, fn func(srcCh, dstCh []byte, ok bool) bool) { +func (*encodingUTF8MB3Strict) Foreach(src []byte, _ Op, fn func(srcCh, dstCh []byte, ok bool) bool) { for i, w := 0, 0; i < len(src); i += w { var rv rune rv, w = utf8.DecodeRune(src[i:]) diff --git a/parser/digester.go b/parser/digester.go index 9cf997beacb94..5f8b0a94a0032 100644 --- a/parser/digester.go +++ b/parser/digester.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/parser/charset" ) +// Digest stores the fixed length hash value. type Digest struct { b []byte str string @@ -386,7 +387,7 @@ func (d *sqlDigester) isLit(t token) (beLit bool) { return } -func (d *sqlDigester) isNumLit(tok int) (beNum bool) { +func (*sqlDigester) isNumLit(tok int) (beNum bool) { switch tok { case intLit, decLit, floatLit, hexLit: beNum = true @@ -395,7 +396,7 @@ func (d *sqlDigester) isNumLit(tok int) (beNum bool) { return } -func (d *sqlDigester) isComma(tok token) (isComma bool) { +func (*sqlDigester) isComma(tok token) (isComma bool) { isComma = tok.lit == "," return } diff --git a/parser/format/format.go b/parser/format/format.go index 0e904c98a998a..5c9c137c8fa27 100644 --- a/parser/format/format.go +++ b/parser/format/format.go @@ -195,7 +195,7 @@ func OutputFormat(s string) string { return buf.String() } -//RestoreFlag mark the Restore format +// RestoreFlags mark the Restore format type RestoreFlags uint64 // Mutually exclusive group of `RestoreFlags`: @@ -228,6 +228,7 @@ const ( ) const ( + // DefaultRestoreFlags is the default value of RestoreFlags. DefaultRestoreFlags = RestoreStringSingleQuotes | RestoreKeyWordUppercase | RestoreNameBackQuotes ) @@ -285,22 +286,27 @@ func (rf RestoreFlags) HasSpacesAroundBinaryOperationFlag() bool { return rf.has(RestoreSpacesAroundBinaryOperation) } +// HasRestoreBracketAroundBinaryOperation returns a boolean indicating whether `rf` has `RestoreBracketAroundBinaryOperation` flag. func (rf RestoreFlags) HasRestoreBracketAroundBinaryOperation() bool { return rf.has(RestoreBracketAroundBinaryOperation) } +// HasStringWithoutDefaultCharset returns a boolean indicating whether `rf` has `RestoreStringWithoutDefaultCharset` flag. func (rf RestoreFlags) HasStringWithoutDefaultCharset() bool { return rf.has(RestoreStringWithoutDefaultCharset) } +// HasStringWithoutCharset returns a boolean indicating whether `rf` has `RestoreStringWithoutCharset` flag. func (rf RestoreFlags) HasStringWithoutCharset() bool { return rf.has(RestoreStringWithoutCharset) } +// HasTiDBSpecialCommentFlag returns a boolean indicating whether `rf` has `RestoreTiDBSpecialComment` flag. func (rf RestoreFlags) HasTiDBSpecialCommentFlag() bool { return rf.has(RestoreTiDBSpecialComment) } +// HasSkipPlacementRuleForRestoreFlag returns a boolean indicating whether `rf` has `SkipPlacementRuleForRestore` flag. func (rf RestoreFlags) HasSkipPlacementRuleForRestoreFlag() bool { return rf.has(SkipPlacementRuleForRestore) } @@ -330,6 +336,7 @@ func (ctx *RestoreCtx) WriteKeyWord(keyWord string) { fmt.Fprint(ctx.In, keyWord) } +// WriteWithSpecialComments writes a string with a special comment wrapped. func (ctx *RestoreCtx) WriteWithSpecialComments(featureID string, fn func() error) error { if !ctx.Flags.HasTiDBSpecialCommentFlag() { return fn() @@ -410,10 +417,12 @@ func (c *CTERestorer) IsCTETableName(nameL string) bool { return false } +// RecordCTEName records the CTE name. func (c *CTERestorer) RecordCTEName(nameL string) { c.CTENames = append(c.CTENames, nameL) } +// RestoreCTEFunc is used to restore CTE. func (c *CTERestorer) RestoreCTEFunc() func() { l := len(c.CTENames) return func() { diff --git a/parser/goyacc/format_yacc.go b/parser/goyacc/format_yacc.go index 209c7acafc699..7ccff8da30900 100644 --- a/parser/goyacc/format_yacc.go +++ b/parser/goyacc/format_yacc.go @@ -50,10 +50,7 @@ func Format(inputFilename string, goldenFilename string) (err error) { return err } - if err = printRules(yFmt, spec.Rules); err != nil { - return err - } - return nil + return printRules(yFmt, spec.Rules) } func parseFileToSpec(inputFilename string) (*parser.Specification, error) { @@ -369,7 +366,7 @@ func printRuleBody(f format.Formatter, rule *parser.Rule) error { return err } } - counter += 1 + counter++ } if err := checkInconsistencyInYaccParser(f, rule, counter); err != nil { return err diff --git a/parser/hintparser.go b/parser/hintparser.go index 906f1a0259978..548860fbec0bf 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -41,18 +41,18 @@ type yyhintXError struct { } const ( - yyhintDefault = 57418 + yyhintDefault = 57419 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57378 hintBCJoin = 57391 hintBKA = 57355 hintBNL = 57357 - hintDupsWeedOut = 57414 - hintFalse = 57410 - hintFirstMatch = 57415 + hintDupsWeedOut = 57415 + hintFalse = 57411 + hintFirstMatch = 57416 hintForceIndex = 57402 - hintGB = 57413 + hintGB = 57414 hintHashAgg = 57380 hintHashJoin = 57359 hintIdentifier = 57347 @@ -70,10 +70,10 @@ const ( hintJoinSuffix = 57354 hintLeading = 57404 hintLimitToCop = 57401 - hintLooseScan = 57416 - hintMB = 57412 + hintLooseScan = 57417 + hintMB = 57413 hintMRR = 57366 - hintMaterialization = 57417 + hintMaterialization = 57418 hintMaxExecutionTime = 57374 hintMemoryQuota = 57385 hintMerge = 57362 @@ -89,16 +89,17 @@ const ( hintNoSkipScan = 57371 hintNoSwapJoinInputs = 57386 hintNthPlan = 57400 - hintOLAP = 57405 - hintOLTP = 57406 + hintOLAP = 57406 + hintOLTP = 57407 hintOrderedHashJoin = 57360 - hintPartition = 57407 + hintPartition = 57408 hintQBName = 57377 hintQueryType = 57387 hintReadConsistentReplica = 57388 hintReadFromStorage = 57389 hintResourceGroup = 57376 hintSMJoin = 57390 + hintSemiJoinRewrite = 57405 hintSemijoin = 57372 hintSetVar = 57375 hintSingleAtIdentifier = 57349 @@ -107,10 +108,10 @@ const ( hintStreamAgg = 57392 hintStringLit = 57350 hintSwapJoinInputs = 57393 - hintTiFlash = 57409 - hintTiKV = 57408 + hintTiFlash = 57410 + hintTiKV = 57409 hintTimeRange = 57398 - hintTrue = 57411 + hintTrue = 57412 hintUseCascades = 57399 hintUseIndex = 57395 hintUseIndexMerge = 57394 @@ -118,126 +119,127 @@ const ( hintUseToja = 57397 yyhintMaxDepth = 200 - yyhintTabOfs = -176 + yyhintTabOfs = -178 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (132x) - 57378: 1, // hintAggToCop (124x) - 57391: 2, // hintBCJoin (124x) - 57355: 3, // hintBKA (124x) - 57357: 4, // hintBNL (124x) - 57402: 5, // hintForceIndex (124x) - 57380: 6, // hintHashAgg (124x) - 57359: 7, // hintHashJoin (124x) - 57381: 8, // hintIgnoreIndex (124x) - 57379: 9, // hintIgnorePlanCache (124x) - 57364: 10, // hintIndexMerge (124x) - 57382: 11, // hintInlHashJoin (124x) - 57383: 12, // hintInlJoin (124x) - 57384: 13, // hintInlMergeJoin (124x) - 57351: 14, // hintJoinFixedOrder (124x) - 57352: 15, // hintJoinOrder (124x) - 57353: 16, // hintJoinPrefix (124x) - 57354: 17, // hintJoinSuffix (124x) - 57404: 18, // hintLeading (124x) - 57401: 19, // hintLimitToCop (124x) - 57374: 20, // hintMaxExecutionTime (124x) - 57385: 21, // hintMemoryQuota (124x) - 57362: 22, // hintMerge (124x) - 57366: 23, // hintMRR (124x) - 57356: 24, // hintNoBKA (124x) - 57358: 25, // hintNoBNL (124x) - 57361: 26, // hintNoHashJoin (124x) - 57368: 27, // hintNoICP (124x) - 57365: 28, // hintNoIndexMerge (124x) - 57363: 29, // hintNoMerge (124x) - 57367: 30, // hintNoMRR (124x) - 57369: 31, // hintNoRangeOptimization (124x) - 57373: 32, // hintNoSemijoin (124x) - 57371: 33, // hintNoSkipScan (124x) - 57386: 34, // hintNoSwapJoinInputs (124x) - 57400: 35, // hintNthPlan (124x) - 57360: 36, // hintOrderedHashJoin (124x) - 57377: 37, // hintQBName (124x) - 57387: 38, // hintQueryType (124x) - 57388: 39, // hintReadConsistentReplica (124x) - 57389: 40, // hintReadFromStorage (124x) - 57376: 41, // hintResourceGroup (124x) - 57372: 42, // hintSemijoin (124x) - 57375: 43, // hintSetVar (124x) - 57370: 44, // hintSkipScan (124x) - 57390: 45, // hintSMJoin (124x) - 57403: 46, // hintStraightJoin (124x) - 57392: 47, // hintStreamAgg (124x) - 57393: 48, // hintSwapJoinInputs (124x) - 57398: 49, // hintTimeRange (124x) - 57399: 50, // hintUseCascades (124x) - 57395: 51, // hintUseIndex (124x) - 57394: 52, // hintUseIndexMerge (124x) - 57396: 53, // hintUsePlanCache (124x) - 57397: 54, // hintUseToja (124x) - 44: 55, // ',' (122x) - 57414: 56, // hintDupsWeedOut (102x) - 57415: 57, // hintFirstMatch (102x) - 57416: 58, // hintLooseScan (102x) - 57417: 59, // hintMaterialization (102x) - 57409: 60, // hintTiFlash (102x) - 57408: 61, // hintTiKV (102x) - 57410: 62, // hintFalse (101x) - 57405: 63, // hintOLAP (101x) - 57406: 64, // hintOLTP (101x) - 57411: 65, // hintTrue (101x) - 57413: 66, // hintGB (100x) - 57412: 67, // hintMB (100x) - 57347: 68, // hintIdentifier (99x) - 57349: 69, // hintSingleAtIdentifier (84x) - 93: 70, // ']' (78x) - 57407: 71, // hintPartition (72x) - 46: 72, // '.' (68x) - 61: 73, // '=' (68x) - 40: 74, // '(' (63x) - 57344: 75, // $end (24x) - 57438: 76, // QueryBlockOpt (17x) - 57430: 77, // Identifier (13x) - 57346: 78, // hintIntLit (8x) - 57350: 79, // hintStringLit (5x) - 57420: 80, // CommaOpt (4x) - 57426: 81, // HintTable (4x) - 57427: 82, // HintTableList (4x) - 91: 83, // '[' (3x) - 57419: 84, // BooleanHintName (2x) - 57421: 85, // HintIndexList (2x) - 57423: 86, // HintStorageType (2x) - 57424: 87, // HintStorageTypeAndTable (2x) - 57428: 88, // HintTableListOpt (2x) - 57433: 89, // JoinOrderOptimizerHintName (2x) - 57434: 90, // NullaryHintName (2x) - 57437: 91, // PartitionListOpt (2x) - 57440: 92, // StorageOptimizerHintOpt (2x) - 57441: 93, // SubqueryOptimizerHintName (2x) - 57444: 94, // SubqueryStrategy (2x) - 57445: 95, // SupportedIndexLevelOptimizerHintName (2x) - 57446: 96, // SupportedTableLevelOptimizerHintName (2x) - 57447: 97, // TableOptimizerHintOpt (2x) - 57449: 98, // UnsupportedIndexLevelOptimizerHintName (2x) - 57450: 99, // UnsupportedTableLevelOptimizerHintName (2x) - 57422: 100, // HintQueryType (1x) - 57425: 101, // HintStorageTypeAndTableList (1x) - 57429: 102, // HintTrueOrFalse (1x) - 57431: 103, // IndexNameList (1x) - 57432: 104, // IndexNameListOpt (1x) - 57435: 105, // OptimizerHintList (1x) - 57436: 106, // PartitionList (1x) - 57439: 107, // Start (1x) - 57442: 108, // SubqueryStrategies (1x) - 57443: 109, // SubqueryStrategiesOpt (1x) - 57448: 110, // UnitOfBytes (1x) - 57451: 111, // Value (1x) - 57418: 112, // $default (0x) - 57345: 113, // error (0x) - 57348: 114, // hintInvalid (0x) + 41: 0, // ')' (133x) + 57378: 1, // hintAggToCop (125x) + 57391: 2, // hintBCJoin (125x) + 57355: 3, // hintBKA (125x) + 57357: 4, // hintBNL (125x) + 57402: 5, // hintForceIndex (125x) + 57380: 6, // hintHashAgg (125x) + 57359: 7, // hintHashJoin (125x) + 57381: 8, // hintIgnoreIndex (125x) + 57379: 9, // hintIgnorePlanCache (125x) + 57364: 10, // hintIndexMerge (125x) + 57382: 11, // hintInlHashJoin (125x) + 57383: 12, // hintInlJoin (125x) + 57384: 13, // hintInlMergeJoin (125x) + 57351: 14, // hintJoinFixedOrder (125x) + 57352: 15, // hintJoinOrder (125x) + 57353: 16, // hintJoinPrefix (125x) + 57354: 17, // hintJoinSuffix (125x) + 57404: 18, // hintLeading (125x) + 57401: 19, // hintLimitToCop (125x) + 57374: 20, // hintMaxExecutionTime (125x) + 57385: 21, // hintMemoryQuota (125x) + 57362: 22, // hintMerge (125x) + 57366: 23, // hintMRR (125x) + 57356: 24, // hintNoBKA (125x) + 57358: 25, // hintNoBNL (125x) + 57361: 26, // hintNoHashJoin (125x) + 57368: 27, // hintNoICP (125x) + 57365: 28, // hintNoIndexMerge (125x) + 57363: 29, // hintNoMerge (125x) + 57367: 30, // hintNoMRR (125x) + 57369: 31, // hintNoRangeOptimization (125x) + 57373: 32, // hintNoSemijoin (125x) + 57371: 33, // hintNoSkipScan (125x) + 57386: 34, // hintNoSwapJoinInputs (125x) + 57400: 35, // hintNthPlan (125x) + 57360: 36, // hintOrderedHashJoin (125x) + 57377: 37, // hintQBName (125x) + 57387: 38, // hintQueryType (125x) + 57388: 39, // hintReadConsistentReplica (125x) + 57389: 40, // hintReadFromStorage (125x) + 57376: 41, // hintResourceGroup (125x) + 57372: 42, // hintSemijoin (125x) + 57405: 43, // hintSemiJoinRewrite (125x) + 57375: 44, // hintSetVar (125x) + 57370: 45, // hintSkipScan (125x) + 57390: 46, // hintSMJoin (125x) + 57403: 47, // hintStraightJoin (125x) + 57392: 48, // hintStreamAgg (125x) + 57393: 49, // hintSwapJoinInputs (125x) + 57398: 50, // hintTimeRange (125x) + 57399: 51, // hintUseCascades (125x) + 57395: 52, // hintUseIndex (125x) + 57394: 53, // hintUseIndexMerge (125x) + 57396: 54, // hintUsePlanCache (125x) + 57397: 55, // hintUseToja (125x) + 44: 56, // ',' (123x) + 57415: 57, // hintDupsWeedOut (103x) + 57416: 58, // hintFirstMatch (103x) + 57417: 59, // hintLooseScan (103x) + 57418: 60, // hintMaterialization (103x) + 57410: 61, // hintTiFlash (103x) + 57409: 62, // hintTiKV (103x) + 57411: 63, // hintFalse (102x) + 57406: 64, // hintOLAP (102x) + 57407: 65, // hintOLTP (102x) + 57412: 66, // hintTrue (102x) + 57414: 67, // hintGB (101x) + 57413: 68, // hintMB (101x) + 57347: 69, // hintIdentifier (100x) + 57349: 70, // hintSingleAtIdentifier (85x) + 93: 71, // ']' (79x) + 57408: 72, // hintPartition (73x) + 46: 73, // '.' (69x) + 61: 74, // '=' (69x) + 40: 75, // '(' (64x) + 57344: 76, // $end (24x) + 57439: 77, // QueryBlockOpt (17x) + 57431: 78, // Identifier (13x) + 57346: 79, // hintIntLit (8x) + 57350: 80, // hintStringLit (5x) + 57421: 81, // CommaOpt (4x) + 57427: 82, // HintTable (4x) + 57428: 83, // HintTableList (4x) + 91: 84, // '[' (3x) + 57420: 85, // BooleanHintName (2x) + 57422: 86, // HintIndexList (2x) + 57424: 87, // HintStorageType (2x) + 57425: 88, // HintStorageTypeAndTable (2x) + 57429: 89, // HintTableListOpt (2x) + 57434: 90, // JoinOrderOptimizerHintName (2x) + 57435: 91, // NullaryHintName (2x) + 57438: 92, // PartitionListOpt (2x) + 57441: 93, // StorageOptimizerHintOpt (2x) + 57442: 94, // SubqueryOptimizerHintName (2x) + 57445: 95, // SubqueryStrategy (2x) + 57446: 96, // SupportedIndexLevelOptimizerHintName (2x) + 57447: 97, // SupportedTableLevelOptimizerHintName (2x) + 57448: 98, // TableOptimizerHintOpt (2x) + 57450: 99, // UnsupportedIndexLevelOptimizerHintName (2x) + 57451: 100, // UnsupportedTableLevelOptimizerHintName (2x) + 57423: 101, // HintQueryType (1x) + 57426: 102, // HintStorageTypeAndTableList (1x) + 57430: 103, // HintTrueOrFalse (1x) + 57432: 104, // IndexNameList (1x) + 57433: 105, // IndexNameListOpt (1x) + 57436: 106, // OptimizerHintList (1x) + 57437: 107, // PartitionList (1x) + 57440: 108, // Start (1x) + 57443: 109, // SubqueryStrategies (1x) + 57444: 110, // SubqueryStrategiesOpt (1x) + 57449: 111, // UnitOfBytes (1x) + 57452: 112, // Value (1x) + 57419: 113, // $default (0x) + 57345: 114, // error (0x) + 57348: 115, // hintInvalid (0x) } yyhintSymNames = []string{ @@ -284,6 +286,7 @@ var ( "hintReadFromStorage", "hintResourceGroup", "hintSemijoin", + "hintSemiJoinRewrite", "hintSetVar", "hintSkipScan", "hintSMJoin", @@ -360,65 +363,82 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, - {107, 1}, - {105, 1}, - {105, 3}, - {105, 1}, - {105, 3}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 4}, - {97, 5}, - {97, 5}, - {97, 5}, - {97, 6}, - {97, 4}, - {97, 4}, - {97, 6}, - {97, 6}, - {97, 5}, - {97, 4}, - {97, 5}, - {92, 5}, - {101, 1}, - {101, 3}, - {87, 4}, - {76, 0}, - {76, 1}, - {80, 0}, - {80, 1}, - {91, 0}, - {91, 4}, + {108, 1}, {106, 1}, {106, 3}, - {88, 1}, - {88, 1}, - {82, 2}, + {106, 1}, + {106, 3}, + {98, 4}, + {98, 4}, + {98, 4}, + {98, 4}, + {98, 4}, + {98, 4}, + {98, 5}, + {98, 5}, + {98, 5}, + {98, 6}, + {98, 4}, + {98, 4}, + {98, 6}, + {98, 6}, + {98, 5}, + {98, 4}, + {98, 5}, + {93, 5}, + {102, 1}, + {102, 3}, + {88, 4}, + {77, 0}, + {77, 1}, + {81, 0}, + {81, 1}, + {92, 0}, + {92, 4}, + {107, 1}, + {107, 3}, + {89, 1}, + {89, 1}, + {83, 2}, + {83, 3}, {82, 3}, - {81, 3}, - {81, 5}, - {85, 4}, - {104, 0}, + {82, 5}, + {86, 4}, + {105, 0}, + {105, 1}, {104, 1}, - {103, 1}, - {103, 3}, - {109, 0}, + {104, 3}, + {110, 0}, + {110, 1}, {109, 1}, - {108, 1}, - {108, 3}, - {111, 1}, + {109, 3}, + {112, 1}, + {112, 1}, + {112, 1}, {111, 1}, {111, 1}, - {110, 1}, - {110, 1}, - {102, 1}, - {102, 1}, - {89, 1}, - {89, 1}, - {89, 1}, + {103, 1}, + {103, 1}, + {90, 1}, + {90, 1}, + {90, 1}, + {100, 1}, + {100, 1}, + {100, 1}, + {100, 1}, + {100, 1}, + {100, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, + {97, 1}, {99, 1}, {99, 1}, {99, 1}, @@ -430,427 +450,415 @@ var ( {96, 1}, {96, 1}, {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {96, 1}, - {98, 1}, - {98, 1}, - {98, 1}, - {98, 1}, - {98, 1}, - {98, 1}, - {98, 1}, + {94, 1}, + {94, 1}, {95, 1}, {95, 1}, {95, 1}, {95, 1}, - {93, 1}, - {93, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {84, 1}, - {84, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {90, 1}, - {100, 1}, - {100, 1}, - {86, 1}, - {86, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, - {77, 1}, + {85, 1}, + {85, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {101, 1}, + {101, 1}, + {87, 1}, + {87, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, + {78, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [259][]uint16{ + yyhintParseTab = [261][]uint16{ // 0 - {1: 237, 210, 202, 204, 229, 235, 216, 227, 241, 219, 212, 211, 215, 181, 199, 200, 201, 218, 238, 188, 193, 207, 220, 203, 205, 206, 222, 239, 208, 221, 223, 231, 225, 214, 189, 217, 192, 197, 240, 198, 191, 230, 190, 224, 209, 242, 236, 213, 194, 233, 226, 228, 234, 232, 84: 195, 89: 182, 196, 92: 180, 187, 95: 186, 184, 179, 185, 183, 105: 178, 107: 177}, - {75: 176}, - {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 75: 175, 80: 432}, - {1: 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, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 75: 174}, - {1: 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, 75: 172}, + {1: 239, 211, 204, 206, 231, 237, 218, 229, 243, 221, 214, 212, 217, 183, 201, 202, 203, 220, 240, 190, 195, 213, 222, 205, 207, 208, 224, 241, 209, 223, 225, 233, 227, 216, 191, 219, 194, 199, 242, 200, 193, 232, 245, 192, 226, 210, 244, 238, 215, 196, 235, 228, 230, 236, 234, 85: 197, 90: 184, 198, 93: 182, 189, 96: 188, 186, 181, 187, 185, 106: 180, 108: 179}, + {76: 178}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 336, 76: 177, 81: 436}, + {1: 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, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 76: 176}, + {1: 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, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 76: 174}, // 5 - {74: 429}, - {74: 426}, - {74: 423}, - {74: 418}, - {74: 415}, + {75: 433}, + {75: 430}, + {75: 427}, + {75: 422}, + {75: 419}, // 10 - {74: 404}, - {74: 392}, - {74: 388}, - {74: 384}, - {74: 376}, + {75: 408}, + {75: 396}, + {75: 392}, + {75: 388}, + {75: 380}, // 15 - {74: 373}, - {74: 370}, - {74: 363}, - {74: 358}, - {74: 352}, + {75: 377}, + {75: 374}, + {75: 367}, + {75: 362}, + {75: 356}, // 20 - {74: 349}, - {74: 343}, - {74: 243}, - {74: 119}, - {74: 118}, + {75: 353}, + {75: 347}, + {75: 246}, + {75: 121}, + {75: 120}, // 25 - {74: 117}, - {74: 116}, - {74: 115}, - {74: 114}, - {74: 113}, + {75: 119}, + {75: 118}, + {75: 117}, + {75: 116}, + {75: 115}, // 30 - {74: 112}, - {74: 111}, - {74: 110}, - {74: 109}, - {74: 108}, + {75: 114}, + {75: 113}, + {75: 112}, + {75: 111}, + {75: 110}, // 35 - {74: 107}, - {74: 106}, - {74: 105}, - {74: 104}, - {74: 103}, + {75: 109}, + {75: 108}, + {75: 107}, + {75: 106}, + {75: 105}, // 40 - {74: 102}, - {74: 101}, - {74: 100}, - {74: 99}, - {74: 98}, + {75: 104}, + {75: 103}, + {75: 102}, + {75: 101}, + {75: 100}, // 45 - {74: 97}, - {74: 96}, - {74: 95}, - {74: 94}, - {74: 93}, + {75: 99}, + {75: 98}, + {75: 97}, + {75: 96}, + {75: 95}, // 50 - {74: 92}, - {74: 91}, - {74: 90}, - {74: 89}, - {74: 88}, + {75: 94}, + {75: 93}, + {75: 92}, + {75: 91}, + {75: 90}, // 55 - {74: 87}, - {74: 82}, - {74: 81}, - {74: 80}, - {74: 79}, + {75: 89}, + {75: 84}, + {75: 83}, + {75: 82}, + {75: 81}, // 60 - {74: 78}, - {74: 77}, - {74: 76}, - {74: 75}, - {74: 74}, + {75: 80}, + {75: 79}, + {75: 78}, + {75: 77}, + {75: 76}, // 65 - {74: 73}, - {74: 72}, - {60: 149, 149, 69: 245, 76: 244}, - {60: 250, 249, 86: 248, 247, 101: 246}, - {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, 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, 70: 148, 148, 78: 148}, + {75: 75}, + {75: 74}, + {75: 73}, + {61: 151, 151, 70: 248, 77: 247}, + {61: 253, 252, 87: 251, 250, 102: 249}, // 70 - {340, 55: 341}, - {152, 55: 152}, - {83: 251}, - {83: 69}, - {83: 68}, + {150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 71: 150, 150, 79: 150}, + {344, 56: 345}, + {154, 56: 154}, + {84: 254}, + {84: 70}, // 75 - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 253, 82: 252}, - {55: 338, 70: 337}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 254}, - {139, 55: 139, 70: 139}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 149, 149, 324, 76: 323}, + {84: 69}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 57: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 77: 256, 83: 255}, + {56: 342, 71: 341}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 258, 82: 257}, + {141, 56: 141, 71: 141}, // 80 - {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}, - {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}, - {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}, + {151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 151, 151, 328, 77: 327}, + {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}, + {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}, // 85 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 90 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 95 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 100 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 105 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 110 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 115 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 120 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 125 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 130 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 135 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 140 - {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}, - {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}, - {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}, + {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}, + {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}, + {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}, // 145 - {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}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 70: 145, 327, 91: 336}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 325}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 149, 149, 76: 326}, + {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}, + {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}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 71: 147, 331, 92: 340}, // 150 - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 70: 145, 327, 91: 328}, - {74: 329}, - {136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 70: 136}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 331, 106: 330}, - {333, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 80: 334}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 329}, + {151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 151, 151, 77: 330}, + {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 71: 147, 331, 92: 332}, + {75: 333}, + {138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 71: 138}, // 155 - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143}, - {146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 56: 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 79: 146}, - {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 70: 144}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 335}, - {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 335, 107: 334}, + {337, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 336, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 81: 338}, + {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145}, + {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, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 57: 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 80: 148}, + {146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 71: 146}, // 160 - {137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 70: 137}, - {150, 55: 150}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 339}, - {138, 55: 138, 70: 138}, - {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 75: 153}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 339}, + {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144}, + {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 71: 139}, + {152, 56: 152}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 258, 82: 343}, // 165 - {60: 250, 249, 86: 248, 342}, - {151, 55: 151}, - {63: 149, 149, 69: 245, 76: 344}, - {63: 346, 347, 100: 345}, - {348}, + {140, 56: 140, 71: 140}, + {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 76: 155}, + {61: 253, 252, 87: 251, 346}, + {153, 56: 153}, + {64: 151, 151, 70: 248, 77: 348}, // 170 + {64: 350, 351, 101: 349}, + {352}, + {72}, {71}, - {70}, - {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 75: 154}, - {149, 69: 245, 76: 350}, - {351}, + {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 76: 156}, // 175 - {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 75: 155}, - {62: 149, 65: 149, 69: 245, 76: 353}, - {62: 356, 65: 355, 102: 354}, - {357}, - {121}, + {151, 70: 248, 77: 354}, + {355}, + {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 76: 157}, + {63: 151, 66: 151, 70: 248, 77: 357}, + {63: 360, 66: 359, 103: 358}, // 180 - {120}, - {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 75: 156}, - {79: 359}, - {55: 332, 79: 147, 360}, - {79: 361}, - // 185 - {362}, - {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 75: 157}, - {69: 245, 76: 364, 78: 149}, - {78: 365}, - {66: 368, 367, 110: 366}, - // 190 - {369}, + {361}, {123}, {122}, - {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 75: 158}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 371}, + {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 76: 158}, + {80: 363}, + // 185 + {56: 336, 80: 149, 364}, + {80: 365}, + {366}, + {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 76: 159}, + {70: 248, 77: 368, 79: 151}, + // 190 + {79: 369}, + {67: 372, 371, 111: 370}, + {373}, + {125}, + {124}, // 195 - {372}, - {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 75: 159}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 374}, - {375}, - {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 75: 160}, + {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 76: 160}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 375}, + {376}, + {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 76: 161}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 378}, // 200 - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 377}, - {73: 378}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 381, 382, 380, 111: 379}, - {383}, - {126}, + {379}, + {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 76: 162}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 381}, + {74: 382}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 385, 386, 384, 112: 383}, // 205 - {125}, - {124}, - {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 75: 161}, - {69: 245, 76: 385, 78: 149}, - {78: 386}, - // 210 {387}, - {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 75: 162}, - {69: 245, 76: 389, 78: 149}, - {78: 390}, + {128}, + {127}, + {126}, + {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 76: 163}, + // 210 + {70: 248, 77: 389, 79: 151}, + {79: 390}, {391}, + {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 76: 164}, + {70: 248, 77: 393, 79: 151}, // 215 - {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 75: 163}, - {149, 56: 149, 149, 149, 149, 69: 245, 76: 393}, - {130, 56: 397, 398, 399, 400, 94: 396, 108: 395, 394}, - {403}, - {129, 55: 401}, + {79: 394}, + {395}, + {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 76: 165}, + {151, 57: 151, 151, 151, 151, 70: 248, 77: 397}, + {132, 57: 401, 402, 403, 404, 95: 400, 109: 399, 398}, // 220 - {128, 55: 128}, - {86, 55: 86}, - {85, 55: 85}, - {84, 55: 84}, - {83, 55: 83}, + {407}, + {131, 56: 405}, + {130, 56: 130}, + {88, 56: 88}, + {87, 56: 87}, // 225 - {56: 397, 398, 399, 400, 94: 402}, - {127, 55: 127}, - {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 75: 164}, - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 406, 85: 405}, - {414}, + {86, 56: 86}, + {85, 56: 85}, + {57: 401, 402, 403, 404, 95: 406}, + {129, 56: 129}, + {1: 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, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 76: 166}, // 230 - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 407}, - {147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 332, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 80: 408}, - {134, 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 411, 103: 410, 409}, - {135}, - {133, 55: 412}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 57: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 77: 410, 86: 409}, + {418}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 258, 82: 411}, + {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 336, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 81: 412}, + {136, 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 415, 104: 414, 413}, // 235 - {132, 55: 132}, - {1: 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 413}, - {131, 55: 131}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 75: 165}, - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 406, 85: 416}, + {137}, + {135, 56: 416}, + {134, 56: 134}, + {1: 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 417}, + {133, 56: 133}, // 240 - {417}, - {1: 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, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 75: 166}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 421, 82: 420, 88: 419}, - {422}, - {141, 55: 338}, + {1: 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, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 76: 167}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 57: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 77: 410, 86: 420}, + {421}, + {1: 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, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 76: 168}, + {151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 57: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 77: 425, 83: 424, 89: 423}, // 245 - {140, 284, 298, 261, 263, 308, 287, 265, 288, 286, 270, 289, 290, 291, 257, 258, 259, 260, 310, 285, 280, 292, 268, 272, 262, 264, 267, 274, 271, 269, 273, 275, 279, 277, 293, 307, 266, 283, 294, 295, 296, 282, 278, 281, 276, 297, 309, 299, 300, 305, 306, 302, 301, 303, 304, 56: 319, 320, 321, 322, 314, 313, 315, 311, 312, 316, 318, 317, 256, 77: 255, 81: 254}, - {1: 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, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 75: 167}, - {149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 421, 82: 420, 88: 424}, - {425}, - {1: 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, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 75: 168}, + {426}, + {143, 56: 342}, + {142, 287, 301, 264, 266, 311, 290, 268, 291, 289, 273, 292, 293, 294, 260, 261, 262, 263, 313, 288, 283, 295, 271, 275, 265, 267, 270, 277, 274, 272, 276, 278, 282, 280, 296, 310, 269, 286, 297, 298, 299, 285, 281, 314, 284, 279, 300, 312, 302, 303, 308, 309, 305, 304, 306, 307, 57: 323, 324, 325, 326, 318, 317, 319, 315, 316, 320, 322, 321, 259, 78: 258, 82: 257}, + {1: 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, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 76: 169}, + {151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 57: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 77: 425, 83: 424, 89: 428}, // 250 - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 56: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 245, 76: 253, 82: 427}, - {428, 55: 338}, - {1: 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, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 75: 169}, - {149, 69: 245, 76: 430}, - {431}, + {429}, + {1: 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, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 76: 170}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 57: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 248, 77: 256, 83: 431}, + {432, 56: 342}, + {1: 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, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 76: 171}, // 255 - {1: 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, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 75: 170}, - {1: 237, 210, 202, 204, 229, 235, 216, 227, 241, 219, 212, 211, 215, 181, 199, 200, 201, 218, 238, 188, 193, 207, 220, 203, 205, 206, 222, 239, 208, 221, 223, 231, 225, 214, 189, 217, 192, 197, 240, 198, 191, 230, 190, 224, 209, 242, 236, 213, 194, 233, 226, 228, 234, 232, 84: 195, 89: 182, 196, 92: 434, 187, 95: 186, 184, 433, 185, 183}, - {1: 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, 75: 173}, - {1: 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, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 75: 171}, + {151, 70: 248, 77: 434}, + {435}, + {1: 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, 76: 172}, + {1: 239, 211, 204, 206, 231, 237, 218, 229, 243, 221, 214, 212, 217, 183, 201, 202, 203, 220, 240, 190, 195, 213, 222, 205, 207, 208, 224, 241, 209, 223, 225, 233, 227, 216, 191, 219, 194, 199, 242, 200, 193, 232, 245, 192, 226, 210, 244, 238, 215, 196, 235, 228, 230, 236, 234, 85: 197, 90: 184, 198, 93: 438, 189, 96: 188, 186, 437, 187, 185}, + {1: 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, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 76: 175}, + // 260 + {1: 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, 76: 173}, } ) @@ -890,7 +898,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 113 + const yyError = 114 yyEx, _ := yylex.(yyhintLexerEx) var yyn int diff --git a/parser/hintparser.y b/parser/hintparser.y index 0938acff9df22..3808a1fc335ae 100644 --- a/parser/hintparser.y +++ b/parser/hintparser.y @@ -108,6 +108,7 @@ import ( hintForceIndex "FORCE_INDEX" hintStraightJoin "STRAIGHT_JOIN" hintLeading "LEADING" + hintSemiJoinRewrite "SEMI_JOIN_REWRITE" /* Other keywords */ hintOLAP "OLAP" @@ -530,13 +531,13 @@ UnsupportedTableLevelOptimizerHintName: | "NO_BNL" /* HASH_JOIN is supported by TiDB */ | "NO_HASH_JOIN" -| "MERGE" | "NO_MERGE" SupportedTableLevelOptimizerHintName: "MERGE_JOIN" | "BROADCAST_JOIN" | "INL_JOIN" +| "MERGE" | "INL_HASH_JOIN" | "SWAP_JOIN_INPUTS" | "NO_SWAP_JOIN_INPUTS" @@ -585,6 +586,7 @@ NullaryHintName: | "READ_CONSISTENT_REPLICA" | "IGNORE_PLAN_CACHE" | "STRAIGHT_JOIN" +| "SEMI_JOIN_REWRITE" HintQueryType: "OLAP" @@ -652,6 +654,7 @@ Identifier: | "FORCE_INDEX" | "STRAIGHT_JOIN" | "LEADING" +| "SEMI_JOIN_REWRITE" /* other keywords */ | "OLAP" | "OLTP" diff --git a/parser/hintparser_test.go b/parser/hintparser_test.go index 2c9156f579128..30d8d2c1ea803 100644 --- a/parser/hintparser_test.go +++ b/parser/hintparser_test.go @@ -261,7 +261,7 @@ func TestParseHint(t *testing.T) { }, }, { - input: "READ_FROM_STORAGE(@foo TIKV[a, b], TIFLASH[c, d]) HASH_AGG() READ_FROM_STORAGE(TIKV[e])", + input: "READ_FROM_STORAGE(@foo TIKV[a, b], TIFLASH[c, d]) HASH_AGG() SEMI_JOIN_REWRITE() READ_FROM_STORAGE(TIKV[e])", output: []*ast.TableOptimizerHint{ { HintName: model.NewCIStr("READ_FROM_STORAGE"), @@ -284,6 +284,9 @@ func TestParseHint(t *testing.T) { { HintName: model.NewCIStr("HASH_AGG"), }, + { + HintName: model.NewCIStr("SEMI_JOIN_REWRITE"), + }, { HintName: model.NewCIStr("READ_FROM_STORAGE"), HintData: model.NewCIStr("TIKV"), diff --git a/parser/hintparserimpl.go b/parser/hintparserimpl.go index dae3dedb75daa..a12489a6fbb2d 100644 --- a/parser/hintparserimpl.go +++ b/parser/hintparserimpl.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/parser/terror" ) +//revive:disable:exported var ( ErrWarnOptimizerHintUnsupportedHint = terror.ClassParser.NewStd(mysql.ErrWarnOptimizerHintUnsupportedHint) ErrWarnOptimizerHintInvalidToken = terror.ClassParser.NewStd(mysql.ErrWarnOptimizerHintInvalidToken) @@ -30,6 +31,8 @@ var ( ErrWarnOptimizerHintInvalidInteger = terror.ClassParser.NewStd(mysql.ErrWarnOptimizerHintInvalidInteger) ) +//revive:enable:exported + // hintScanner implements the yyhintLexer interface type hintScanner struct { Scanner diff --git a/parser/lexer.go b/parser/lexer.go index bcddc5f5bfcea..039dfe224e34a 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -306,7 +306,7 @@ func NewScanner(s string) *Scanner { return lexer } -func (s *Scanner) handleIdent(lval *yySymType) int { +func (*Scanner) handleIdent(lval *yySymType) int { str := lval.ident // A character string literal may have an optional character set introducer and COLLATE clause: // [_charset_name]'string' [COLLATE collation_name] @@ -512,9 +512,8 @@ func startWithSlash(s *Scanner) (tok int, pos Pos, lit string) { if isOptimizerHint { s.lastHintPos = pos return hintComment, pos, s.r.data(&pos) - } else { - return s.scan() } + return s.scan() case '*': currentCharIsStar = true continue @@ -712,7 +711,7 @@ func (s *Scanner) scanString() (tok int, pos Pos, lit string) { } // handleEscape handles the case in scanString when previous char is '\'. -func (s *Scanner) handleEscape(b byte, buf *bytes.Buffer) { +func (*Scanner) handleEscape(b byte, buf *bytes.Buffer) { var ch0 byte /* \" \' \\ \n \0 \b \Z \r \t ==> escape to one char @@ -977,7 +976,7 @@ func (r *reader) inc() { r.p.Line++ r.p.Col = 0 } - r.p.Offset += 1 + r.p.Offset++ r.p.Col++ } diff --git a/parser/misc.go b/parser/misc.go index 171eb81db3b8d..6c54150896578 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -942,6 +942,7 @@ var hintTokenMap = map[string]int{ "FORCE_INDEX": hintForceIndex, "STRAIGHT_JOIN": hintStraightJoin, "LEADING": hintLeading, + "SEMI_JOIN_REWRITE": hintSemiJoinRewrite, // TiDB hint aliases "TIDB_HJ": hintHashJoin, diff --git a/parser/model/ddl.go b/parser/model/ddl.go index 6be7ad22c571f..612e9bb618d1e 100644 --- a/parser/model/ddl.go +++ b/parser/model/ddl.go @@ -69,7 +69,7 @@ const ( ActionDropSequence ActionType = 36 ActionAddColumns ActionType = 37 // Deprecated, we use ActionMultiSchemaChange instead. ActionDropColumns ActionType = 38 // Deprecated, we use ActionMultiSchemaChange instead. - ActionModifyTableAutoIdCache ActionType = 39 + ActionModifyTableAutoIdCache ActionType = 39 //nolint:revive ActionRebaseAutoRandomBase ActionType = 40 ActionAlterIndexVisibility ActionType = 41 ActionExchangeTablePartition ActionType = 42 @@ -79,7 +79,7 @@ const ( // `ActionAlterTableAlterPartition` is removed and will never be used. // Just left a tombstone here for compatibility. - __DEPRECATED_ActionAlterTableAlterPartition ActionType = 46 + __DEPRECATED_ActionAlterTableAlterPartition ActionType = 46 //nolint:revive ActionRenameTables ActionType = 47 ActionDropIndexes ActionType = 48 // Deprecated, we use ActionMultiSchemaChange instead. @@ -231,6 +231,7 @@ type TimeZoneLocation struct { location *time.Location } +// GetLocation gets the timezone location. func (tz *TimeZoneLocation) GetLocation() (*time.Location, error) { if tz.location != nil { return tz.location, nil @@ -254,11 +255,12 @@ func NewDDLReorgMeta() *DDLReorgMeta { // MultiSchemaInfo keeps some information for multi schema change. type MultiSchemaInfo struct { - Warnings []*errors.Error - SubJobs []*SubJob `json:"sub_jobs"` Revertible bool `json:"revertible"` + // SkipVersion is used to control whether generating a new schema version for a sub-job. + SkipVersion bool `json:"-"` + AddColumns []CIStr `json:"-"` DropColumns []CIStr `json:"-"` ModifyColumns []CIStr `json:"-"` @@ -270,6 +272,7 @@ type MultiSchemaInfo struct { PositionColumns []CIStr `json:"-"` } +// NewMultiSchemaInfo new a MultiSchemaInfo. func NewMultiSchemaInfo() *MultiSchemaInfo { return &MultiSchemaInfo{ SubJobs: nil, @@ -277,6 +280,7 @@ func NewMultiSchemaInfo() *MultiSchemaInfo { } } +// SubJob is a representation of one DDL schema change. A Job may contain zero(when multi-schema change is not applicable) or more SubJobs. type SubJob struct { Type ActionType `json:"type"` Args []interface{} `json:"-"` @@ -288,6 +292,7 @@ type SubJob struct { RowCount int64 `json:"row_count"` Warning *terror.Error `json:"warning"` CtxVars []interface{} `json:"-"` + SchemaVer int64 `json:"schema_version"` } // IsNormal returns true if the sub-job is normally running. @@ -340,7 +345,8 @@ func (sub *SubJob) ToProxyJob(parentJob *Job) Job { } } -func (sub *SubJob) FromProxyJob(proxyJob *Job) { +// FromProxyJob converts a proxy job to a sub-job. +func (sub *SubJob) FromProxyJob(proxyJob *Job, ver int64) { sub.Revertible = proxyJob.MultiSchemaInfo.Revertible sub.SchemaState = proxyJob.SchemaState sub.SnapshotVer = proxyJob.SnapshotVer @@ -348,6 +354,7 @@ func (sub *SubJob) FromProxyJob(proxyJob *Job) { sub.State = proxyJob.State sub.Warning = proxyJob.Warning sub.RowCount = proxyJob.RowCount + sub.SchemaVer = ver } // Job is for a DDL operation. @@ -554,8 +561,12 @@ func (job *Job) DecodeArgs(args ...interface{}) error { // String implements fmt.Stringer interface. func (job *Job) String() string { rowCount := job.GetRowCount() - return 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", + 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) + if job.Type != ActionMultiSchemaChange && job.MultiSchemaInfo != nil { + ret += fmt.Sprintf(", Multi-Schema Change:true, Revertible:%v", job.MultiSchemaInfo.Revertible) + } + return ret } func (job *Job) hasDependentSchema(other *Job) (bool, error) { @@ -572,6 +583,63 @@ func (job *Job) hasDependentSchema(other *Job) (bool, error) { return true, nil } } + if job.Type == ActionExchangeTablePartition { + var ( + defID int64 + ptSchemaID int64 + ptID int64 + partName string + withValidation bool + ) + if err := job.DecodeArgs(&defID, &ptSchemaID, &ptID, &partName, &withValidation); err != nil { + return false, errors.Trace(err) + } + if other.SchemaID == ptSchemaID { + return true, nil + } + } + } + return false, nil +} + +func (job *Job) hasDependentTableForExchangePartition(other *Job) (bool, error) { + if job.Type == ActionExchangeTablePartition { + var ( + defID int64 + ptSchemaID int64 + ptID int64 + partName string + withValidation bool + ) + + if err := job.DecodeArgs(&defID, &ptSchemaID, &ptID, &partName, &withValidation); err != nil { + return false, errors.Trace(err) + } + if ptID == other.TableID || defID == other.TableID { + return true, nil + } + + if other.Type == ActionExchangeTablePartition { + var ( + otherDefID int64 + otherPtSchemaID int64 + otherPtID int64 + otherPartName string + otherWithValidation bool + ) + if err := other.DecodeArgs(&otherDefID, &otherPtSchemaID, &otherPtID, &otherPartName, &otherWithValidation); err != nil { + return false, errors.Trace(err) + } + if job.TableID == other.TableID || job.TableID == otherPtID || job.TableID == otherDefID { + return true, nil + } + if ptID == other.TableID || ptID == otherPtID || ptID == otherDefID { + return true, nil + } + if defID == other.TableID || defID == otherPtID || defID == otherDefID { + return true, nil + } + } } return false, nil } @@ -594,6 +662,14 @@ func (job *Job) IsDependentOn(other *Job) (bool, error) { if other.TableID == job.TableID { return true, nil } + isDependent, err = job.hasDependentTableForExchangePartition(other) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } + isDependent, err = other.hasDependentTableForExchangePartition(job) + if err != nil || isDependent { + return isDependent, errors.Trace(err) + } return false, nil } @@ -638,10 +714,12 @@ func (job *Job) IsRunning() bool { return job.State == JobStateRunning } +// IsQueueing returns whether job is queuing or not. func (job *Job) IsQueueing() bool { return job.State == JobStateQueueing } +// NotStarted returns true if the job is never run by a worker. func (job *Job) NotStarted() bool { return job.State == JobStateNone || job.State == JobStateQueueing } @@ -657,6 +735,14 @@ func (job *Job) MayNeedReorg() bool { return ok && needReorg } return false + case ActionMultiSchemaChange: + for _, sub := range job.MultiSchemaInfo.SubJobs { + proxyJob := Job{Type: sub.Type, CtxVars: sub.CtxVars} + if proxyJob.MayNeedReorg() { + return true + } + } + return false default: return false } diff --git a/parser/model/model.go b/parser/model/model.go index 3c636b3191769..a5b61033e6716 100644 --- a/parser/model/model.go +++ b/parser/model/model.go @@ -131,74 +131,92 @@ func (c *ColumnInfo) Clone() *ColumnInfo { return &nc } +// GetType returns the type of ColumnInfo. func (c *ColumnInfo) GetType() byte { return c.FieldType.GetType() } +// GetFlag returns the flag of ColumnInfo. func (c *ColumnInfo) GetFlag() uint { return c.FieldType.GetFlag() } +// GetFlen returns the flen of ColumnInfo. func (c *ColumnInfo) GetFlen() int { return c.FieldType.GetFlen() } +// GetDecimal returns the decimal of ColumnInfo. func (c *ColumnInfo) GetDecimal() int { return c.FieldType.GetDecimal() } +// GetCharset returns the charset of ColumnInfo. func (c *ColumnInfo) GetCharset() string { return c.FieldType.GetCharset() } +// GetCollate returns the collation of ColumnInfo. func (c *ColumnInfo) GetCollate() string { return c.FieldType.GetCollate() } +// GetElems returns the elems of ColumnInfo. func (c *ColumnInfo) GetElems() []string { return c.FieldType.GetElems() } +// SetType set the type of ColumnInfo. func (c *ColumnInfo) SetType(tp byte) { c.FieldType.SetType(tp) } +// SetFlag set the flag of ColumnInfo. func (c *ColumnInfo) SetFlag(flag uint) { c.FieldType.SetFlag(flag) } +// AddFlag adds the flag of ColumnInfo. func (c *ColumnInfo) AddFlag(flag uint) { c.FieldType.AddFlag(flag) } +// AndFlag adds a flag to the column. func (c *ColumnInfo) AndFlag(flag uint) { c.FieldType.AndFlag(flag) } +// ToggleFlag flips the flag according to the value. func (c *ColumnInfo) ToggleFlag(flag uint) { c.FieldType.ToggleFlag(flag) } +// DelFlag removes the flag from the column's flag. func (c *ColumnInfo) DelFlag(flag uint) { c.FieldType.DelFlag(flag) } +// SetFlen sets the flen of ColumnInfo. func (c *ColumnInfo) SetFlen(flen int) { c.FieldType.SetFlen(flen) } +// SetDecimal sets the decimal of ColumnInfo. func (c *ColumnInfo) SetDecimal(decimal int) { c.FieldType.SetDecimal(decimal) } +// SetCharset sets charset of the ColumnInfo func (c *ColumnInfo) SetCharset(charset string) { c.FieldType.SetCharset(charset) } +// SetCollate sets the collation of the column. func (c *ColumnInfo) SetCollate(collate string) { c.FieldType.SetCollate(collate) } +// SetElems set the elements of enum column. func (c *ColumnInfo) SetElems(elems []string) { c.FieldType.SetElems(elems) } @@ -361,10 +379,10 @@ const ( var ExtraHandleName = NewCIStr("_tidb_rowid") // ExtraPartitionIdName is the name of ExtraPartitionId Column. -var ExtraPartitionIdName = NewCIStr("_tidb_pid") +var ExtraPartitionIdName = NewCIStr("_tidb_pid") //nolint:revive // ExtraPhysTblIdName is the name of ExtraPhysTblID Column. -var ExtraPhysTblIdName = NewCIStr("_tidb_tid") +var ExtraPhysTblIdName = NewCIStr("_tidb_tid") //nolint:revive // TableInfo provides meta data describing a DB table. type TableInfo struct { @@ -390,7 +408,7 @@ type TableInfo struct { Comment string `json:"comment"` AutoIncID int64 `json:"auto_inc_id"` - AutoIdCache int64 `json:"auto_id_cache"` + AutoIdCache int64 `json:"auto_id_cache"` //nolint:revive AutoRandID int64 `json:"auto_rand_id"` MaxColumnID int64 `json:"max_col_id"` MaxIndexID int64 `json:"max_idx_id"` @@ -448,15 +466,22 @@ type TableInfo struct { // StatsOptions is used when do analyze/auto-analyze for each table StatsOptions *StatsOptions `json:"stats_options"` + + ExchangePartitionInfo *ExchangePartitionInfo `json:"exchange_partition_info"` } + +// TableCacheStatusType is the type of the table cache status type TableCacheStatusType int +//revive:disable:exported const ( TableCacheStatusDisable TableCacheStatusType = iota TableCacheStatusEnable TableCacheStatusSwitching ) +//revive:enable:exported + func (t TableCacheStatusType) String() string { switch t { case TableCacheStatusDisable: @@ -470,14 +495,18 @@ func (t TableCacheStatusType) String() string { } } +// TempTableType is the type of the temp table type TempTableType byte +//revive:disable:exported const ( TempTableNone TempTableType = iota TempTableGlobal TempTableLocal ) +//revive:enable:exported + func (t TempTableType) String() string { switch t { case TempTableGlobal: @@ -544,6 +573,7 @@ func (t TableLockState) String() string { type TableLockType byte const ( + // TableLockNone means this table lock is absent. TableLockNone TableLockType = iota // TableLockRead means the session with this lock can read the table (but not write it). // Multiple sessions can acquire a READ lock for the table at the same time. @@ -579,8 +609,10 @@ func (t TableLockType) String() string { return "" } +// TiFlashMode is the type of the table's mode in TiFlash. type TiFlashMode string +//revive:disable:exported const ( // In order to be compatible with the old version without tiflash mode // we set the normal mode(default mode) as empty @@ -588,6 +620,8 @@ const ( TiFlashModeFast TiFlashMode = "fast" ) +//revive:enable:exported + func (t TiFlashMode) String() string { switch t { case TiFlashModeNormal: @@ -681,6 +715,7 @@ func (t *TableInfo) GetPkColInfo() *ColumnInfo { return nil } +// GetAutoIncrementColInfo gets the ColumnInfo of auto_increment column if exists. func (t *TableInfo) GetAutoIncrementColInfo() *ColumnInfo { for _, colInfo := range t.Columns { if mysql.HasAutoIncrementFlag(colInfo.GetFlag()) { @@ -690,6 +725,7 @@ func (t *TableInfo) GetAutoIncrementColInfo() *ColumnInfo { return nil } +// IsAutoIncColUnsigned checks whether the auto increment column is unsigned. func (t *TableInfo) IsAutoIncColUnsigned() bool { col := t.GetAutoIncrementColInfo() if col == nil { @@ -915,12 +951,15 @@ func (t *TableInfo) IsBaseTable() bool { // See https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html type ViewAlgorithm int +//revive:disable:exported const ( AlgorithmUndefined ViewAlgorithm = iota AlgorithmMerge AlgorithmTemptable ) +//revive:enable:exported + func (v *ViewAlgorithm) String() string { switch *v { case AlgorithmMerge: @@ -938,11 +977,14 @@ func (v *ViewAlgorithm) String() string { // See https://dev.mysql.com/doc/refman/5.7/en/create-view.html type ViewSecurity int +//revive:disable:exported const ( SecurityDefiner ViewSecurity = iota SecurityInvoker ) +//revive:enable:exported + func (v *ViewSecurity) String() string { switch *v { case SecurityInvoker: @@ -958,11 +1000,14 @@ func (v *ViewSecurity) String() string { // See https://dev.mysql.com/doc/refman/5.7/en/view-check-option.html type ViewCheckOption int +//revive:disable:exported const ( CheckOptionLocal ViewCheckOption = iota CheckOptionCascaded ) +//revive:enable:exported + func (v *ViewCheckOption) String() string { switch *v { case CheckOptionLocal: @@ -974,6 +1019,7 @@ func (v *ViewCheckOption) String() string { } } +//revive:disable:exported // ViewInfo provides meta data describing a DB view. type ViewInfo struct { Algorithm ViewAlgorithm `json:"view_algorithm"` @@ -1010,6 +1056,8 @@ type SequenceInfo struct { Comment string `json:"sequence_comment"` } +//revive:enable:exported + // PartitionType is the type for PartitionInfo type PartitionType int @@ -1037,7 +1085,13 @@ func (p PartitionType) String() string { default: return "" } +} +// ExchangePartitionInfo provides exchange partition info. +type ExchangePartitionInfo struct { + ExchangePartitionFlag bool `json:"exchange_partition_flag"` + ExchangePartitionID int64 `json:"exchange_partition_id"` + ExchangePartitionDefID int64 `json:"exchange_partition_def_id"` } // PartitionInfo provides table partition info. @@ -1060,6 +1114,7 @@ type PartitionInfo struct { Num uint64 `json:"num"` } +// Clone clones itself. func (pi *PartitionInfo) Clone() *PartitionInfo { newPi := *pi newPi.Columns = make([]CIStr, len(pi.Columns)) @@ -1096,6 +1151,7 @@ func (pi *PartitionInfo) GetNameByID(id int64) string { return "" } +// GetStateByID gets the partition state by ID. func (pi *PartitionInfo) GetStateByID(id int64) SchemaState { for _, pstate := range pi.States { if pstate.ID == id { @@ -1105,6 +1161,7 @@ func (pi *PartitionInfo) GetStateByID(id int64) SchemaState { return StatePublic } +// SetStateByID sets the state of the partition by ID. func (pi *PartitionInfo) SetStateByID(id int64, state SchemaState) { newState := PartitionState{ID: id, State: state} for i, pstate := range pi.States { @@ -1119,6 +1176,7 @@ func (pi *PartitionInfo) SetStateByID(id int64, state SchemaState) { pi.States = append(pi.States, newState) } +// GCPartitionStates cleans up the partition state. func (pi *PartitionInfo) GCPartitionStates() { if len(pi.States) < 1 { return @@ -1139,6 +1197,7 @@ func (pi *PartitionInfo) GCPartitionStates() { pi.States = newStates } +// PartitionState is the state of the partition. type PartitionState struct { ID int64 `json:"id"` State SchemaState `json:"state"` @@ -1205,12 +1264,15 @@ func (p PrimaryKeyType) String() string { } } +//revive:disable:exported const ( PrimaryKeyTypeDefault PrimaryKeyType = iota PrimaryKeyTypeClustered PrimaryKeyTypeNonClustered ) +//revive:enable:exported + // IndexType is the type of index type IndexType int @@ -1273,6 +1335,16 @@ func (index *IndexInfo) HasPrefixIndex() bool { return false } +// HasColumnInIndexColumns checks whether the index contains the column with the specified ID. +func (index *IndexInfo) HasColumnInIndexColumns(tblInfo *TableInfo, colID int64) bool { + for _, ic := range index.Columns { + if tblInfo.Columns[ic.Offset].ID == colID { + return true + } + } + return false +} + // ConstraintInfo provides meta data describing check-expression constraint. type ConstraintInfo struct { ID int64 `json:"id"` @@ -1376,6 +1448,7 @@ func (db *DBInfo) Copy() *DBInfo { return &newInfo } +// LessDBInfo is used for sorting DBInfo by DBInfo.Name. func LessDBInfo(a *DBInfo, b *DBInfo) bool { return a.Name.L < b.Name.L } @@ -1417,12 +1490,6 @@ func (cis *CIStr) UnmarshalJSON(b []byte) error { return nil } -// TableColumnID is composed by table ID and column ID. -type TableColumnID struct { - TableID int64 - ColumnID int64 -} - // TableItemID is composed by table ID and column/index ID type TableItemID struct { TableID int64 @@ -1459,6 +1526,7 @@ type PolicyInfo struct { State SchemaState `json:"state"` } +// Clone clones PolicyInfo. func (p *PolicyInfo) Clone() *PolicyInfo { cloned := *p cloned.PlacementSettings = p.PlacementSettings.Clone() @@ -1521,11 +1589,13 @@ func (p *PlacementSettings) String() string { return sb.String() } +// Clone clones the placement settings. func (p *PlacementSettings) Clone() *PlacementSettings { cloned := *p return &cloned } +// StatsOptions is the struct to store the stats options. type StatsOptions struct { *StatsWindowSettings AutoRecalc bool `json:"auto_recalc"` @@ -1538,6 +1608,7 @@ type StatsOptions struct { Concurrency uint `json:"concurrency"` } +// NewStatsOptions creates a new StatsOptions. func NewStatsOptions() *StatsOptions { return &StatsOptions{ AutoRecalc: true, @@ -1551,8 +1622,10 @@ func NewStatsOptions() *StatsOptions { } } +// ColumnChoice is the type of the column choice. type ColumnChoice byte +//revive:disable:exported const ( DefaultChoice ColumnChoice = iota AllColumns @@ -1560,6 +1633,8 @@ const ( ColumnList ) +//revive:enable:exported + func (s ColumnChoice) String() string { switch s { case AllColumns: @@ -1573,6 +1648,7 @@ func (s ColumnChoice) String() string { } } +// StatsWindowSettings is the settings of the stats window. type StatsWindowSettings struct { WindowStart time.Time `json:"window_start"` WindowEnd time.Time `json:"window_end"` @@ -1580,8 +1656,10 @@ type StatsWindowSettings struct { RepeatInterval uint `json:"repeat_interval"` } +// WindowRepeatType is the type of the window repeat. type WindowRepeatType byte +//revive:disable:exported const ( Never WindowRepeatType = iota Day @@ -1589,6 +1667,8 @@ const ( Month ) +//revive:enable:exported + func (s WindowRepeatType) String() string { switch s { case Never: diff --git a/parser/model/model_test.go b/parser/model/model_test.go index 480786ec14050..3e15ae6b1c380 100644 --- a/parser/model/model_test.go +++ b/parser/model/model_test.go @@ -274,6 +274,175 @@ func TestJobCodec(t *testing.T) { require.NoError(t, err) require.True(t, isDependent) + // Test IsDependentOn for exchange partition with table. + // test ActionCreateSchema and ActionExchangeTablePartition is dependent. + job3 := &Job{ + ID: 4, + TableID: 4, + SchemaID: 4, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{int64(6), int64(3), int64(5), "pt", true}, + } + job3.RawArgs, err = json.Marshal(job3.Args) + require.NoError(t, err) + isDependent, err = job3.IsDependentOn(job2) + require.NoError(t, err) + require.True(t, isDependent) + + // test random and ActionExchangeTablePartition is dependent because TableID is same. + job4 := &Job{ + ID: 5, + TableID: 5, + SchemaID: 3, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{6, 4, 2, "pt", true}, + } + job4.RawArgs, err = json.Marshal(job4.Args) + require.NoError(t, err) + isDependent, err = job4.IsDependentOn(job) + require.NoError(t, err) + require.True(t, isDependent) + + // test ActionExchangeTablePartition and ActionExchangeTablePartition is dependent. + job5 := &Job{ + ID: 6, + TableID: 6, + SchemaID: 6, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{2, 6, 5, "pt", true}, + } + job5.RawArgs, err = json.Marshal(job5.Args) + require.NoError(t, err) + isDependent, err = job5.IsDependentOn(job4) + require.NoError(t, err) + require.True(t, isDependent) + + job6 := &Job{ + ID: 7, + TableID: 7, + SchemaID: 7, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{6, 4, 2, "pt", true}, + } + job6.RawArgs, err = json.Marshal(job6.Args) + require.NoError(t, err) + isDependent, err = job6.IsDependentOn(job5) + require.NoError(t, err) + require.True(t, isDependent) + + job7 := &Job{ + ID: 8, + TableID: 8, + SchemaID: 8, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{8, 4, 6, "pt", true}, + } + job7.RawArgs, err = json.Marshal(job7.Args) + require.NoError(t, err) + isDependent, err = job7.IsDependentOn(job6) + require.NoError(t, err) + require.True(t, isDependent) + + job8 := &Job{ + ID: 9, + TableID: 9, + SchemaID: 9, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{8, 9, 9, "pt", true}, + } + job8.RawArgs, err = json.Marshal(job8.Args) + require.NoError(t, err) + isDependent, err = job8.IsDependentOn(job7) + require.NoError(t, err) + require.True(t, isDependent) + + job9 := &Job{ + ID: 10, + TableID: 10, + SchemaID: 10, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{10, 10, 8, "pt", true}, + } + job9.RawArgs, err = json.Marshal(job9.Args) + require.NoError(t, err) + isDependent, err = job9.IsDependentOn(job8) + require.NoError(t, err) + require.True(t, isDependent) + + // test ActionDropSchema and ActionExchangeTablePartition is dependent. + job10 := &Job{ + ID: 11, + TableID: 11, + SchemaID: 11, + Type: ActionDropSchema, + BinlogInfo: &HistoryInfo{}, + } + job10.RawArgs, err = json.Marshal(job10.Args) + require.NoError(t, err) + + job11 := &Job{ + ID: 12, + TableID: 12, + SchemaID: 11, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{10, 10, 8, "pt", true}, + } + job11.RawArgs, err = json.Marshal(job11.Args) + require.NoError(t, err) + isDependent, err = job11.IsDependentOn(job10) + require.NoError(t, err) + require.True(t, isDependent) + + // test ActionDropTable and ActionExchangeTablePartition is dependent. + job12 := &Job{ + ID: 13, + TableID: 13, + SchemaID: 11, + Type: ActionDropTable, + BinlogInfo: &HistoryInfo{}, + } + job12.RawArgs, err = json.Marshal(job12.Args) + require.NoError(t, err) + isDependent, err = job11.IsDependentOn(job12) + require.NoError(t, err) + require.False(t, isDependent) + + job13 := &Job{ + ID: 14, + TableID: 12, + SchemaID: 14, + Type: ActionDropTable, + BinlogInfo: &HistoryInfo{}, + } + job13.RawArgs, err = json.Marshal(job13.Args) + require.NoError(t, err) + isDependent, err = job11.IsDependentOn(job13) + require.NoError(t, err) + require.True(t, isDependent) + + // test ActionDropTable and ActionExchangeTablePartition is dependent. + job14 := &Job{ + ID: 15, + TableID: 15, + SchemaID: 15, + Type: ActionExchangeTablePartition, + BinlogInfo: &HistoryInfo{}, + Args: []interface{}{16, 17, 12, "pt", true}, + } + job14.RawArgs, err = json.Marshal(job14.Args) + require.NoError(t, err) + isDependent, err = job13.IsDependentOn(job14) + require.NoError(t, err) + require.True(t, isDependent) + require.Equal(t, false, job.IsCancelled()) b, err := job.Encode(false) require.NoError(t, err) diff --git a/parser/mysql/const.go b/parser/mysql/const.go index 81e551a125e01..8d9396d26e8c8 100644 --- a/parser/mysql/const.go +++ b/parser/mysql/const.go @@ -42,7 +42,7 @@ const ( LocalInFileHeader byte = 0xfb ) -// Protocol Features +// AuthSwitchRequest is a protocol feature. const AuthSwitchRequest byte = 0xfe // Server information. @@ -167,6 +167,7 @@ const ( AuthNativePassword = "mysql_native_password" // #nosec G101 AuthCachingSha2Password = "caching_sha2_password" // #nosec G101 AuthSocket = "auth_socket" + AuthTiDBSessionToken = "tidb_session_token" ) // MySQL database and tables. @@ -230,6 +231,7 @@ const MaxTypeSetMembers = 64 // PWDHashLen is the length of mysql_native_password's hash. const PWDHashLen = 40 // excluding the '*' +// SHAPWDHashLen is the length of sha256_password's hash. const SHAPWDHashLen = 70 // Command2Str is the command information to command name. diff --git a/parser/mysql/errcode.go b/parser/mysql/errcode.go index d9e3fe5a6e351..d75b3fc42db31 100644 --- a/parser/mysql/errcode.go +++ b/parser/mysql/errcode.go @@ -926,11 +926,11 @@ const ( ErrWindowNestedWindowFuncUseInWindowSpec = 3595 ErrWindowRowsIntervalUse = 3596 ErrWindowNoGroupOrderUnused = 3597 - ErrWindowExplainJson = 3598 + ErrWindowExplainJson = 3598 //nolint: revive ErrWindowFunctionIgnoresFrame = 3599 ErrDataTruncatedFunctionalIndex = 3751 ErrDataOutOfRangeFunctionalIndex = 3752 - ErrFunctionalIndexOnJsonOrGeometryFunction = 3753 + ErrFunctionalIndexOnJsonOrGeometryFunction = 3753 //nolint: revive ErrFunctionalIndexRefAutoIncrement = 3754 ErrCannotDropColumnFunctionalIndex = 3755 ErrFunctionalIndexPrimaryKey = 3756 @@ -943,8 +943,8 @@ const ( ErrFKIncompatibleColumns = 3780 ErrFunctionalIndexRowValueIsNotAllowed = 3800 ErrDependentByFunctionalIndex = 3837 - ErrInvalidJsonValueForFuncIndex = 3903 - ErrJsonValueOutOfRangeForFuncIndex = 3904 + ErrInvalidJsonValueForFuncIndex = 3903 //nolint: revive + ErrJsonValueOutOfRangeForFuncIndex = 3904 //nolint: revive ErrFunctionalIndexDataIsTooLong = 3907 ErrFunctionalIndexNotApplicable = 3909 diff --git a/parser/mysql/errname.go b/parser/mysql/errname.go index 0cf4783a2c35d..c3a98697900fe 100644 --- a/parser/mysql/errname.go +++ b/parser/mysql/errname.go @@ -13,6 +13,7 @@ package mysql +// ErrMessage is a error message with the format specifier. type ErrMessage struct { Raw string RedactArgPos []int diff --git a/parser/mysql/locale_format.go b/parser/mysql/locale_format.go index b483f94fc189f..30f13841b3bc9 100644 --- a/parser/mysql/locale_format.go +++ b/parser/mysql/locale_format.go @@ -89,10 +89,10 @@ func formatENUS(number string, precision string) (string, error) { return buffer.String(), nil } -func formatZHCN(number string, precision string) (string, error) { +func formatZHCN(_ string, _ string) (string, error) { return "", errors.New("not implemented") } -func formatNotSupport(number string, precision string) (string, error) { +func formatNotSupport(_ string, _ string) (string, error) { return "", errors.New("not support for the specific locale") } diff --git a/parser/mysql/privs.go b/parser/mysql/privs.go index af1c453487a0e..060dcc2d0815a 100644 --- a/parser/mysql/privs.go +++ b/parser/mysql/privs.go @@ -259,9 +259,13 @@ const ( DropRolePriv // CreateTMPTablePriv is the privilege to create a temporary table. CreateTMPTablePriv + // LockTablesPriv is the privilege to lock tables. LockTablesPriv + // CreateRoutinePriv is the privilege to create a stored routine. CreateRoutinePriv + // AlterRoutinePriv is the privilege to alter a stored routine. AlterRoutinePriv + // EventPriv is the privilege to event. EventPriv // ShutdownPriv the privilege to shutdown a server. @@ -296,8 +300,10 @@ const ( // If it's passed to RequestVerification, it means any privilege would be OK. const AllPrivMask = AllPriv - 1 +// Privileges is the list of all privileges. type Privileges []PrivilegeType +// Has checks whether PrivilegeType has the privilege. func (privs Privileges) Has(p PrivilegeType) bool { for _, cp := range privs { if cp == p { diff --git a/parser/parser.go b/parser/parser.go index 416ac3799825f..14bbf175a6196 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -825,13 +825,13 @@ const ( zerofill = 57571 yyMaxDepth = 200 - yyTabOfs = -2508 + yyTabOfs = -2509 ) var ( yyXLAT = map[int]int{ - 57344: 0, // $end (2213x) - 59: 1, // ';' (2212x) + 57344: 0, // $end (2214x) + 59: 1, // ';' (2213x) 57805: 2, // remove (1856x) 57806: 3, // reorganize (1856x) 57626: 4, // comment (1790x) @@ -3605,6 +3605,7 @@ var ( {805, 6}, {805, 8}, {805, 10}, + {805, 5}, {805, 7}, {1101, 1}, {1101, 2}, @@ -6114,80 +6115,80 @@ var ( yyParseTab = [4251][]uint16{ // 0 - {2035, 2035, 48: 2539, 69: 2658, 71: 2518, 80: 2550, 145: 2520, 152: 2548, 2533, 155: 2517, 168: 2544, 203: 2569, 207: 2671, 210: 2513, 220: 2568, 2535, 2667, 2519, 238: 2547, 243: 2523, 248: 2545, 250: 2514, 253: 2551, 271: 2537, 275: 2536, 282: 2549, 284: 2515, 287: 2538, 298: 2528, 473: 2559, 2558, 496: 2666, 501: 2557, 504: 2567, 507: 2543, 525: 2661, 529: 2531, 567: 2542, 569: 2556, 645: 2552, 648: 2670, 652: 2516, 2660, 660: 2511, 668: 2522, 673: 2521, 678: 2566, 685: 2512, 708: 2563, 738: 2524, 747: 2565, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2638, 2637, 765: 2525, 771: 2659, 773: 2619, 2630, 2649, 778: 2526, 782: 2585, 798: 2534, 805: 2573, 808: 2664, 843: 2580, 847: 2583, 852: 2662, 857: 2622, 859: 2632, 861: 2627, 2636, 2639, 2540, 929: 2592, 933: 2529, 971: 2665, 978: 2571, 980: 2572, 2575, 2576, 984: 2578, 986: 2577, 988: 2574, 990: 2579, 2581, 2582, 995: 2541, 2618, 998: 2588, 1008: 2596, 2589, 2590, 2591, 2597, 2595, 2598, 2599, 1017: 2594, 2593, 1020: 2584, 2546, 2530, 2600, 2612, 2601, 2602, 2603, 2605, 2609, 2606, 2610, 2611, 2604, 2608, 2607, 1037: 2570, 1041: 2586, 1043: 2587, 2532, 1048: 2614, 2613, 1052: 2616, 2617, 2615, 1058: 2655, 2620, 1066: 2669, 2668, 2621, 1073: 2623, 1076: 2652, 1078: 2656, 1102: 2624, 2625, 1105: 2626, 1107: 2631, 1110: 2628, 2629, 1113: 2654, 2633, 2663, 2635, 2634, 1122: 2640, 1124: 2642, 2641, 2645, 1128: 2646, 1130: 2653, 1133: 2643, 2657, 1138: 2644, 1149: 2647, 2648, 2651, 1153: 2650, 1297: 2509, 1300: 2510}, - {2508}, - {2507, 6757}, - {16: 6709, 132: 6706, 164: 6707, 190: 6710, 257: 6708, 491: 4158, 569: 1846, 583: 6054, 849: 6705, 853: 4157}, - {164: 6690, 569: 6689}, + {2035, 2035, 48: 2540, 69: 2659, 71: 2519, 80: 2551, 145: 2521, 152: 2549, 2534, 155: 2518, 168: 2545, 203: 2570, 207: 2672, 210: 2514, 220: 2569, 2536, 2668, 2520, 238: 2548, 243: 2524, 248: 2546, 250: 2515, 253: 2552, 271: 2538, 275: 2537, 282: 2550, 284: 2516, 287: 2539, 298: 2529, 473: 2560, 2559, 496: 2667, 501: 2558, 504: 2568, 507: 2544, 525: 2662, 529: 2532, 567: 2543, 569: 2557, 645: 2553, 648: 2671, 652: 2517, 2661, 660: 2512, 668: 2523, 673: 2522, 678: 2567, 685: 2513, 708: 2564, 738: 2525, 747: 2566, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2639, 2638, 765: 2526, 771: 2660, 773: 2620, 2631, 2650, 778: 2527, 782: 2586, 798: 2535, 805: 2574, 808: 2665, 843: 2581, 847: 2584, 852: 2663, 857: 2623, 859: 2633, 861: 2628, 2637, 2640, 2541, 929: 2593, 933: 2530, 971: 2666, 978: 2572, 980: 2573, 2576, 2577, 984: 2579, 986: 2578, 988: 2575, 990: 2580, 2582, 2583, 995: 2542, 2619, 998: 2589, 1008: 2597, 2590, 2591, 2592, 2598, 2596, 2599, 2600, 1017: 2595, 2594, 1020: 2585, 2547, 2531, 2601, 2613, 2602, 2603, 2604, 2606, 2610, 2607, 2611, 2612, 2605, 2609, 2608, 1037: 2571, 1041: 2587, 1043: 2588, 2533, 1048: 2615, 2614, 1052: 2617, 2618, 2616, 1058: 2656, 2621, 1066: 2670, 2669, 2622, 1073: 2624, 1076: 2653, 1078: 2657, 1102: 2625, 2626, 1105: 2627, 1107: 2632, 1110: 2629, 2630, 1113: 2655, 2634, 2664, 2636, 2635, 1122: 2641, 1124: 2643, 2642, 2646, 1128: 2647, 1130: 2654, 1133: 2644, 2658, 1138: 2645, 1149: 2648, 2649, 2652, 1153: 2651, 1297: 2510, 1300: 2511}, + {2509}, + {2508, 6758}, + {16: 6710, 132: 6707, 164: 6708, 190: 6711, 257: 6709, 491: 4159, 569: 1846, 583: 6055, 849: 6706, 853: 4158}, + {164: 6691, 569: 6690}, // 5 - {569: 6683}, - {569: 6678}, - {378: 6659, 490: 6660, 569: 2360, 1295: 6658}, - {345: 6614, 569: 6613}, - {2328, 2328, 365: 6612, 372: 6611}, + {569: 6684}, + {569: 6679}, + {378: 6660, 490: 6661, 569: 2360, 1295: 6659}, + {345: 6615, 569: 6614}, + {2328, 2328, 365: 6613, 372: 6612}, // 10 - {402: 6600}, - {475: 6599}, - {2295, 2295, 70: 5884, 505: 5882, 798: 5883, 1005: 6598}, - {16: 2085, 81: 2085, 99: 2085, 132: 6375, 140: 2085, 156: 592, 158: 6312, 162: 5489, 164: 6376, 169: 6377, 190: 6379, 6017, 214: 6367, 509: 6374, 569: 2054, 583: 6054, 638: 6369, 648: 2180, 667: 2085, 675: 6371, 849: 6372, 936: 6378, 948: 5488, 1226: 6368, 1264: 6373, 1294: 6370}, - {16: 6319, 99: 6313, 122: 2054, 132: 6317, 156: 592, 158: 6312, 162: 5489, 164: 6314, 168: 1025, 6315, 190: 6320, 6017, 214: 6308, 285: 6316, 569: 2054, 583: 6054, 648: 6310, 849: 6309, 936: 6318, 948: 6311}, + {402: 6601}, + {475: 6600}, + {2295, 2295, 70: 5885, 505: 5883, 798: 5884, 1005: 6599}, + {16: 2085, 81: 2085, 99: 2085, 132: 6376, 140: 2085, 156: 592, 158: 6313, 162: 5490, 164: 6377, 169: 6378, 190: 6380, 6018, 214: 6368, 509: 6375, 569: 2054, 583: 6055, 638: 6370, 648: 2180, 667: 2085, 675: 6372, 849: 6373, 936: 6379, 948: 5489, 1226: 6369, 1264: 6374, 1294: 6371}, + {16: 6320, 99: 6314, 122: 2054, 132: 6318, 156: 592, 158: 6313, 162: 5490, 164: 6315, 168: 1025, 6316, 190: 6321, 6018, 214: 6309, 285: 6317, 569: 2054, 583: 6055, 648: 6311, 849: 6310, 936: 6319, 948: 6312}, // 15 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 6307}, - {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 491: 844, 499: 844, 752: 844, 844, 844, 761: 5296, 865: 5297, 916: 6295}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 6308}, + {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 491: 844, 499: 844, 752: 844, 844, 844, 761: 5297, 865: 5298, 916: 6296}, {2062, 2062}, {2061, 2061}, - {473: 2559, 501: 2557, 569: 2556, 645: 2552, 653: 2660, 708: 3856, 738: 2524, 747: 3855, 2553, 2554, 2555, 2564, 755: 2562, 3857, 3858, 765: 5082, 771: 5663, 778: 5083}, + {473: 2560, 501: 2558, 569: 2557, 645: 2553, 653: 2661, 708: 3857, 738: 2525, 747: 3856, 2554, 2555, 2556, 2565, 755: 2563, 3858, 3859, 765: 5083, 771: 5664, 778: 5084}, // 20 - {71: 2518, 145: 2520, 152: 2548, 2533, 155: 2517, 207: 6269, 251: 6268, 473: 2559, 2558, 501: 2557, 504: 6272, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 6270, 738: 2524, 747: 6271, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 6278, 6277, 765: 2525, 771: 2659, 773: 6275, 6276, 6274, 778: 2526, 782: 6273, 798: 2534, 808: 6286, 843: 6280, 847: 6281, 857: 6279, 859: 6283, 861: 6284, 6282, 6285, 918: 6267}, + {71: 2519, 145: 2521, 152: 2549, 2534, 155: 2518, 207: 6270, 251: 6269, 473: 2560, 2559, 501: 2558, 504: 6273, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 6271, 738: 2525, 747: 6272, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 6279, 6278, 765: 2526, 771: 2660, 773: 6276, 6277, 6275, 778: 2527, 782: 6274, 798: 2535, 808: 6287, 843: 6281, 847: 6282, 857: 6280, 859: 6284, 861: 6285, 6283, 6286, 918: 6268}, {2: 2030, 2030, 2030, 2030, 2030, 8: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 48: 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 2030, 473: 2030, 2030, 494: 2030, 501: 2030, 507: 2030, 567: 2030, 569: 2030, 645: 2030, 652: 2030, 2030, 660: 2030, 738: 2030}, {2: 2029, 2029, 2029, 2029, 2029, 8: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 48: 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 2029, 473: 2029, 2029, 494: 2029, 501: 2029, 507: 2029, 567: 2029, 569: 2029, 645: 2029, 652: 2029, 2029, 660: 2029, 738: 2029}, {2: 2028, 2028, 2028, 2028, 2028, 8: 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 48: 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 2028, 473: 2028, 2028, 494: 2028, 501: 2028, 507: 2028, 567: 2028, 569: 2028, 645: 2028, 652: 2028, 2028, 660: 2028, 738: 2028}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 6237, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 2559, 2558, 494: 6236, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 652: 6238, 2660, 660: 2677, 663: 3889, 2731, 2732, 2730, 708: 2678, 736: 6234, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 6235}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 6238, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 2560, 2559, 494: 6237, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 652: 6239, 2661, 660: 2678, 663: 3890, 2732, 2733, 2731, 708: 2679, 736: 6235, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 6236}, // 25 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6233, 2731, 2732, 2730}, - {153: 6231}, - {569: 6149, 583: 6054, 849: 6148, 993: 6227}, - {569: 6149, 583: 6054, 849: 6148, 993: 6147}, - {132: 6145}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6234, 2732, 2733, 2731}, + {153: 6232}, + {569: 6150, 583: 6055, 849: 6149, 993: 6228}, + {569: 6150, 583: 6055, 849: 6149, 993: 6148}, + {132: 6146}, // 30 - {132: 6140}, - {132: 6134}, - {14: 3804, 16: 5979, 28: 6008, 6007, 98: 585, 107: 585, 122: 585, 124: 592, 132: 5968, 139: 592, 158: 6016, 176: 5992, 185: 5977, 191: 6017, 195: 592, 204: 6018, 208: 6002, 585, 245: 5999, 270: 5998, 302: 5991, 308: 6013, 310: 5996, 313: 5978, 320: 5994, 6011, 323: 5985, 331: 5983, 333: 6001, 337: 5989, 340: 6000, 5972, 6010, 344: 6015, 346: 5981, 355: 5973, 364: 5987, 374: 5976, 5975, 381: 6014, 385: 6003, 388: 6009, 6006, 6005, 403: 5995, 506: 3805, 569: 5971, 594: 5990, 646: 3803, 648: 5980, 652: 6012, 673: 5970, 772: 5986, 912: 6004, 936: 5993, 941: 5982, 957: 5997, 1019: 5984, 1088: 5974, 1287: 5988, 1293: 5969}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5957, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5959, 2731, 2732, 2730, 1274: 5958}, - {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 491: 844, 495: 844, 752: 844, 844, 844, 761: 5296, 865: 5297, 916: 5944}, + {132: 6141}, + {132: 6135}, + {14: 3805, 16: 5980, 28: 6009, 6008, 98: 585, 107: 585, 122: 585, 124: 592, 132: 5969, 139: 592, 158: 6017, 176: 5993, 185: 5978, 191: 6018, 195: 592, 204: 6019, 208: 6003, 585, 245: 6000, 270: 5999, 302: 5992, 308: 6014, 310: 5997, 313: 5979, 320: 5995, 6012, 323: 5986, 331: 5984, 333: 6002, 337: 5990, 340: 6001, 5973, 6011, 344: 6016, 346: 5982, 355: 5974, 364: 5988, 374: 5977, 5976, 381: 6015, 385: 6004, 388: 6010, 6007, 6006, 403: 5996, 506: 3806, 569: 5972, 594: 5991, 646: 3804, 648: 5981, 652: 6013, 673: 5971, 772: 5987, 912: 6005, 936: 5994, 941: 5983, 957: 5998, 1019: 5985, 1088: 5975, 1287: 5989, 1293: 5970}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5958, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5960, 2732, 2733, 2731, 1274: 5959}, + {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 491: 844, 495: 844, 752: 844, 844, 844, 761: 5297, 865: 5298, 916: 5945}, // 35 - {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 495: 1048, 752: 5301, 5300, 5299, 836: 5302, 885: 5910}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5905, 2731, 2732, 2730}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5899, 2731, 2732, 2730}, - {168: 5897}, + {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 495: 1048, 752: 5302, 5301, 5300, 836: 5303, 885: 5911}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5906, 2732, 2733, 2731}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5900, 2732, 2733, 2731}, + {168: 5898}, {168: 1026}, // 40 - {1024, 1024, 70: 5884, 505: 5882, 649: 5881, 798: 5883, 1005: 5880}, + {1024, 1024, 70: 5885, 505: 5883, 649: 5882, 798: 5884, 1005: 5881}, {1013, 1013}, {1012, 1012}, - {475: 5879}, - {2: 849, 849, 849, 849, 849, 8: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 48: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 5849, 5855, 5856, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 473: 849, 475: 849, 849, 849, 479: 849, 483: 849, 849, 849, 849, 849, 492: 849, 501: 849, 506: 849, 849, 849, 515: 5852, 523: 849, 543: 849, 566: 849, 849, 849, 570: 849, 849, 849, 574: 849, 849, 849, 849, 849, 849, 849, 849, 583: 849, 849, 587: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 639: 849, 849, 849, 647: 849, 650: 3514, 744: 3512, 3513, 752: 5301, 5300, 5299, 761: 5296, 768: 5848, 5851, 5847, 783: 5770, 786: 5845, 836: 5846, 865: 5844, 1120: 5854, 5850, 1282: 5843, 5853}, + {475: 5880}, + {2: 849, 849, 849, 849, 849, 8: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 48: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 5850, 5856, 5857, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 473: 849, 475: 849, 849, 849, 479: 849, 483: 849, 849, 849, 849, 849, 492: 849, 501: 849, 506: 849, 849, 849, 515: 5853, 523: 849, 543: 849, 566: 849, 849, 849, 570: 849, 849, 849, 574: 849, 849, 849, 849, 849, 849, 849, 849, 583: 849, 849, 587: 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 849, 639: 849, 849, 849, 647: 849, 650: 3515, 744: 3513, 3514, 752: 5302, 5301, 5300, 761: 5297, 768: 5849, 5852, 5848, 783: 5771, 786: 5846, 836: 5847, 865: 5845, 1120: 5855, 5851, 1282: 5844, 5854}, // 45 - {245, 245, 47: 245, 472: 245, 474: 245, 480: 245, 245, 488: 245, 245, 493: 245, 245, 245, 245, 2691, 499: 5818, 245, 502: 245, 513: 245, 789: 2692, 5819, 1215: 5817}, - {839, 839, 47: 839, 472: 839, 474: 839, 480: 839, 839, 488: 839, 839, 493: 839, 839, 839, 839, 500: 839, 502: 839, 513: 5808, 937: 5810, 963: 5809}, - {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2694, 766: 2695, 810: 5804}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5799}, - {576: 3864, 910: 3863, 974: 3862}, + {245, 245, 47: 245, 472: 245, 474: 245, 480: 245, 245, 488: 245, 245, 493: 245, 245, 245, 245, 2692, 499: 5819, 245, 502: 245, 513: 245, 789: 2693, 5820, 1215: 5818}, + {839, 839, 47: 839, 472: 839, 474: 839, 480: 839, 839, 488: 839, 839, 493: 839, 839, 839, 839, 500: 839, 502: 839, 513: 5809, 937: 5811, 963: 5810}, + {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2695, 766: 2696, 810: 5805}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5800}, + {576: 3865, 910: 3864, 974: 3863}, // 50 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5786, 2731, 2732, 2730, 928: 5785, 1161: 5783, 1275: 5784}, - {473: 2559, 2558, 501: 2557, 569: 2556, 645: 2552, 708: 5782, 747: 3849, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 3851, 3850}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5787, 2732, 2733, 2731, 928: 5786, 1161: 5784, 1275: 5785}, + {473: 2560, 2559, 501: 2558, 569: 2557, 645: 2553, 708: 5783, 747: 3850, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 3852, 3851}, {820, 820, 47: 820, 472: 820, 474: 820, 481: 820}, {819, 819, 47: 819, 472: 819, 474: 819, 481: 819}, - {480: 5767, 488: 5768, 5769, 1285: 5766}, + {480: 5768, 488: 5769, 5770, 1285: 5767}, // 55 - {485, 485, 480: 805, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {485, 485, 480: 805, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, {480: 808, 488: 808, 808}, {487, 487, 480: 806, 488: 806, 806}, - {245: 5751, 270: 5750}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 5591, 5586, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 5589, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 5595, 2776, 5588, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 5592, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 5593, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 5587, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 5596, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 5594, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 5590, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 479: 5598, 506: 3805, 568: 5602, 590: 5601, 646: 3803, 663: 5599, 2731, 2732, 2730, 772: 5603, 829: 5600, 976: 5604, 1155: 5597}, + {245: 5752, 270: 5751}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 5592, 5587, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 5590, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 5596, 2777, 5589, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 5593, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 5594, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 5588, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 5597, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 5595, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 5591, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 479: 5599, 506: 3806, 568: 5603, 590: 5602, 646: 3804, 663: 5600, 2732, 2733, 2731, 772: 5604, 829: 5601, 976: 5605, 1155: 5598}, // 60 - {15: 5466, 203: 5471, 208: 5469, 210: 5464, 5470, 274: 5468, 314: 5467, 5472, 318: 5465, 334: 5473, 380: 5474, 582: 5463, 864: 5462}, - {20: 564, 122: 564, 124: 564, 136: 4708, 143: 564, 185: 564, 192: 564, 202: 564, 216: 564, 230: 564, 252: 564, 255: 564, 543: 564, 569: 564, 817: 4707, 835: 5435}, + {15: 5467, 203: 5472, 208: 5470, 210: 5465, 5471, 274: 5469, 314: 5468, 5473, 318: 5466, 334: 5474, 380: 5475, 582: 5464, 864: 5463}, + {20: 564, 122: 564, 124: 564, 136: 4709, 143: 564, 185: 564, 192: 564, 202: 564, 216: 564, 230: 564, 252: 564, 255: 564, 543: 564, 569: 564, 817: 4708, 835: 5436}, {555, 555}, {554, 554}, {553, 553}, @@ -6294,31 +6295,31 @@ var ( {467, 467}, {442, 442}, // 150 - {2: 388, 388, 388, 388, 388, 8: 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 48: 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 569: 5432, 1260: 5433}, + {2: 388, 388, 388, 388, 388, 8: 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 48: 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 569: 5433, 1260: 5434}, {251, 251, 481: 251}, - {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 473: 844, 491: 844, 579: 844, 752: 844, 844, 844, 761: 5296, 865: 5297, 916: 5298}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 5295}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5139, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 5141, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 5147, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 5143, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 5140, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 5148, 3173, 2901, 3126, 5142, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 5145, 5249, 2813, 3052, 5146, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 5144, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5150, 496: 5173, 567: 5167, 643: 5171, 645: 5156, 648: 5166, 650: 5160, 653: 5169, 660: 5161, 663: 3459, 2731, 2732, 2730, 668: 5165, 673: 5162, 737: 5149, 5164, 799: 5151, 808: 5155, 852: 5170, 864: 5168, 934: 5152, 955: 5153, 5159, 961: 5154, 5157, 970: 5163, 972: 5172, 1118: 5250}, + {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 473: 844, 491: 844, 579: 844, 752: 844, 844, 844, 761: 5297, 865: 5298, 916: 5299}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 5296}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5140, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 5142, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 5148, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 5144, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 5141, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 5149, 3174, 2902, 3127, 5143, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 5146, 5250, 2814, 3053, 5147, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 5145, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5151, 496: 5174, 567: 5168, 643: 5172, 645: 5157, 648: 5167, 650: 5161, 653: 5170, 660: 5162, 663: 3460, 2732, 2733, 2731, 668: 5166, 673: 5163, 737: 5150, 5165, 799: 5152, 808: 5156, 852: 5171, 864: 5169, 934: 5153, 955: 5154, 5160, 961: 5155, 5158, 970: 5164, 972: 5173, 1118: 5251}, // 155 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5139, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 5141, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 5147, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 5143, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 5140, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 5148, 3173, 2901, 3126, 5142, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 5145, 2812, 2813, 3052, 5146, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 5144, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5150, 496: 5173, 567: 5167, 643: 5171, 645: 5156, 648: 5166, 650: 5160, 653: 5169, 660: 5161, 663: 3459, 2731, 2732, 2730, 668: 5165, 673: 5162, 737: 5149, 5164, 799: 5151, 808: 5155, 852: 5170, 864: 5168, 934: 5152, 955: 5153, 5159, 961: 5154, 5157, 970: 5163, 972: 5172, 1118: 5158}, - {21: 5098, 285: 5099}, - {122: 5085, 569: 5086, 1146: 5097}, - {122: 5085, 569: 5086, 1146: 5084}, - {472: 5072, 493: 61, 1258: 5071}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5140, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 5142, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 5148, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 5144, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 5141, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 5149, 3174, 2902, 3127, 5143, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 5146, 2813, 2814, 3053, 5147, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 5145, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5151, 496: 5174, 567: 5168, 643: 5172, 645: 5157, 648: 5167, 650: 5161, 653: 5170, 660: 5162, 663: 3460, 2732, 2733, 2731, 668: 5166, 673: 5163, 737: 5150, 5165, 799: 5152, 808: 5156, 852: 5171, 864: 5169, 934: 5153, 955: 5154, 5160, 961: 5155, 5158, 970: 5164, 972: 5173, 1118: 5159}, + {21: 5099, 285: 5100}, + {122: 5086, 569: 5087, 1146: 5098}, + {122: 5086, 569: 5087, 1146: 5085}, + {472: 5073, 493: 61, 1258: 5072}, // 160 - {26: 5067, 137: 5068, 508: 2705, 732: 5066}, - {26: 56, 137: 56, 216: 5065, 508: 56}, - {304: 5048}, - {379: 2672}, - {329: 2673, 808: 2674}, + {26: 5068, 137: 5069, 508: 2706, 732: 5067}, + {26: 56, 137: 56, 216: 5066, 508: 56}, + {304: 5049}, + {379: 2673}, + {329: 2674, 808: 2675}, // 165 - {933: 2676}, - {475: 2675}, + {933: 2677}, + {475: 2676}, {1, 1}, - {192: 2689, 473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 652: 2688, 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 2687}, - {491: 4158, 569: 1846, 853: 4157}, + {192: 2690, 473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 652: 2689, 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 2688}, + {491: 4159, 569: 1846, 853: 4158}, // 170 - {444, 444, 480: 805, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {444, 444, 480: 805, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, {446, 446, 480: 806, 488: 806, 806}, {451, 451}, {450, 450}, @@ -6330,56 +6331,56 @@ var ( {443, 443}, {5, 5}, // 180 - {192: 4152, 473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 4151}, - {137: 2690}, - {245, 245, 493: 245, 497: 2691, 500: 245, 502: 245, 789: 2692, 2693}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4150}, + {192: 4153, 473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 4152}, + {137: 2691}, + {245, 245, 493: 245, 497: 2692, 500: 245, 502: 245, 789: 2693, 2694}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4151}, {244, 244, 47: 244, 472: 244, 474: 244, 480: 244, 244, 488: 244, 244, 493: 244, 244, 244, 244, 500: 244, 502: 244, 513: 244, 244, 516: 244}, // 185 - {1287, 1287, 493: 1287, 500: 1287, 502: 2694, 766: 2695, 810: 2696}, - {659: 2719}, + {1287, 1287, 493: 1287, 500: 1287, 502: 2695, 766: 2696, 810: 2697}, + {659: 2720}, {1286, 1286, 47: 1286, 125: 1286, 472: 1286, 474: 1286, 480: 1286, 1286, 488: 1286, 1286, 493: 1286, 1286, 1286, 1286, 500: 1286}, - {860, 860, 493: 2697, 500: 2698, 767: 2699, 828: 2700}, - {508: 2705, 578: 2707, 732: 2704, 743: 2706, 880: 2714}, + {860, 860, 493: 2698, 500: 2699, 767: 2700, 828: 2701}, + {508: 2706, 578: 2708, 732: 2705, 743: 2707, 880: 2715}, // 190 - {8: 2701, 265: 2702, 1210: 2703}, + {8: 2702, 265: 2703, 1210: 2704}, {859, 859, 47: 859, 472: 859, 474: 859, 480: 859, 859, 488: 859, 859, 494: 859, 859, 859}, {3, 3}, {508: 868, 524: 868, 576: 868, 578: 868}, {508: 867, 524: 867, 576: 867, 578: 867}, // 195 - {508: 2705, 524: 866, 576: 866, 578: 2707, 732: 2704, 743: 2706, 880: 2708, 1205: 2709}, + {508: 2706, 524: 866, 576: 866, 578: 2708, 732: 2705, 743: 2707, 880: 2709, 1205: 2710}, {1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 13: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 47: 1965, 1965, 50: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 81: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 100: 1965, 1965, 104: 1965, 1965, 108: 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 1965, 123: 1965, 166: 1965, 178: 1965, 205: 1965, 472: 1965, 1965, 1965, 478: 1965, 1965, 1965, 1965, 1965, 488: 1965, 1965, 1965, 1965, 494: 1965, 1965, 1965, 501: 1965, 503: 1965, 1965, 506: 1965, 1965, 524: 1965, 569: 1965, 576: 1965, 645: 1965, 1965, 648: 1965, 652: 1965}, {1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 13: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 50: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 100: 1963, 1963, 104: 1963, 1963, 108: 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 123: 1963, 126: 1963, 1963, 1963, 1963, 166: 1963, 178: 1963, 1963, 184: 1963, 205: 1963, 246: 1963, 472: 1963, 1963, 1963, 478: 1963, 1963, 1963, 1963, 1963, 488: 1963, 1963, 1963, 1963, 493: 1963, 1963, 1963, 1963, 1963, 500: 1963, 1963, 503: 1963, 1963, 506: 1963, 1963, 524: 1963, 569: 1963, 576: 1963, 645: 1963, 1963, 648: 1963, 652: 1963, 656: 1963, 1963, 738: 1963}, {872, 872, 7: 872, 47: 872, 166: 872, 472: 872, 474: 872, 480: 872, 872, 488: 872, 872, 494: 872, 872, 872, 524: 872, 576: 872}, {871, 871, 7: 871, 47: 871, 166: 871, 472: 871, 474: 871, 480: 871, 871, 488: 871, 871, 494: 871, 871, 871, 524: 871, 576: 871}, // 200 {524: 865, 576: 865}, - {524: 2711, 576: 2710, 1280: 2712}, + {524: 2712, 576: 2711, 1280: 2713}, {151: 870}, {151: 869}, - {151: 2713}, + {151: 2714}, // 205 {861, 861, 47: 861, 472: 861, 474: 861, 480: 861, 861, 488: 861, 861, 494: 861, 861, 861}, - {864, 864, 7: 2715, 47: 864, 166: 2716, 472: 864, 474: 864, 480: 864, 864, 488: 864, 864, 494: 864, 864, 864}, - {508: 2705, 578: 2707, 732: 2704, 743: 2706, 880: 2718}, - {508: 2705, 578: 2707, 732: 2704, 743: 2706, 880: 2717}, + {864, 864, 7: 2716, 47: 864, 166: 2717, 472: 864, 474: 864, 480: 864, 864, 488: 864, 864, 494: 864, 864, 864}, + {508: 2706, 578: 2708, 732: 2705, 743: 2707, 880: 2719}, + {508: 2706, 578: 2708, 732: 2705, 743: 2707, 880: 2718}, {862, 862, 47: 862, 472: 862, 474: 862, 480: 862, 862, 488: 862, 862, 494: 862, 862, 862}, // 210 {863, 863, 47: 863, 472: 863, 474: 863, 480: 863, 863, 488: 863, 863, 494: 863, 863, 863}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 2723, 869: 3210, 898: 3209}, - {1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 4147, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 474: 1525, 1525, 1525, 1525, 1525, 480: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 491: 1525, 493: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 502: 1525, 1525, 1525, 1525, 509: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 544: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 585: 1525, 651: 1525, 654: 1525, 1525}, - {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 4144, 1524, 1524, 1524, 1524, 1524, 480: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 491: 1524, 493: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 502: 1524, 1524, 1524, 1524, 509: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 544: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 585: 1524, 651: 1524, 654: 1524, 1524}, - {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 474: 739, 739, 739, 739, 739, 480: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 491: 739, 493: 739, 739, 739, 739, 739, 739, 739, 739, 502: 739, 739, 739, 739, 509: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 544: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 585: 739, 658: 4142}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 2724, 869: 3211, 898: 3210}, + {1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 4148, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 474: 1525, 1525, 1525, 1525, 1525, 480: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 491: 1525, 493: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 502: 1525, 1525, 1525, 1525, 509: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 544: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 585: 1525, 651: 1525, 654: 1525, 1525}, + {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 4145, 1524, 1524, 1524, 1524, 1524, 480: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 491: 1524, 493: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 502: 1524, 1524, 1524, 1524, 509: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 544: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 585: 1524, 651: 1524, 654: 1524, 1524}, + {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 474: 739, 739, 739, 739, 739, 480: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 491: 739, 493: 739, 739, 739, 739, 739, 739, 739, 739, 502: 739, 739, 739, 739, 509: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 544: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 585: 739, 658: 4143}, // 215 - {1294, 1294, 7: 1294, 47: 1294, 125: 1294, 472: 1294, 474: 1294, 480: 1294, 1294, 488: 1294, 1294, 493: 1294, 1294, 1294, 1294, 500: 1294, 502: 1294, 505: 3313, 509: 3311, 3312, 3310, 3308, 514: 1294, 516: 1294, 524: 1294, 527: 1294, 1294, 4141, 4140, 733: 3309, 3307, 1263: 4139}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4138}, - {473: 4110}, - {1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 474: 1925, 1925, 478: 1925, 480: 1925, 1925, 483: 1925, 1925, 488: 1925, 1925, 491: 1925, 493: 1925, 1925, 1925, 1925, 1925, 4093, 1925, 1925, 502: 1925, 1925, 1925, 1925, 509: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 519: 1925, 1925, 1925, 1925, 524: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 545: 1925, 1925, 4090, 4088, 4087, 4095, 4089, 4091, 4092, 4094, 1190: 4086, 1233: 4085}, + {1294, 1294, 7: 1294, 47: 1294, 125: 1294, 472: 1294, 474: 1294, 480: 1294, 1294, 488: 1294, 1294, 493: 1294, 1294, 1294, 1294, 500: 1294, 502: 1294, 505: 3314, 509: 3312, 3313, 3311, 3309, 514: 1294, 516: 1294, 524: 1294, 527: 1294, 1294, 4142, 4141, 733: 3310, 3308, 1263: 4140}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4139}, + {473: 4111}, + {1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 474: 1925, 1925, 478: 1925, 480: 1925, 1925, 483: 1925, 1925, 488: 1925, 1925, 491: 1925, 493: 1925, 1925, 1925, 1925, 1925, 4094, 1925, 1925, 502: 1925, 1925, 1925, 1925, 509: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 519: 1925, 1925, 1925, 1925, 524: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 545: 1925, 1925, 4091, 4089, 4088, 4096, 4090, 4092, 4093, 4095, 1190: 4087, 1233: 4086}, {1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 474: 1900, 1900, 478: 1900, 480: 1900, 1900, 483: 1900, 1900, 488: 1900, 1900, 491: 1900, 493: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 502: 1900, 1900, 1900, 1900, 509: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 519: 1900, 1900, 1900, 1900, 524: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 545: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900}, // 220 - {1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 474: 1873, 1873, 4057, 4056, 1873, 480: 1873, 1873, 483: 1873, 1873, 3654, 3655, 3660, 1873, 1873, 491: 1873, 493: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 502: 1873, 1873, 1873, 1873, 509: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 4061, 1873, 1873, 1873, 1873, 3656, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 544: 4060, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 4058, 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653, 4067, 4068, 809: 4059, 1109: 4062, 1175: 4064, 1229: 4063, 1236: 4065, 1276: 4066}, - {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 4053, 1822, 1822, 1822, 1822, 1822, 480: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 491: 1822, 493: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 502: 1822, 1822, 1822, 1822, 509: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 544: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 585: 1822, 651: 1822, 654: 1822, 1822}, + {1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 474: 1873, 1873, 4058, 4057, 1873, 480: 1873, 1873, 483: 1873, 1873, 3655, 3656, 3661, 1873, 1873, 491: 1873, 493: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 502: 1873, 1873, 1873, 1873, 509: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 4062, 1873, 1873, 1873, 1873, 3657, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 544: 4061, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 4059, 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654, 4068, 4069, 809: 4060, 1109: 4063, 1175: 4065, 1229: 4064, 1236: 4066, 1276: 4067}, + {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 4054, 1822, 1822, 1822, 1822, 1822, 480: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 491: 1822, 493: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 502: 1822, 1822, 1822, 1822, 509: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 544: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 585: 1822, 651: 1822, 654: 1822, 1822}, {1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 667: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 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, 667: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 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, 667: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819}, @@ -6399,7 +6400,7 @@ var ( {1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 667: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 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, 667: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807}, {1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 667: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 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, 4048, 1805, 1805, 1805, 1805, 1805, 480: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 491: 1805, 493: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 502: 1805, 1805, 1805, 1805, 509: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 544: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 585: 1805, 651: 1805, 654: 1805, 1805}, + {1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 4049, 1805, 1805, 1805, 1805, 1805, 480: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 491: 1805, 493: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 502: 1805, 1805, 1805, 1805, 509: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 544: 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 585: 1805, 651: 1805, 654: 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, 667: 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804}, // 240 {1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 667: 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803}, @@ -6426,7 +6427,7 @@ var ( {1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 667: 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785}, {1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 667: 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784, 1784}, // 260 - {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1221, 1783, 4047, 1783, 1783, 1783, 480: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 491: 1783, 493: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 502: 1783, 1783, 1783, 1783, 509: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 544: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 585: 1783, 651: 1783, 654: 1783, 1783}, + {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1221, 1783, 4048, 1783, 1783, 1783, 480: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 491: 1783, 493: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 502: 1783, 1783, 1783, 1783, 509: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 544: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 585: 1783, 651: 1783, 654: 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, 667: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782}, {1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1219, 1781, 1781, 1781, 1781, 1781, 480: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 491: 1781, 493: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 502: 1781, 1781, 1781, 1781, 509: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 544: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 585: 1781, 651: 1781, 654: 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, 667: 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780}, @@ -6475,7 +6476,7 @@ var ( {1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 667: 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744}, // 300 {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 667: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 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, 4044, 1742, 1742, 1742, 1742, 1742, 480: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 491: 1742, 493: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 502: 1742, 1742, 1742, 1742, 509: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 544: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 585: 1742, 651: 1742, 654: 1742, 1742}, + {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 4045, 1742, 1742, 1742, 1742, 1742, 480: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 491: 1742, 493: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 502: 1742, 1742, 1742, 1742, 509: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 544: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 585: 1742, 651: 1742, 654: 1742, 1742}, {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 667: 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 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, 667: 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740}, {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 667: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739}, @@ -6505,8 +6506,8 @@ var ( {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 667: 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719}, // 325 {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 667: 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 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, 1202, 1717, 4043, 1717, 1717, 1717, 480: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 491: 1717, 493: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 502: 1717, 1717, 1717, 1717, 509: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 544: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 585: 1717, 651: 1717, 654: 1717, 1717}, - {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1201, 1716, 4042, 1716, 1716, 1716, 480: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 491: 1716, 493: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 502: 1716, 1716, 1716, 1716, 509: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 544: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 585: 1716, 651: 1716, 654: 1716, 1716}, + {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1202, 1717, 4044, 1717, 1717, 1717, 480: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 491: 1717, 493: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 502: 1717, 1717, 1717, 1717, 509: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 544: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 585: 1717, 651: 1717, 654: 1717, 1717}, + {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1201, 1716, 4043, 1716, 1716, 1716, 480: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 491: 1716, 493: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 502: 1716, 1716, 1716, 1716, 509: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 544: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 585: 1716, 651: 1716, 654: 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, 667: 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715}, {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 667: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714}, // 330 @@ -6519,7 +6520,7 @@ var ( {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1197, 1708, 1708, 1708, 1708, 1708, 480: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 491: 1708, 493: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 502: 1708, 1708, 1708, 1708, 509: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 544: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 585: 1708, 651: 1708, 654: 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, 667: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707}, {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1198, 1706, 1706, 1706, 1706, 1706, 480: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 491: 1706, 493: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 502: 1706, 1706, 1706, 1706, 509: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 544: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 585: 1706, 651: 1706, 654: 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, 4032, 1705, 1705, 1705, 1705, 1705, 480: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 491: 1705, 493: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 502: 1705, 1705, 1705, 1705, 509: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 544: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 585: 1705, 651: 1705, 654: 1705, 1705}, + {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 4033, 1705, 1705, 1705, 1705, 1705, 480: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 491: 1705, 493: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 502: 1705, 1705, 1705, 1705, 509: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 544: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 585: 1705, 651: 1705, 654: 1705, 1705}, {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 667: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704}, // 340 {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 667: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703}, @@ -6735,8 +6736,8 @@ var ( {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 667: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528}, {1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 667: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527}, {1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 667: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526}, - {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 4029, 1523, 1523, 1523, 1523, 1523, 480: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 491: 1523, 493: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 502: 1523, 1523, 1523, 1523, 509: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 544: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 585: 1523, 651: 1523, 654: 1523, 1523}, - {1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 4018, 1522, 1522, 1522, 1522, 1522, 480: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 491: 1522, 493: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 502: 1522, 1522, 1522, 1522, 509: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 544: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 585: 1522, 651: 1522, 654: 1522, 1522}, + {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 4030, 1523, 1523, 1523, 1523, 1523, 480: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 491: 1523, 493: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 502: 1523, 1523, 1523, 1523, 509: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 544: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 585: 1523, 651: 1523, 654: 1523, 1523}, + {1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 4019, 1522, 1522, 1522, 1522, 1522, 480: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 491: 1522, 493: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 502: 1522, 1522, 1522, 1522, 509: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 544: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 585: 1522, 651: 1522, 654: 1522, 1522}, // 520 {1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 667: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521}, {1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 667: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520}, @@ -6856,7 +6857,7 @@ var ( {1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 667: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425}, {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 667: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424}, {1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 667: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423}, - {1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 4009, 1422, 1422, 1422, 1422, 1422, 480: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 491: 1422, 493: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 502: 1422, 1422, 1422, 1422, 509: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 544: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 585: 1422, 651: 1422, 654: 1422, 1422}, + {1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 4010, 1422, 1422, 1422, 1422, 1422, 480: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 491: 1422, 493: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 502: 1422, 1422, 1422, 1422, 509: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 544: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 585: 1422, 651: 1422, 654: 1422, 1422}, // 620 {1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 667: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421}, {1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 667: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420}, @@ -6892,9 +6893,9 @@ var ( {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 667: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395}, {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 667: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394}, {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 667: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, - {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 4002, 1392, 1392, 1392, 1392, 1392, 480: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 491: 1392, 493: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 502: 1392, 1392, 1392, 1392, 509: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 544: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 585: 1392, 651: 1392, 654: 1392, 1392}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 4003, 1392, 1392, 1392, 1392, 1392, 480: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 491: 1392, 493: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 502: 1392, 1392, 1392, 1392, 509: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 544: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 585: 1392, 651: 1392, 654: 1392, 1392}, // 650 - {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 3995, 1391, 1391, 1391, 1391, 1391, 480: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 491: 1391, 493: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 502: 1391, 1391, 1391, 1391, 509: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 544: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 585: 1391, 651: 1391, 654: 1391, 1391}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 3996, 1391, 1391, 1391, 1391, 1391, 480: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 491: 1391, 493: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 502: 1391, 1391, 1391, 1391, 509: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 544: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 585: 1391, 651: 1391, 654: 1391, 1391}, {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 667: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390}, {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 667: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389}, {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 667: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388}, @@ -6916,9 +6917,9 @@ var ( {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 667: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375}, {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 667: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374}, {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 667: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373}, - {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 3975, 1372, 1372, 1372, 1372, 1372, 480: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 491: 1372, 493: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 502: 1372, 1372, 1372, 1372, 509: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 544: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 585: 1372, 651: 1372, 654: 1372, 1372}, + {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 3976, 1372, 1372, 1372, 1372, 1372, 480: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 491: 1372, 493: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 502: 1372, 1372, 1372, 1372, 509: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 544: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 585: 1372, 651: 1372, 654: 1372, 1372}, // 670 - {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 3967, 1371, 1371, 1371, 1371, 1371, 480: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 491: 1371, 493: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 502: 1371, 1371, 1371, 1371, 509: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 544: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 585: 1371, 651: 1371, 654: 1371, 1371}, + {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 3968, 1371, 1371, 1371, 1371, 1371, 480: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 491: 1371, 493: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 502: 1371, 1371, 1371, 1371, 509: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 544: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 585: 1371, 651: 1371, 654: 1371, 1371}, {1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 667: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370}, {1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 667: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369}, {1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 667: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368}, @@ -6949,19 +6950,19 @@ var ( {1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 474: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 502: 1310, 1310, 1310, 1310, 509: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 544: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 573: 1310, 582: 1310, 585: 1310, 1310, 638: 1310, 642: 1310, 1310, 1310}, // 695 {1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 474: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 502: 1309, 1309, 1309, 1309, 509: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 544: 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 573: 1309, 582: 1309, 585: 1309, 1309, 638: 1309, 642: 1309, 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, 474: 1308, 3966, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 502: 1308, 1308, 1308, 1308, 509: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 544: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 573: 1308, 582: 1308, 585: 1308, 1308, 638: 1308, 642: 1308, 1308, 1308}, - {475: 3963, 577: 3964, 580: 3965}, + {1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 474: 1308, 3967, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 502: 1308, 1308, 1308, 1308, 509: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 544: 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 573: 1308, 582: 1308, 585: 1308, 1308, 638: 1308, 642: 1308, 1308, 1308}, + {475: 3964, 577: 3965, 580: 3966}, {1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 474: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 502: 1306, 1306, 1306, 1306, 509: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 544: 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 573: 1306, 582: 1306, 585: 1306, 1306, 638: 1306, 642: 1306, 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, 474: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 502: 1305, 1305, 1305, 1305, 509: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 544: 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 1305, 573: 1305, 582: 1305, 585: 1305, 1305, 638: 1305, 642: 1305, 1305, 1305}, // 700 {1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 474: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 502: 1302, 1302, 1302, 1302, 509: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 544: 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 1302, 573: 1302, 582: 1302, 585: 1302, 1302, 638: 1302, 642: 1302, 1302, 1302}, - {1297, 1297, 7: 3380, 47: 1297, 125: 1297, 472: 1297, 474: 1297, 480: 1297, 1297, 488: 1297, 1297, 493: 1297, 1297, 1297, 1297, 500: 1297}, + {1297, 1297, 7: 3381, 47: 1297, 125: 1297, 472: 1297, 474: 1297, 480: 1297, 1297, 488: 1297, 1297, 493: 1297, 1297, 1297, 1297, 500: 1297}, {1296, 1296, 7: 1296, 47: 1296, 125: 1296, 472: 1296, 474: 1296, 480: 1296, 1296, 488: 1296, 1296, 493: 1296, 1296, 1296, 1296, 500: 1296, 502: 1296, 514: 1296, 516: 1296, 524: 1296, 527: 1296, 1296}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 1216, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3961}, - {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 474: 1270, 1270, 1270, 1270, 1270, 480: 1270, 1270, 3318, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 491: 1270, 493: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 502: 1270, 1270, 1270, 1270, 509: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 544: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 585: 3319}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 1216, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3962}, + {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 474: 1270, 1270, 1270, 1270, 1270, 480: 1270, 1270, 3319, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 491: 1270, 493: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 502: 1270, 1270, 1270, 1270, 509: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 544: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 585: 3320}, // 705 - {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 474: 1269, 1269, 1269, 1269, 1269, 480: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 491: 1269, 493: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 502: 1269, 1269, 1269, 1269, 509: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 544: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 585: 1269, 651: 3956, 654: 1269, 1269}, - {1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 474: 1266, 1266, 1266, 1266, 1266, 480: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 491: 1266, 493: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 502: 1266, 1266, 1266, 1266, 509: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 544: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 585: 1266, 654: 3952, 3953}, + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 474: 1269, 1269, 1269, 1269, 1269, 480: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 491: 1269, 493: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 502: 1269, 1269, 1269, 1269, 509: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 544: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 585: 1269, 651: 3957, 654: 1269, 1269}, + {1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 474: 1266, 1266, 1266, 1266, 1266, 480: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 491: 1266, 493: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 502: 1266, 1266, 1266, 1266, 509: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 544: 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 1266, 585: 1266, 654: 3953, 3954}, {1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 474: 1265, 1265, 1265, 1265, 1265, 480: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 491: 1265, 493: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 502: 1265, 1265, 1265, 1265, 509: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 544: 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 1265, 585: 1265}, {1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 474: 1264, 1264, 1264, 1264, 1264, 480: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 491: 1264, 493: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 502: 1264, 1264, 1264, 1264, 509: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 544: 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 585: 1264}, {1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 474: 1263, 1263, 1263, 1263, 1263, 480: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 491: 1263, 493: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 502: 1263, 1263, 1263, 1263, 509: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 544: 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 585: 1263}, @@ -6972,25 +6973,25 @@ var ( {1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 474: 1258, 1258, 1258, 1258, 1258, 480: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 491: 1258, 493: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 502: 1258, 1258, 1258, 1258, 509: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 544: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 585: 1258}, {1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 474: 1257, 1257, 1257, 1257, 1257, 480: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 491: 1257, 493: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 502: 1257, 1257, 1257, 1257, 509: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 544: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 585: 1257}, // 715 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3951, 3222, 3302, 3221, 3218}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3950, 3222, 3302, 3221, 3218}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3949, 3222, 3302, 3221, 3218}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3948, 3222, 3302, 3221, 3218}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3947, 3222, 3302, 3221, 3218}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3952, 3223, 3303, 3222, 3219}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3951, 3223, 3303, 3222, 3219}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3950, 3223, 3303, 3222, 3219}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3949, 3223, 3303, 3222, 3219}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3948, 3223, 3303, 3222, 3219}, // 720 {1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 474: 1250, 1250, 1250, 1250, 1250, 480: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 491: 1250, 493: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 502: 1250, 1250, 1250, 1250, 509: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 544: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 585: 1250}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 2558, 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3847, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 2556, 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 645: 2552, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3846, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3844, 747: 3849, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 3851, 3850, 777: 3845}, - {473: 3839}, - {473: 2559, 708: 3838}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3835, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 2559, 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3848, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 2557, 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 645: 2553, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3847, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3845, 747: 3850, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 3852, 3851, 777: 3846}, + {473: 3840}, + {473: 2560, 708: 3839}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3836, 2732, 2733, 2731}, // 725 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3834, 3222, 3302, 3221, 3218}, - {473: 3829}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 542: 1071, 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3816, 1204: 3817}, - {473: 3758}, - {473: 3755}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3835, 3223, 3303, 3222, 3219}, + {473: 3830}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 542: 1071, 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3817, 1204: 3818}, + {473: 3759}, + {473: 3756}, // 730 - {473: 3747}, + {473: 3748}, {473: 1220}, {473: 1217}, {473: 1214}, @@ -7011,96 +7012,96 @@ var ( {1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 480: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 491: 1187, 493: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 502: 1187, 1187, 1187, 1187, 509: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 544: 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 585: 1187}, {1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 480: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 491: 1186, 493: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 502: 1186, 1186, 1186, 1186, 509: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 544: 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 1186, 585: 1186}, {1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 480: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 491: 1185, 493: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 502: 1185, 1185, 1185, 1185, 509: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 544: 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 585: 1185}, - {473: 3744}, - {473: 3741}, + {473: 3745}, + {473: 3742}, // 750 - {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 3738, 1196, 1196, 1196, 1196, 1196, 480: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 491: 1196, 493: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 502: 1196, 1196, 1196, 1196, 509: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 544: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 585: 1196, 1090: 3739}, - {473: 3736}, - {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 3732, 1103, 1103, 1103, 1103, 1103, 480: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 491: 1103, 493: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 502: 1103, 1103, 1103, 1103, 509: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 544: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 585: 1103, 1217: 3731}, - {473: 3723}, - {473: 3719}, + {1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 3739, 1196, 1196, 1196, 1196, 1196, 480: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 491: 1196, 493: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 502: 1196, 1196, 1196, 1196, 509: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 544: 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196, 585: 1196, 1090: 3740}, + {473: 3737}, + {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 3733, 1103, 1103, 1103, 1103, 1103, 480: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 491: 1103, 493: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 502: 1103, 1103, 1103, 1103, 509: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 544: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 585: 1103, 1217: 3732}, + {473: 3724}, + {473: 3720}, // 755 - {473: 3714}, - {473: 3711}, - {473: 3706}, - {473: 3697}, - {473: 3690}, + {473: 3715}, + {473: 3712}, + {473: 3707}, + {473: 3698}, + {473: 3691}, // 760 - {473: 3685}, - {473: 3648}, - {473: 3634}, - {473: 3617}, + {473: 3686}, + {473: 3649}, + {473: 3635}, + {473: 3618}, {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 474: 1150, 1150, 1150, 1150, 1150, 480: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 491: 1150, 493: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 502: 1150, 1150, 1150, 1150, 509: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 544: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 585: 1150}, // 765 - {473: 3610}, + {473: 3611}, {473: 1144}, {473: 1143}, {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 474: 1135, 1135, 1135, 1135, 1135, 480: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 491: 1135, 493: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 502: 1135, 1135, 1135, 1135, 509: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 544: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 585: 1135}, - {473: 3607}, + {473: 3608}, // 770 - {473: 3604}, - {473: 3596}, - {473: 3588}, - {473: 3580}, - {473: 3566}, + {473: 3605}, + {473: 3597}, + {473: 3589}, + {473: 3581}, + {473: 3567}, // 775 - {473: 3554}, - {473: 3549}, - {473: 3544}, - {473: 3539}, - {473: 3534}, + {473: 3555}, + {473: 3550}, + {473: 3545}, + {473: 3540}, + {473: 3535}, // 780 - {473: 3529}, - {473: 3524}, - {473: 3511}, - {473: 3508}, - {473: 3505}, + {473: 3530}, + {473: 3525}, + {473: 3512}, + {473: 3509}, + {473: 3506}, // 785 - {473: 3502}, - {473: 3499}, - {473: 3496}, - {473: 3492}, - {473: 3486}, + {473: 3503}, + {473: 3500}, + {473: 3497}, + {473: 3493}, + {473: 3487}, // 790 - {473: 3473}, - {473: 3468}, - {473: 3463}, - {473: 3305}, + {473: 3474}, + {473: 3469}, + {473: 3464}, + {473: 3306}, {742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 474: 742, 742, 742, 742, 742, 480: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 491: 742, 493: 742, 742, 742, 742, 742, 742, 742, 742, 502: 742, 742, 742, 742, 509: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 544: 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 585: 742}, // 795 {741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 474: 741, 741, 741, 741, 741, 480: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 491: 741, 493: 741, 741, 741, 741, 741, 741, 741, 741, 502: 741, 741, 741, 741, 509: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 544: 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 585: 741}, {740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 474: 740, 740, 740, 740, 740, 480: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 491: 740, 493: 740, 740, 740, 740, 740, 740, 740, 740, 502: 740, 740, 740, 740, 509: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 544: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 585: 740}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3306}, - {7: 3314, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3462}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3307}, + {7: 3315, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3463}, // 800 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3461}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3460}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3462}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3461}, {2: 1917, 1917, 1917, 1917, 1917, 8: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 48: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 473: 1917, 475: 1917, 1917, 1917, 479: 1917, 483: 1917, 1917, 1917, 1917, 1917, 492: 1917, 501: 1917, 506: 1917, 1917, 1917, 543: 1917, 566: 1917, 1917, 1917, 570: 1917, 1917, 1917, 574: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 583: 1917, 1917, 587: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 639: 1917, 1917, 1917, 647: 1917}, {2: 1916, 1916, 1916, 1916, 1916, 8: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 48: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 473: 1916, 475: 1916, 1916, 1916, 479: 1916, 483: 1916, 1916, 1916, 1916, 1916, 492: 1916, 501: 1916, 506: 1916, 1916, 1916, 543: 1916, 566: 1916, 1916, 1916, 570: 1916, 1916, 1916, 574: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 583: 1916, 1916, 587: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 639: 1916, 1916, 1916, 647: 1916}, {2: 1915, 1915, 1915, 1915, 1915, 8: 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 48: 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 473: 1915, 475: 1915, 1915, 1915, 479: 1915, 483: 1915, 1915, 1915, 1915, 1915, 492: 1915, 501: 1915, 506: 1915, 1915, 1915, 543: 1915, 566: 1915, 1915, 1915, 570: 1915, 1915, 1915, 574: 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 583: 1915, 1915, 587: 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 639: 1915, 1915, 1915, 647: 1915}, // 805 {2: 1914, 1914, 1914, 1914, 1914, 8: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 48: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 473: 1914, 475: 1914, 1914, 1914, 479: 1914, 483: 1914, 1914, 1914, 1914, 1914, 492: 1914, 501: 1914, 506: 1914, 1914, 1914, 543: 1914, 566: 1914, 1914, 1914, 570: 1914, 1914, 1914, 574: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 583: 1914, 1914, 587: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 639: 1914, 1914, 1914, 647: 1914}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3315, 3222, 3302, 3221, 3218}, - {47: 3320, 482: 3318, 585: 3319}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3316, 3223, 3303, 3222, 3219}, + {47: 3321, 482: 3319, 585: 3320}, {473: 1216}, {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 474: 739, 739, 739, 739, 739, 480: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 491: 739, 493: 739, 739, 739, 739, 739, 739, 739, 739, 502: 739, 739, 739, 739, 509: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 544: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 585: 739}, // 810 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3457, 663: 3459, 2731, 2732, 2730, 737: 3456, 870: 3455}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3454, 3222, 3302, 3221, 3218}, - {144: 926, 491: 926, 499: 3322, 740: 926, 1256: 3321}, - {144: 3326, 491: 3327, 740: 929, 883: 3325}, - {8: 3323, 351: 3324}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3458, 663: 3460, 2732, 2733, 2731, 737: 3457, 870: 3456}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3455, 3223, 3303, 3222, 3219}, + {144: 926, 491: 926, 499: 3323, 740: 926, 1256: 3322}, + {144: 3327, 491: 3328, 740: 929, 883: 3326}, + {8: 3324, 351: 3325}, // 815 {144: 925, 491: 925, 740: 925}, {144: 924, 491: 924, 740: 924}, - {740: 3330, 746: 3331}, + {740: 3331, 746: 3332}, + {268: 3330}, {268: 3329}, - {268: 3328}, // 820 {740: 927}, {740: 928}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 3369, 663: 3368, 2731, 2732, 2730, 921: 3371, 1159: 3372, 1341: 3370}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 3370, 663: 3369, 2732, 2733, 2731, 921: 3372, 1159: 3373, 1341: 3371}, {935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 474: 935, 935, 935, 935, 935, 480: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 491: 935, 493: 935, 935, 935, 935, 935, 935, 935, 935, 502: 935, 935, 935, 935, 509: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 544: 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, 585: 935}, {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 667: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822}, // 825 @@ -7147,28 +7148,28 @@ var ( {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 667: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371}, // 860 {977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 474: 977, 977, 977, 977, 977, 480: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 493: 977, 977, 977, 977, 977, 977, 977, 977, 502: 977, 977, 977, 977, 509: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 544: 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 585: 977}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 974, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 490: 974, 502: 974, 524: 974, 527: 974, 974, 663: 3368, 2731, 2732, 2730, 921: 3375, 1255: 3374, 1342: 3373}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 974, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 490: 974, 502: 974, 524: 974, 527: 974, 974, 663: 3369, 2732, 2733, 2731, 921: 3376, 1255: 3375, 1342: 3374}, {948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 474: 948, 948, 948, 948, 948, 480: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 491: 948, 493: 948, 948, 948, 948, 948, 948, 948, 948, 502: 948, 948, 948, 948, 509: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 544: 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, 585: 948}, {947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 474: 947, 947, 947, 947, 947, 480: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 491: 947, 493: 947, 947, 947, 947, 947, 947, 947, 947, 502: 947, 947, 947, 947, 509: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 544: 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 947, 585: 947}, {946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 474: 946, 946, 946, 946, 946, 480: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 491: 946, 493: 946, 946, 946, 946, 946, 946, 946, 946, 502: 946, 946, 946, 946, 509: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 544: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 585: 946}, // 865 - {47: 3453}, - {47: 972, 490: 3377, 502: 972, 524: 972, 527: 972, 972, 1259: 3376}, + {47: 3454}, + {47: 972, 490: 3378, 502: 972, 524: 972, 527: 972, 972, 1259: 3377}, {47: 973, 490: 973, 502: 973, 524: 973, 527: 973, 973}, - {47: 970, 502: 3383, 524: 970, 527: 970, 970, 1262: 3382}, - {659: 3378}, + {47: 970, 502: 3384, 524: 970, 527: 970, 970, 1262: 3383}, + {659: 3379}, // 870 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 2723, 869: 3210, 898: 3379}, - {7: 3380, 47: 971, 502: 971, 524: 971, 527: 971, 971}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 2723, 869: 3381}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 2724, 869: 3211, 898: 3380}, + {7: 3381, 47: 971, 502: 971, 524: 971, 527: 971, 971}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 2724, 869: 3382}, {1295, 1295, 7: 1295, 47: 1295, 125: 1295, 472: 1295, 474: 1295, 480: 1295, 1295, 488: 1295, 1295, 493: 1295, 1295, 1295, 1295, 500: 1295, 502: 1295, 514: 1295, 516: 1295, 524: 1295, 527: 1295, 1295}, - {47: 968, 524: 3388, 527: 3389, 3390, 1261: 3386, 1340: 3387}, + {47: 968, 524: 3389, 527: 3390, 3391, 1261: 3387, 1340: 3388}, // 875 - {659: 3384}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 2723, 869: 3210, 898: 3385}, - {7: 3380, 47: 969, 524: 969, 527: 969, 969}, + {659: 3385}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 2724, 869: 3211, 898: 3386}, + {7: 3381, 47: 969, 524: 969, 527: 969, 969}, {47: 975}, - {146: 3401, 163: 3397, 508: 3391, 555: 3402, 574: 3393, 3392, 578: 3399, 581: 3400, 818: 3398, 977: 3395, 1338: 3396, 3394}, + {146: 3402, 163: 3398, 508: 3392, 555: 3403, 574: 3394, 3393, 578: 3400, 581: 3401, 818: 3399, 977: 3396, 1338: 3397, 3395}, // 880 {146: 966, 163: 966, 508: 966, 555: 966, 574: 966, 966, 578: 966, 581: 966}, {146: 965, 163: 965, 508: 965, 555: 965, 574: 965, 965, 578: 965, 581: 965}, @@ -7180,24 +7181,24 @@ var ( {47: 967}, {47: 963}, {47: 962}, - {130: 3448}, + {130: 3449}, // 890 - {130: 3446}, - {130: 3444}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3451}, - {576: 3450}, - {146: 3401, 163: 3403, 508: 3391, 574: 3393, 3392, 578: 3405, 581: 3406, 818: 3404, 977: 3408, 1158: 3407}, + {130: 3447}, + {130: 3445}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3452}, + {576: 3451}, + {146: 3402, 163: 3404, 508: 3392, 574: 3394, 3393, 578: 3406, 581: 3407, 818: 3405, 977: 3409, 1158: 3408}, // 895 - {130: 3448, 148: 3449}, - {130: 3446, 148: 3447}, - {130: 3444, 148: 3445}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3411}, - {505: 3409}, + {130: 3449, 148: 3450}, + {130: 3447, 148: 3448}, + {130: 3445, 148: 3446}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3412}, + {505: 3410}, // 900 {47: 955, 505: 955}, - {146: 3401, 163: 3403, 508: 3391, 574: 3393, 3392, 578: 3405, 581: 3406, 818: 3404, 977: 3408, 1158: 3410}, + {146: 3402, 163: 3404, 508: 3392, 574: 3394, 3393, 578: 3406, 581: 3407, 818: 3405, 977: 3409, 1158: 3411}, {47: 956}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3441}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3442}, {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 480: 1100, 1100, 483: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 491: 1100, 493: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 507: 1100, 509: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 544: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 569: 1100, 645: 1100}, // 905 {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 480: 1099, 1099, 483: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 491: 1099, 493: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 507: 1099, 509: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 544: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 569: 1099, 645: 1099}, @@ -7233,7 +7234,7 @@ var ( {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 480: 1074, 1074, 483: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 491: 1074, 493: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 507: 1074, 509: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 544: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 569: 1074, 645: 1074}, {1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 480: 1073, 1073, 483: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 491: 1073, 493: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 507: 1073, 509: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 544: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 569: 1073, 645: 1073}, {1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 480: 1072, 1072, 483: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 491: 1072, 493: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 507: 1072, 509: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 544: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 569: 1072, 645: 1072}, - {130: 3442, 148: 3443}, + {130: 3443, 148: 3444}, {47: 958, 505: 958}, // 935 {47: 951, 505: 951}, @@ -7245,410 +7246,410 @@ var ( {47: 961, 505: 961}, {47: 954, 505: 954}, {47: 957, 505: 957}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3452}, - {130: 3442}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3453}, + {130: 3443}, // 945 {976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 474: 976, 976, 976, 976, 976, 480: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 491: 976, 493: 976, 976, 976, 976, 976, 976, 976, 976, 502: 976, 976, 976, 976, 509: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 544: 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 585: 976}, - {1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 474: 1252, 1252, 1252, 1252, 1252, 480: 1252, 1252, 3318, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 491: 1252, 493: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 502: 1252, 1252, 1252, 1252, 509: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 544: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 585: 1252}, + {1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 474: 1252, 1252, 1252, 1252, 1252, 480: 1252, 1252, 3319, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 491: 1252, 493: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 502: 1252, 1252, 1252, 1252, 509: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 544: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 585: 1252}, {1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 474: 1262, 1262, 1262, 1262, 1262, 480: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 491: 1262, 493: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 502: 1262, 1262, 1262, 1262, 509: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 544: 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 585: 1262}, {746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 509: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 544: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 569: 746, 573: 746, 582: 746, 585: 746, 746, 638: 746, 642: 746, 746, 746, 746, 746, 648: 746}, {745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 509: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 544: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 569: 745, 573: 745, 582: 745, 585: 745, 745, 638: 745, 642: 745, 745, 745, 745, 745, 648: 745}, // 950 {256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 509: 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 568: 256, 256, 573: 256, 582: 256, 585: 256, 256, 638: 256, 642: 256, 256, 256, 256, 256, 648: 256, 256, 652: 256, 657: 256, 659: 256, 661: 256, 256, 667: 256}, {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 509: 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 568: 255, 255, 573: 255, 582: 255, 585: 255, 255, 638: 255, 642: 255, 255, 255, 255, 255, 648: 255, 255, 652: 255, 657: 255, 659: 255, 661: 255, 255, 667: 255}, - {1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 474: 1931, 1931, 478: 1931, 480: 1931, 1931, 483: 1931, 1931, 488: 1931, 1931, 491: 1931, 493: 1931, 1931, 1931, 1931, 1931, 499: 1931, 1931, 502: 1931, 1931, 1931, 1931, 509: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 519: 1931, 1931, 1931, 1931, 524: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 545: 1931, 1931, 733: 3309, 3307}, - {1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 474: 1932, 1932, 478: 1932, 480: 1932, 1932, 483: 1932, 1932, 488: 1932, 1932, 491: 1932, 493: 1932, 1932, 1932, 1932, 1932, 499: 1932, 1932, 502: 1932, 1932, 1932, 3313, 509: 1932, 3312, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 519: 1932, 1932, 1932, 1932, 524: 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 545: 1932, 1932, 733: 3309, 3307}, - {1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 474: 1933, 1933, 478: 1933, 480: 1933, 1933, 483: 1933, 1933, 488: 1933, 1933, 491: 1933, 493: 1933, 1933, 1933, 1933, 1933, 499: 1933, 1933, 502: 1933, 1933, 1933, 3313, 509: 1933, 3312, 1933, 3308, 1933, 1933, 1933, 1933, 1933, 519: 1933, 1933, 1933, 1933, 524: 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 545: 1933, 1933, 733: 3309, 3307}, + {1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 474: 1931, 1931, 478: 1931, 480: 1931, 1931, 483: 1931, 1931, 488: 1931, 1931, 491: 1931, 493: 1931, 1931, 1931, 1931, 1931, 499: 1931, 1931, 502: 1931, 1931, 1931, 1931, 509: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 519: 1931, 1931, 1931, 1931, 524: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 545: 1931, 1931, 733: 3310, 3308}, + {1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 474: 1932, 1932, 478: 1932, 480: 1932, 1932, 483: 1932, 1932, 488: 1932, 1932, 491: 1932, 493: 1932, 1932, 1932, 1932, 1932, 499: 1932, 1932, 502: 1932, 1932, 1932, 3314, 509: 1932, 3313, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 519: 1932, 1932, 1932, 1932, 524: 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 545: 1932, 1932, 733: 3310, 3308}, + {1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 474: 1933, 1933, 478: 1933, 480: 1933, 1933, 483: 1933, 1933, 488: 1933, 1933, 491: 1933, 493: 1933, 1933, 1933, 1933, 1933, 499: 1933, 1933, 502: 1933, 1933, 1933, 3314, 509: 1933, 3313, 1933, 3309, 1933, 1933, 1933, 1933, 1933, 519: 1933, 1933, 1933, 1933, 524: 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 545: 1933, 1933, 733: 3310, 3308}, // 955 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3464}, - {47: 3465, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {144: 3326, 491: 3327, 740: 929, 883: 3466}, - {740: 3330, 746: 3467}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3465}, + {47: 3466, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {144: 3327, 491: 3328, 740: 929, 883: 3467}, + {740: 3331, 746: 3468}, {936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 474: 936, 936, 936, 936, 936, 480: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 491: 936, 493: 936, 936, 936, 936, 936, 936, 936, 936, 502: 936, 936, 936, 936, 509: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 544: 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, 585: 936}, // 960 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3469}, - {47: 3470, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {144: 3326, 491: 3327, 740: 929, 883: 3471}, - {740: 3330, 746: 3472}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3470}, + {47: 3471, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {144: 3327, 491: 3328, 740: 929, 883: 3472}, + {740: 3331, 746: 3473}, {937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 474: 937, 937, 937, 937, 937, 480: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 491: 937, 493: 937, 937, 937, 937, 937, 937, 937, 937, 502: 937, 937, 937, 937, 509: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 544: 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 937, 585: 937}, // 965 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3474}, - {7: 3476, 47: 934, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307, 1092: 3475}, - {47: 3483}, - {508: 3391, 574: 3393, 3392, 578: 3478, 818: 3477}, - {7: 3480, 47: 931, 1093: 3482}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3475}, + {7: 3477, 47: 934, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308, 1092: 3476}, + {47: 3484}, + {508: 3392, 574: 3394, 3393, 578: 3479, 818: 3478}, + {7: 3481, 47: 931, 1093: 3483}, // 970 - {7: 3480, 47: 931, 1093: 3479}, + {7: 3481, 47: 931, 1093: 3480}, {47: 932}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3481}, - {47: 930, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3482}, + {47: 930, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {47: 933}, // 975 - {144: 3326, 491: 3327, 740: 929, 883: 3484}, - {740: 3330, 746: 3485}, + {144: 3327, 491: 3328, 740: 929, 883: 3485}, + {740: 3331, 746: 3486}, {938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 474: 938, 938, 938, 938, 938, 480: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 491: 938, 493: 938, 938, 938, 938, 938, 938, 938, 938, 502: 938, 938, 938, 938, 509: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 544: 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 585: 938}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3487}, - {7: 3476, 47: 934, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307, 1092: 3488}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3488}, + {7: 3477, 47: 934, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308, 1092: 3489}, // 980 - {47: 3489}, - {144: 3326, 491: 3327, 740: 929, 883: 3490}, - {740: 3330, 746: 3491}, + {47: 3490}, + {144: 3327, 491: 3328, 740: 929, 883: 3491}, + {740: 3331, 746: 3492}, {939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 474: 939, 939, 939, 939, 939, 480: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 491: 939, 493: 939, 939, 939, 939, 939, 939, 939, 939, 502: 939, 939, 939, 939, 509: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 544: 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 585: 939}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3493, 3222, 3302, 3221, 3218}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3494, 3223, 3303, 3222, 3219}, // 985 - {47: 3494, 482: 3318, 585: 3319}, - {740: 3330, 746: 3495}, + {47: 3495, 482: 3319, 585: 3320}, + {740: 3331, 746: 3496}, {940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 474: 940, 940, 940, 940, 940, 480: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 491: 940, 493: 940, 940, 940, 940, 940, 940, 940, 940, 502: 940, 940, 940, 940, 509: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 544: 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 940, 585: 940}, - {47: 3497}, - {740: 3330, 746: 3498}, + {47: 3498}, + {740: 3331, 746: 3499}, // 990 {941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 474: 941, 941, 941, 941, 941, 480: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 491: 941, 493: 941, 941, 941, 941, 941, 941, 941, 941, 502: 941, 941, 941, 941, 509: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 544: 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, 585: 941}, - {47: 3500}, - {740: 3330, 746: 3501}, + {47: 3501}, + {740: 3331, 746: 3502}, {942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 474: 942, 942, 942, 942, 942, 480: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 491: 942, 493: 942, 942, 942, 942, 942, 942, 942, 942, 502: 942, 942, 942, 942, 509: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 544: 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, 585: 942}, - {47: 3503}, + {47: 3504}, // 995 - {740: 3330, 746: 3504}, + {740: 3331, 746: 3505}, {943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 474: 943, 943, 943, 943, 943, 480: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 491: 943, 493: 943, 943, 943, 943, 943, 943, 943, 943, 502: 943, 943, 943, 943, 509: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 544: 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 943, 585: 943}, - {47: 3506}, - {740: 3330, 746: 3507}, + {47: 3507}, + {740: 3331, 746: 3508}, {944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 474: 944, 944, 944, 944, 944, 480: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 491: 944, 493: 944, 944, 944, 944, 944, 944, 944, 944, 502: 944, 944, 944, 944, 509: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 544: 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, 585: 944}, // 1000 - {47: 3509}, - {740: 3330, 746: 3510}, + {47: 3510}, + {740: 3331, 746: 3511}, {945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 474: 945, 945, 945, 945, 945, 480: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 491: 945, 493: 945, 945, 945, 945, 945, 945, 945, 945, 502: 945, 945, 945, 945, 509: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 544: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 585: 945}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3518, 815: 3517}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3519, 815: 3518}, {2: 1235, 1235, 1235, 1235, 1235, 8: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 48: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 473: 1235, 475: 1235, 1235, 1235, 479: 1235, 483: 1235, 1235, 1235, 1235, 1235, 492: 1235, 501: 1235, 506: 1235, 1235, 1235, 515: 1235, 523: 1235, 543: 1235, 566: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 574: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 583: 1235, 1235, 587: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 639: 1235, 1235, 1235, 645: 1235, 647: 1235, 650: 1235, 744: 1235, 1235, 752: 1235, 1235, 1235, 761: 1235, 768: 1235, 1235, 1235}, // 1005 {2: 1234, 1234, 1234, 1234, 1234, 8: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 48: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 473: 1234, 475: 1234, 1234, 1234, 479: 1234, 483: 1234, 1234, 1234, 1234, 1234, 492: 1234, 501: 1234, 506: 1234, 1234, 1234, 515: 1234, 523: 1234, 543: 1234, 566: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 574: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 583: 1234, 1234, 587: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 639: 1234, 1234, 1234, 645: 1234, 647: 1234, 650: 1234, 744: 1234, 1234, 752: 1234, 1234, 1234, 761: 1234, 768: 1234, 1234, 1234}, {2: 1233, 1233, 1233, 1233, 1233, 8: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 48: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 473: 1233, 475: 1233, 1233, 1233, 479: 1233, 483: 1233, 1233, 1233, 1233, 1233, 492: 1233, 501: 1233, 506: 1233, 1233, 1233, 515: 1233, 523: 1233, 543: 1233, 566: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 574: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 583: 1233, 1233, 587: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 639: 1233, 1233, 1233, 645: 1233, 647: 1233, 650: 1233, 744: 1233, 1233, 752: 1233, 1233, 1233, 761: 1233, 768: 1233, 1233, 1233}, - {2: 1232, 1232, 1232, 1232, 1232, 8: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 48: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 473: 1232, 475: 1232, 1232, 1232, 479: 1232, 483: 1232, 1232, 1232, 1232, 1232, 492: 1232, 501: 1232, 506: 1232, 1232, 1232, 543: 1232, 566: 1232, 1232, 1232, 570: 1232, 1232, 1232, 574: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 583: 1232, 1232, 587: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 639: 1232, 1232, 1232, 647: 1232, 650: 3523}, + {2: 1232, 1232, 1232, 1232, 1232, 8: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 48: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 473: 1232, 475: 1232, 1232, 1232, 479: 1232, 483: 1232, 1232, 1232, 1232, 1232, 492: 1232, 501: 1232, 506: 1232, 1232, 1232, 543: 1232, 566: 1232, 1232, 1232, 570: 1232, 1232, 1232, 574: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 583: 1232, 1232, 587: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 639: 1232, 1232, 1232, 647: 1232, 650: 3524}, {2: 1230, 1230, 1230, 1230, 1230, 8: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 48: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 473: 1230, 475: 1230, 1230, 1230, 479: 1230, 483: 1230, 1230, 1230, 1230, 1230, 492: 1230, 501: 1230, 506: 1230, 1230, 1230, 543: 1230, 566: 1230, 1230, 1230, 570: 1230, 1230, 1230, 574: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 583: 1230, 1230, 587: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 639: 1230, 1230, 1230, 647: 1230}, {2: 1227, 1227, 1227, 1227, 1227, 8: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 48: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 473: 1227, 475: 1227, 1227, 1227, 479: 1227, 483: 1227, 1227, 1227, 1227, 1227, 492: 1227, 501: 1227, 506: 1227, 1227, 1227, 543: 1227, 566: 1227, 1227, 1227, 570: 1227, 1227, 1227, 574: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 583: 1227, 1227, 587: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 639: 1227, 1227, 1227, 647: 1227}, // 1010 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3519}, - {47: 3520, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3521}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3520}, + {47: 3521, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3522}, {1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 474: 1114, 1114, 1114, 1114, 1114, 480: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 491: 1114, 493: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 502: 1114, 1114, 1114, 1114, 509: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 544: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 585: 1114}, {949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 474: 949, 949, 949, 949, 949, 480: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 491: 949, 493: 949, 949, 949, 949, 949, 949, 949, 949, 502: 949, 949, 949, 949, 509: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 544: 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, 585: 949}, // 1015 {2: 1226, 1226, 1226, 1226, 1226, 8: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 48: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 473: 1226, 475: 1226, 1226, 1226, 479: 1226, 483: 1226, 1226, 1226, 1226, 1226, 492: 1226, 501: 1226, 506: 1226, 1226, 1226, 543: 1226, 566: 1226, 1226, 1226, 570: 1226, 1226, 1226, 574: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 583: 1226, 1226, 587: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 639: 1226, 1226, 1226, 647: 1226}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3525, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3526}, - {47: 3527, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3528}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3526, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3527}, + {47: 3528, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3529}, // 1020 {1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 474: 1115, 1115, 1115, 1115, 1115, 480: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 491: 1115, 493: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 502: 1115, 1115, 1115, 1115, 509: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 544: 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 585: 1115}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3530, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3531}, - {47: 3532, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3533}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3531, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3532}, + {47: 3533, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3534}, // 1025 {1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 474: 1116, 1116, 1116, 1116, 1116, 480: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 491: 1116, 493: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 502: 1116, 1116, 1116, 1116, 509: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 544: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 585: 1116}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3535, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3536}, - {47: 3537, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3538}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3536, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3537}, + {47: 3538, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3539}, // 1030 {1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 474: 1117, 1117, 1117, 1117, 1117, 480: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 491: 1117, 493: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 502: 1117, 1117, 1117, 1117, 509: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 544: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 585: 1117}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3540, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3541}, - {47: 3542, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3543}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3541, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3542}, + {47: 3543, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3544}, // 1035 {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 474: 1118, 1118, 1118, 1118, 1118, 480: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 491: 1118, 493: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 502: 1118, 1118, 1118, 1118, 509: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 544: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 585: 1118}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3545, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3546}, - {47: 3547, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3548}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3546, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3547}, + {47: 3548, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3549}, // 1040 {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 474: 1119, 1119, 1119, 1119, 1119, 480: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 491: 1119, 493: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 502: 1119, 1119, 1119, 1119, 509: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 544: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 585: 1119}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3550, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3551}, - {47: 3552, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3553}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3551, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3552}, + {47: 3553, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3554}, // 1045 {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 474: 1120, 1120, 1120, 1120, 1120, 480: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 491: 1120, 493: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 502: 1120, 1120, 1120, 1120, 509: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 544: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 585: 1120}, - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 3555, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3557}, - {1913, 1913, 7: 1913, 47: 1913, 125: 1913, 481: 1913, 502: 1913, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {7: 3558, 47: 1287, 125: 1287, 502: 2694, 766: 2695, 810: 3559}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 3556, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3558}, + {1913, 1913, 7: 1913, 47: 1913, 125: 1913, 481: 1913, 502: 1913, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {7: 3559, 47: 1287, 125: 1287, 502: 2695, 766: 2696, 810: 3560}, // 1050 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3565}, - {47: 1107, 125: 3561, 1257: 3560}, - {47: 3563}, - {475: 3562}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3566}, + {47: 1107, 125: 3562, 1257: 3561}, + {47: 3564}, + {475: 3563}, {47: 1106}, // 1055 - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3564}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3565}, {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 474: 1121, 1121, 1121, 1121, 1121, 480: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 491: 1121, 493: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 502: 1121, 1121, 1121, 1121, 509: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 544: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 585: 1121}, - {1912, 1912, 7: 1912, 47: 1912, 125: 1912, 481: 1912, 502: 1912, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 523: 3570, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3569, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3567, 744: 3512, 3513, 783: 3568}, - {47: 3578, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {1912, 1912, 7: 1912, 47: 1912, 125: 1912, 481: 1912, 502: 1912, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 523: 3571, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3570, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3568, 744: 3513, 3514, 783: 3569}, + {47: 3579, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1060 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3576}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3573}, - {47: 3571}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3572}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3577}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3574}, + {47: 3572}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3573}, {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 474: 1122, 1122, 1122, 1122, 1122, 480: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 491: 1122, 493: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 502: 1122, 1122, 1122, 1122, 509: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 544: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 585: 1122}, // 1065 - {47: 3574, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3575}, + {47: 3575, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3576}, {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 474: 1124, 1124, 1124, 1124, 1124, 480: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 491: 1124, 493: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 502: 1124, 1124, 1124, 1124, 509: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 544: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 585: 1124}, - {7: 3558, 47: 3577}, + {7: 3559, 47: 3578}, {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 474: 1125, 1125, 1125, 1125, 1125, 480: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 491: 1125, 493: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 502: 1125, 1125, 1125, 1125, 509: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 544: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 585: 1125}, // 1070 - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3579}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3580}, {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 474: 1123, 1123, 1123, 1123, 1123, 480: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 491: 1123, 493: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 502: 1123, 1123, 1123, 1123, 509: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 544: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 585: 1123}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3582, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3581}, - {47: 3586, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3583}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3583, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3582}, + {47: 3587, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3584}, // 1075 - {47: 3584, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3585}, + {47: 3585, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3586}, {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 474: 1126, 1126, 1126, 1126, 1126, 480: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 491: 1126, 493: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 502: 1126, 1126, 1126, 1126, 509: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 544: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 585: 1126}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3587}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3588}, {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 474: 1127, 1127, 1127, 1127, 1127, 480: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 491: 1127, 493: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 502: 1127, 1127, 1127, 1127, 509: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 544: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 585: 1127}, // 1080 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3590, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3589}, - {47: 3594, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3591}, - {47: 3592, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3593}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3591, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3590}, + {47: 3595, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3592}, + {47: 3593, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3594}, // 1085 {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 474: 1128, 1128, 1128, 1128, 1128, 480: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 491: 1128, 493: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 502: 1128, 1128, 1128, 1128, 509: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 544: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 585: 1128}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3595}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3596}, {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 474: 1129, 1129, 1129, 1129, 1129, 480: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 491: 1129, 493: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 502: 1129, 1129, 1129, 1129, 509: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 544: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 585: 1129}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3598, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3597}, - {47: 3602, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3599, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3598}, + {47: 3603, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1090 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3599}, - {47: 3600, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3601}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3600}, + {47: 3601, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3602}, {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 474: 1130, 1130, 1130, 1130, 1130, 480: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 491: 1130, 493: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 502: 1130, 1130, 1130, 1130, 509: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 544: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 585: 1130}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3603}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3604}, // 1095 {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 474: 1131, 1131, 1131, 1131, 1131, 480: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 491: 1131, 493: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 502: 1131, 1131, 1131, 1131, 509: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 544: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 585: 1131}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3605}, - {7: 3558, 47: 3606}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3606}, + {7: 3559, 47: 3607}, {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 474: 1132, 1132, 1132, 1132, 1132, 480: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 491: 1132, 493: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 502: 1132, 1132, 1132, 1132, 509: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 544: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 585: 1132}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3608}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3609}, // 1100 - {7: 3558, 47: 3609}, + {7: 3559, 47: 3610}, {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 474: 1133, 1133, 1133, 1133, 1133, 480: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 491: 1133, 493: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 502: 1133, 1133, 1133, 1133, 509: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 544: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 585: 1133}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3611}, - {7: 3612, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3613}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3612}, + {7: 3613, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3614}, // 1105 - {7: 3614, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3615}, - {47: 3616, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {7: 3615, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3616}, + {47: 3617, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 474: 1149, 1149, 1149, 1149, 1149, 480: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 491: 1149, 493: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 502: 1149, 1149, 1149, 1149, 509: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 544: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 585: 1149}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3618, 1180: 3620, 1234: 3621, 1319: 3622, 3619}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3619, 1180: 3621, 1234: 3622, 1319: 3623, 3620}, // 1110 - {47: 3630, 499: 3631, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 499: 3624, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3623}, + {47: 3631, 499: 3632, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 499: 3625, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3624}, {2: 1140, 1140, 1140, 1140, 1140, 8: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 48: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 473: 1140, 475: 1140, 1140, 1140, 479: 1140, 483: 1140, 1140, 1140, 1140, 1140, 492: 1140, 499: 1140, 501: 1140, 506: 1140, 1140, 1140, 543: 1140, 566: 1140, 1140, 1140, 570: 1140, 1140, 1140, 574: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 583: 1140, 1140, 587: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 639: 1140, 1140, 1140, 647: 1140}, {2: 1139, 1139, 1139, 1139, 1139, 8: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 48: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 473: 1139, 475: 1139, 1139, 1139, 479: 1139, 483: 1139, 1139, 1139, 1139, 1139, 492: 1139, 499: 1139, 501: 1139, 506: 1139, 1139, 1139, 543: 1139, 566: 1139, 1139, 1139, 570: 1139, 1139, 1139, 574: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 583: 1139, 1139, 587: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 639: 1139, 1139, 1139, 647: 1139}, {2: 1138, 1138, 1138, 1138, 1138, 8: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 48: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 473: 1138, 475: 1138, 1138, 1138, 479: 1138, 483: 1138, 1138, 1138, 1138, 1138, 492: 1138, 499: 1138, 501: 1138, 506: 1138, 1138, 1138, 543: 1138, 566: 1138, 1138, 1138, 570: 1138, 1138, 1138, 574: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 583: 1138, 1138, 587: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 639: 1138, 1138, 1138, 647: 1138}, // 1115 - {499: 3627, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3625}, - {47: 3626, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {499: 3628, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3626}, + {47: 3627, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 474: 1155, 1155, 1155, 1155, 1155, 480: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 491: 1155, 493: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 502: 1155, 1155, 1155, 1155, 509: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 544: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 585: 1155}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3628}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3629}, // 1120 - {47: 3629, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {47: 3630, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 474: 1154, 1154, 1154, 1154, 1154, 480: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 491: 1154, 493: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 502: 1154, 1154, 1154, 1154, 509: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 544: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 585: 1154}, {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 474: 1157, 1157, 1157, 1157, 1157, 480: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 491: 1157, 493: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 502: 1157, 1157, 1157, 1157, 509: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 544: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 585: 1157}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3632}, - {47: 3633, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3633}, + {47: 3634, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1125 {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 474: 1156, 1156, 1156, 1156, 1156, 480: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 491: 1156, 493: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 502: 1156, 1156, 1156, 1156, 509: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 544: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 585: 1156}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3635}, - {7: 3636, 499: 3637, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3643}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3638}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3636}, + {7: 3637, 499: 3638, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3644}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3639}, // 1130 - {47: 3639, 494: 3640, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {47: 3640, 494: 3641, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 474: 1162, 1162, 1162, 1162, 1162, 480: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 491: 1162, 493: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 502: 1162, 1162, 1162, 1162, 509: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 544: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 585: 1162}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3641}, - {47: 3642, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3642}, + {47: 3643, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 474: 1160, 1160, 1160, 1160, 1160, 480: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 491: 1160, 493: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 502: 1160, 1160, 1160, 1160, 509: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 544: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 585: 1160}, // 1135 - {7: 3645, 47: 3644, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {7: 3646, 47: 3645, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 474: 1163, 1163, 1163, 1163, 1163, 480: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 491: 1163, 493: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 502: 1163, 1163, 1163, 1163, 509: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 544: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 585: 1163}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3646}, - {47: 3647, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3647}, + {47: 3648, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 474: 1161, 1161, 1161, 1161, 1161, 480: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 491: 1161, 493: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 502: 1161, 1161, 1161, 1161, 509: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 544: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 585: 1161}, // 1140 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3649}, - {485: 3654, 3655, 3660, 523: 3656, 544: 3662, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3684}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3683}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3682}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3650}, + {485: 3655, 3656, 3661, 523: 3657, 544: 3663, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3685}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3684}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3683}, // 1145 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3681}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3678, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3677}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3672, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3671}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3670}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3669}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3682}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3679, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3678}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3673, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3672}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3671}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3670}, // 1150 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3668}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3667}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3666}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3665}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3663}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3669}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3668}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3667}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3666}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3664}, // 1155 - {47: 3664, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {47: 3665, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 474: 1164, 1164, 1164, 1164, 1164, 480: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 491: 1164, 493: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 502: 1164, 1164, 1164, 1164, 509: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 544: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 585: 1164}, {1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 474: 1271, 1271, 1271, 1271, 1271, 480: 1271, 1271, 483: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 491: 1271, 493: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 502: 1271, 1271, 1271, 1271, 509: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 544: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271}, - {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 474: 1272, 1272, 1272, 1272, 1272, 480: 1272, 1272, 483: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 491: 1272, 493: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 502: 1272, 1272, 1272, 1272, 509: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 544: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 3661, 1272, 1272, 1272, 1272, 1272, 1272}, - {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 474: 1273, 1273, 1273, 1273, 1273, 480: 1273, 1273, 483: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 491: 1273, 493: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 502: 1273, 1273, 1273, 1273, 509: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 544: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 3661, 1273, 1273, 1273, 1273, 1273, 1273}, + {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 474: 1272, 1272, 1272, 1272, 1272, 480: 1272, 1272, 483: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 491: 1272, 493: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 502: 1272, 1272, 1272, 1272, 509: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 544: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 3662, 1272, 1272, 1272, 1272, 1272, 1272}, + {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 474: 1273, 1273, 1273, 1273, 1273, 480: 1273, 1273, 483: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 491: 1273, 493: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 502: 1273, 1273, 1273, 1273, 509: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 544: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 3662, 1273, 1273, 1273, 1273, 1273, 1273}, // 1160 - {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 474: 1274, 1274, 1274, 1274, 1274, 480: 1274, 1274, 483: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 491: 1274, 493: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 502: 1274, 1274, 1274, 1274, 509: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 544: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 3661, 1274, 1274, 1274, 1274, 1274, 1274}, - {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 474: 1275, 1275, 1275, 1275, 1275, 480: 1275, 1275, 483: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 491: 1275, 493: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 502: 1275, 1275, 1275, 1275, 509: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 544: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 3661, 1275, 1275, 1275, 1275, 1275, 1275}, - {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 474: 1276, 1276, 1276, 1276, 1276, 480: 1276, 1276, 483: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 491: 1276, 493: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 502: 1276, 1276, 1276, 1276, 509: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 544: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 3661, 1276, 1276, 1276, 1276, 1276, 1276}, - {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 474: 1280, 1280, 1280, 1280, 1280, 480: 1280, 1280, 483: 1280, 1280, 1280, 1280, 3660, 1280, 1280, 491: 1280, 493: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 502: 1280, 1280, 1280, 1280, 509: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 3656, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 544: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 3657, 3658, 1280, 3661, 1280, 3659, 1280, 1280, 1280, 1280}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 1216, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3673}, + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 474: 1274, 1274, 1274, 1274, 1274, 480: 1274, 1274, 483: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 491: 1274, 493: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 502: 1274, 1274, 1274, 1274, 509: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 544: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 3662, 1274, 1274, 1274, 1274, 1274, 1274}, + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 474: 1275, 1275, 1275, 1275, 1275, 480: 1275, 1275, 483: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 491: 1275, 493: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 502: 1275, 1275, 1275, 1275, 509: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 544: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 3662, 1275, 1275, 1275, 1275, 1275, 1275}, + {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 474: 1276, 1276, 1276, 1276, 1276, 480: 1276, 1276, 483: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 491: 1276, 493: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 502: 1276, 1276, 1276, 1276, 509: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 544: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 3662, 1276, 1276, 1276, 1276, 1276, 1276}, + {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 474: 1280, 1280, 1280, 1280, 1280, 480: 1280, 1280, 483: 1280, 1280, 1280, 1280, 3661, 1280, 1280, 491: 1280, 493: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 502: 1280, 1280, 1280, 1280, 509: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 3657, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 544: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 3658, 3659, 1280, 3662, 1280, 3660, 1280, 1280, 1280, 1280}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 1216, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3674}, // 1165 - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3674}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3675}, {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 474: 1278, 1278, 1278, 1278, 1278, 480: 1278, 1278, 483: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 491: 1278, 493: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 502: 1278, 1278, 1278, 1278, 509: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 544: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3676}, - {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 474: 1277, 1277, 1277, 1277, 1277, 480: 1277, 1277, 483: 1277, 1277, 1277, 1277, 3660, 1277, 1277, 491: 1277, 493: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 502: 1277, 1277, 1277, 1277, 509: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 3656, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 544: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 3657, 3658, 1277, 3661, 1277, 3659, 1277, 1277, 1277, 1277}, - {1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 474: 1281, 1281, 1281, 1281, 1281, 480: 1281, 1281, 483: 1281, 1281, 1281, 1281, 3660, 1281, 1281, 491: 1281, 493: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 502: 1281, 1281, 1281, 1281, 509: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 3656, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 544: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 3657, 3658, 1281, 3661, 1281, 3659, 1281, 1281, 1281, 1281}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3677}, + {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 474: 1277, 1277, 1277, 1277, 1277, 480: 1277, 1277, 483: 1277, 1277, 1277, 1277, 3661, 1277, 1277, 491: 1277, 493: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 502: 1277, 1277, 1277, 1277, 509: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 3657, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 544: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 3658, 3659, 1277, 3662, 1277, 3660, 1277, 1277, 1277, 1277}, + {1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 474: 1281, 1281, 1281, 1281, 1281, 480: 1281, 1281, 483: 1281, 1281, 1281, 1281, 3661, 1281, 1281, 491: 1281, 493: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 502: 1281, 1281, 1281, 1281, 509: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 3657, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 544: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 3658, 3659, 1281, 3662, 1281, 3660, 1281, 1281, 1281, 1281}, // 1170 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 1216, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3679}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3680}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 1216, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3680}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3681}, {1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 474: 1279, 1279, 1279, 1279, 1279, 480: 1279, 1279, 483: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 491: 1279, 493: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 502: 1279, 1279, 1279, 1279, 509: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 544: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279}, - {1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 474: 1282, 1282, 1282, 1282, 1282, 480: 1282, 1282, 483: 1282, 1282, 3654, 3655, 3660, 1282, 1282, 491: 1282, 493: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 502: 1282, 1282, 1282, 1282, 509: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 3656, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 544: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 3657, 3658, 1282, 3661, 1282, 3659, 1282, 1282, 1282, 1282}, - {1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 474: 1283, 1283, 1283, 1283, 1283, 480: 1283, 1283, 483: 1283, 1283, 3654, 3655, 3660, 1283, 1283, 491: 1283, 493: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 502: 1283, 1283, 1283, 1283, 509: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 3656, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 544: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 3657, 3658, 1283, 3661, 1283, 3659, 1283, 1283, 1283, 1283}, + {1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 474: 1282, 1282, 1282, 1282, 1282, 480: 1282, 1282, 483: 1282, 1282, 3655, 3656, 3661, 1282, 1282, 491: 1282, 493: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 502: 1282, 1282, 1282, 1282, 509: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 3657, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 544: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 3658, 3659, 1282, 3662, 1282, 3660, 1282, 1282, 1282, 1282}, + {1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 474: 1283, 1283, 1283, 1283, 1283, 480: 1283, 1283, 483: 1283, 1283, 3655, 3656, 3661, 1283, 1283, 491: 1283, 493: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 502: 1283, 1283, 1283, 1283, 509: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 3657, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 544: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 3658, 3659, 1283, 3662, 1283, 3660, 1283, 1283, 1283, 1283}, // 1175 - {1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 474: 1284, 1284, 1284, 1284, 1284, 480: 1284, 1284, 483: 1284, 1284, 3654, 3655, 3660, 1284, 1284, 491: 1284, 493: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 502: 1284, 1284, 1284, 1284, 509: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 3656, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 544: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 3657, 3658, 1284, 3661, 1284, 3659, 3652, 3653, 1284, 1284}, - {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 474: 1285, 1285, 1285, 1285, 1285, 480: 1285, 1285, 483: 1285, 1285, 3654, 3655, 3660, 1285, 1285, 491: 1285, 493: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 502: 1285, 1285, 1285, 1285, 509: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 3656, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 544: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 3657, 3658, 3651, 3661, 1285, 3659, 3652, 3653, 1285, 1285}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 802: 3412, 821: 3686}, - {499: 3687}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3688}, + {1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 474: 1284, 1284, 1284, 1284, 1284, 480: 1284, 1284, 483: 1284, 1284, 3655, 3656, 3661, 1284, 1284, 491: 1284, 493: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 502: 1284, 1284, 1284, 1284, 509: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 3657, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 544: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 3658, 3659, 1284, 3662, 1284, 3660, 3653, 3654, 1284, 1284}, + {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 474: 1285, 1285, 1285, 1285, 1285, 480: 1285, 1285, 483: 1285, 1285, 3655, 3656, 3661, 1285, 1285, 491: 1285, 493: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 502: 1285, 1285, 1285, 1285, 509: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 3657, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 544: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 3658, 3659, 3652, 3662, 1285, 3660, 3653, 3654, 1285, 1285}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 802: 3413, 821: 3687}, + {499: 3688}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3689}, // 1180 - {47: 3689, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {47: 3690, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 474: 1166, 1166, 1166, 1166, 1166, 480: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 491: 1166, 493: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 502: 1166, 1166, 1166, 1166, 509: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 544: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 585: 1166}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3691}, - {7: 3692, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {581: 3693}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3692}, + {7: 3693, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {581: 3694}, // 1185 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3694}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3695}, - {47: 3696}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3695}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3696}, + {47: 3697}, {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 474: 1167, 1167, 1167, 1167, 1167, 480: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 491: 1167, 493: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 502: 1167, 1167, 1167, 1167, 509: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 544: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 585: 1167}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3698}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3699}, // 1190 - {7: 3699, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3701, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3700}, - {47: 3705, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 1216, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3702}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3703}, + {7: 3700, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3702, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3701}, + {47: 3706, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 1216, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3703}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3704}, // 1195 - {47: 3704, 485: 3675}, + {47: 3705, 485: 3676}, {1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 474: 1168, 1168, 1168, 1168, 1168, 480: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 491: 1168, 493: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 502: 1168, 1168, 1168, 1168, 509: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 544: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 585: 1168}, {1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 474: 1169, 1169, 1169, 1169, 1169, 480: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 491: 1169, 493: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 502: 1169, 1169, 1169, 1169, 509: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 544: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 585: 1169}, - {47: 1907, 508: 3708, 1050: 3707, 3709}, + {47: 1907, 508: 3709, 1050: 3708, 3710}, {47: 1906}, // 1200 {47: 1905}, - {47: 3710}, + {47: 3711}, {1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 474: 1170, 1170, 1170, 1170, 1170, 480: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 491: 1170, 493: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 502: 1170, 1170, 1170, 1170, 509: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 544: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 585: 1170}, - {47: 1907, 508: 3708, 1050: 3707, 3712}, - {47: 3713}, + {47: 1907, 508: 3709, 1050: 3708, 3713}, + {47: 3714}, // 1205 {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 474: 1171, 1171, 1171, 1171, 1171, 480: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 491: 1171, 493: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 502: 1171, 1171, 1171, 1171, 509: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 544: 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 585: 1171}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3715}, - {7: 3716, 485: 3654, 3655, 3660, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 3717}, - {47: 3718, 485: 3654, 3655, 3660, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3716}, + {7: 3717, 485: 3655, 3656, 3661, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 3718}, + {47: 3719, 485: 3655, 3656, 3661, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, // 1210 {1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 474: 1173, 1173, 1173, 1173, 1173, 480: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 491: 1173, 493: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 502: 1173, 1173, 1173, 1173, 509: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 544: 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 585: 1173}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 3721}, - {7: 3558, 47: 1908}, - {47: 3722}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 3722}, + {7: 3559, 47: 1908}, + {47: 3723}, {1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 474: 1174, 1174, 1174, 1174, 1174, 480: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 491: 1174, 493: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 502: 1174, 1174, 1174, 1174, 509: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 544: 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 1174, 585: 1174}, // 1215 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3724}, - {7: 3558, 47: 3725, 481: 3726}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3725}, + {7: 3559, 47: 3726, 481: 3727}, {1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 474: 1179, 1179, 1179, 1179, 1179, 480: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 491: 1179, 493: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 502: 1179, 1179, 1179, 1179, 509: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 544: 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 585: 1179}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 3727}, - {47: 3730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 3728}, + {47: 3731}, // 1220 {748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 47: 748, 98: 748, 107: 748, 472: 748, 748, 748, 476: 748, 748, 748, 748, 748, 482: 748, 490: 748, 748, 748, 501: 748, 503: 748, 748, 506: 748, 748, 543: 748, 569: 748, 573: 748, 582: 748, 586: 748, 638: 748, 642: 748, 748, 748, 748, 748, 648: 748, 657: 748}, {747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 47: 747, 98: 747, 107: 747, 472: 747, 747, 747, 476: 747, 747, 747, 747, 747, 482: 747, 490: 747, 747, 747, 501: 747, 503: 747, 747, 506: 747, 747, 543: 747, 569: 747, 573: 747, 582: 747, 586: 747, 638: 747, 642: 747, 747, 747, 747, 747, 648: 747, 657: 747}, {1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 474: 1178, 1178, 1178, 1178, 1178, 480: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 491: 1178, 493: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 502: 1178, 1178, 1178, 1178, 509: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 544: 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 585: 1178}, {1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 474: 1180, 1180, 1180, 1180, 1180, 480: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 491: 1180, 493: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 502: 1180, 1180, 1180, 1180, 509: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 544: 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 1180, 585: 1180}, - {47: 3733, 508: 3734}, + {47: 3734, 508: 3735}, // 1225 {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 474: 1102, 1102, 1102, 1102, 1102, 480: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 491: 1102, 493: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 502: 1102, 1102, 1102, 1102, 509: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 544: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 585: 1102}, - {47: 3735}, + {47: 3736}, {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 474: 1101, 1101, 1101, 1101, 1101, 480: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 491: 1101, 493: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 502: 1101, 1101, 1101, 1101, 509: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 544: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 585: 1101}, - {47: 3737}, + {47: 3738}, {1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 474: 1181, 1181, 1181, 1181, 1181, 480: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 491: 1181, 493: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 502: 1181, 1181, 1181, 1181, 509: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 544: 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 585: 1181}, // 1230 - {47: 3740}, + {47: 3741}, {1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 474: 1182, 1182, 1182, 1182, 1182, 480: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 491: 1182, 493: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 502: 1182, 1182, 1182, 1182, 509: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 544: 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 585: 1182}, {1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 474: 1195, 1195, 1195, 1195, 1195, 480: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 491: 1195, 493: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 502: 1195, 1195, 1195, 1195, 509: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 544: 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 585: 1195, 649: 1195, 661: 1195, 667: 1195}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 3742}, - {47: 3743}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 3743}, + {47: 3744}, // 1235 {1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 474: 1183, 1183, 1183, 1183, 1183, 480: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 491: 1183, 493: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 502: 1183, 1183, 1183, 1183, 509: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 544: 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 1183, 585: 1183}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 3745}, - {47: 3746}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 3746}, + {47: 3747}, {1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 474: 1184, 1184, 1184, 1184, 1184, 480: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 491: 1184, 493: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 502: 1184, 1184, 1184, 1184, 509: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 544: 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 1184, 585: 1184}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3748, 2731, 2732, 2730, 710: 3749}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3749, 2732, 2733, 2731, 710: 3750}, // 1240 - {47: 1269, 498: 1269, 651: 3751}, - {47: 3750}, + {47: 1269, 498: 1269, 651: 3752}, + {47: 3751}, {1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 474: 1238, 1238, 1238, 1238, 1238, 480: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 491: 1238, 493: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 502: 1238, 1238, 1238, 1238, 509: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 544: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 585: 1238}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3752, 2731, 2732, 2730}, - {47: 1268, 498: 1268, 651: 3753}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3753, 2732, 2733, 2731}, + {47: 1268, 498: 1268, 651: 3754}, // 1245 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3754, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3755, 2732, 2733, 2731}, {1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 474: 1267, 1267, 1267, 1267, 1267, 480: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 491: 1267, 493: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 502: 1267, 1267, 1267, 1267, 509: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 544: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 585: 1267, 654: 1267, 1267}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3748, 2731, 2732, 2730, 710: 3756}, - {47: 3757}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3749, 2732, 2733, 2731, 710: 3757}, + {47: 3758}, {1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 474: 1239, 1239, 1239, 1239, 1239, 480: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 491: 1239, 493: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 502: 1239, 1239, 1239, 1239, 509: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 544: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 585: 1239}, // 1250 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3759}, - {7: 3760, 481: 3761, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {49: 3772, 101: 3768, 165: 3774, 173: 3769, 3767, 193: 3771, 506: 3779, 543: 3765, 646: 3778, 679: 3770, 3775, 3776, 684: 3777, 739: 3773, 899: 3766, 997: 3764}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 3762}, - {47: 3763}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3760}, + {7: 3761, 481: 3762, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {49: 3773, 101: 3769, 165: 3775, 173: 3770, 3768, 193: 3772, 506: 3780, 543: 3766, 646: 3779, 679: 3771, 3776, 3777, 684: 3778, 739: 3774, 899: 3767, 997: 3765}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 3763}, + {47: 3764}, // 1255 {1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 474: 1240, 1240, 1240, 1240, 1240, 480: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 491: 1240, 493: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 502: 1240, 1240, 1240, 1240, 509: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 544: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 585: 1240}, - {47: 3815}, - {47: 286, 473: 3794, 762: 3795, 785: 3814}, - {14: 286, 47: 286, 473: 3794, 506: 286, 543: 286, 646: 286, 762: 3795, 785: 3799}, + {47: 3816}, + {47: 286, 473: 3795, 762: 3796, 785: 3815}, + {14: 286, 47: 286, 473: 3795, 506: 286, 543: 286, 646: 286, 762: 3796, 785: 3800}, {47: 1062}, // 1260 {47: 1061}, - {47: 286, 473: 3794, 762: 3795, 785: 3798}, - {47: 279, 473: 3781, 762: 3782, 902: 3797, 907: 3783}, - {47: 286, 473: 3794, 762: 3795, 785: 3793}, - {47: 350, 682: 3790, 3791, 1089: 3792}, + {47: 286, 473: 3795, 762: 3796, 785: 3799}, + {47: 279, 473: 3782, 762: 3783, 902: 3798, 907: 3784}, + {47: 286, 473: 3795, 762: 3796, 785: 3794}, + {47: 350, 682: 3791, 3792, 1089: 3793}, // 1265 - {47: 350, 682: 3790, 3791, 1089: 3789}, + {47: 350, 682: 3791, 3792, 1089: 3790}, {47: 1055}, {47: 1054}, - {47: 279, 473: 3781, 762: 3782, 902: 3780, 907: 3783}, + {47: 279, 473: 3782, 762: 3783, 902: 3781, 907: 3784}, {47: 1052}, // 1270 {14: 324, 47: 324, 473: 324, 506: 324, 543: 324, 646: 324}, {14: 323, 47: 323, 473: 323, 506: 323, 543: 323, 646: 323}, {47: 1053}, - {508: 2705, 732: 2704, 743: 3784}, + {508: 2706, 732: 2705, 743: 3785}, {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 47: 278, 49: 278, 472: 278, 476: 278, 278, 278, 278, 482: 278, 490: 278, 492: 278, 573: 278, 582: 278, 586: 278, 638: 278, 642: 278, 278, 278, 739: 278, 741: 278}, // 1275 {277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 47: 277, 49: 277, 472: 277, 476: 277, 277, 277, 277, 482: 277, 490: 277, 492: 277, 573: 277, 582: 277, 586: 277, 638: 277, 642: 277, 277, 277, 739: 277, 741: 277}, - {7: 3786, 47: 3785}, + {7: 3787, 47: 3786}, {287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 14: 287, 47: 287, 49: 287, 102: 287, 287, 106: 287, 472: 287, 476: 287, 287, 287, 287, 482: 287, 490: 287, 492: 287, 506: 287, 529: 287, 287, 543: 287, 573: 287, 582: 287, 586: 287, 638: 287, 642: 287, 287, 287, 646: 287, 739: 287, 741: 287}, - {508: 2705, 732: 2704, 743: 3787}, - {47: 3788}, + {508: 2706, 732: 2705, 743: 3788}, + {47: 3789}, // 1280 {276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 47: 276, 49: 276, 472: 276, 476: 276, 276, 276, 276, 482: 276, 490: 276, 492: 276, 573: 276, 582: 276, 586: 276, 638: 276, 642: 276, 276, 276, 739: 276, 741: 276}, {47: 1056}, @@ -7657,357 +7658,357 @@ var ( {47: 1057}, // 1285 {47: 1058}, - {508: 2705, 732: 2704, 743: 3796}, + {508: 2706, 732: 2705, 743: 3797}, {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 14: 285, 47: 285, 49: 285, 102: 285, 285, 106: 285, 472: 285, 476: 285, 285, 285, 285, 482: 285, 490: 285, 492: 285, 506: 285, 529: 285, 285, 543: 285, 573: 285, 582: 285, 586: 285, 638: 285, 642: 285, 285, 285, 646: 285, 739: 285, 741: 285}, - {47: 3785}, + {47: 3786}, {47: 1059}, // 1290 {47: 1060}, - {14: 3804, 47: 273, 506: 3805, 543: 3801, 646: 3803, 772: 3802, 797: 3800}, + {14: 3805, 47: 273, 506: 3806, 543: 3802, 646: 3804, 772: 3803, 797: 3801}, {47: 1063}, - {270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 14: 3804, 47: 270, 472: 270, 476: 270, 270, 270, 270, 482: 270, 490: 270, 492: 270, 506: 3805, 573: 270, 582: 270, 586: 270, 638: 270, 642: 270, 270, 270, 646: 3803, 772: 3812, 1253: 3811}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 3808}, + {270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 14: 3805, 47: 270, 472: 270, 476: 270, 270, 270, 270, 482: 270, 490: 270, 492: 270, 506: 3806, 573: 270, 582: 270, 586: 270, 638: 270, 642: 270, 270, 270, 646: 3804, 772: 3813, 1253: 3812}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 3809}, // 1295 - {504: 3807}, + {504: 3808}, {267, 267, 267, 267, 267, 267, 267, 8: 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 48: 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 475: 267, 479: 267, 497: 267, 267, 518: 267, 543: 267}, - {504: 3806}, + {504: 3807}, {266, 266, 266, 266, 266, 266, 266, 8: 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 48: 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 475: 266, 479: 266, 497: 266, 266, 518: 266, 543: 266}, {268, 268, 268, 268, 268, 268, 268, 8: 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 48: 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 475: 268, 479: 268, 497: 268, 268, 518: 268, 543: 268}, // 1300 - {275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 47: 275, 472: 275, 476: 275, 275, 275, 275, 482: 275, 490: 275, 492: 275, 543: 3809, 573: 275, 582: 275, 586: 275, 638: 275, 642: 275, 275, 275, 1252: 3810}, + {275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 47: 275, 472: 275, 476: 275, 275, 275, 275, 482: 275, 490: 275, 492: 275, 543: 3810, 573: 275, 582: 275, 586: 275, 638: 275, 642: 275, 275, 275, 1252: 3811}, {274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 47: 274, 472: 274, 476: 274, 274, 274, 274, 482: 274, 490: 274, 492: 274, 573: 274, 582: 274, 586: 274, 638: 274, 642: 274, 274, 274}, {271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 47: 271, 472: 271, 476: 271, 271, 271, 271, 482: 271, 490: 271, 492: 271, 573: 271, 582: 271, 586: 271, 638: 271, 642: 271, 271, 271}, {272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 47: 272, 472: 272, 476: 272, 272, 272, 272, 482: 272, 490: 272, 492: 272, 573: 272, 582: 272, 586: 272, 638: 272, 642: 272, 272, 272}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 3813}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 3814}, // 1305 {269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 47: 269, 472: 269, 476: 269, 269, 269, 269, 482: 269, 490: 269, 492: 269, 573: 269, 582: 269, 586: 269, 638: 269, 642: 269, 269, 269}, {47: 1064}, {1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 474: 1241, 1241, 1241, 1241, 1241, 480: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 491: 1241, 493: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 502: 1241, 1241, 1241, 1241, 509: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 544: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 585: 1241}, - {505: 3313, 509: 3311, 3312, 3310, 3308, 542: 1070, 733: 3309, 3307}, - {542: 3820, 1156: 3819, 1335: 3818}, + {505: 3314, 509: 3312, 3313, 3311, 3309, 542: 1070, 733: 3310, 3308}, + {542: 3821, 1156: 3820, 1335: 3819}, // 1310 - {157: 1066, 542: 3820, 545: 3826, 1156: 3825, 1202: 3824}, + {157: 1066, 542: 3821, 545: 3827, 1156: 3826, 1202: 3825}, {157: 1069, 542: 1069, 545: 1069}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3821}, - {505: 3313, 509: 3311, 3312, 3310, 3308, 546: 3822, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3823}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3822}, + {505: 3314, 509: 3312, 3313, 3311, 3309, 546: 3823, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3824}, // 1315 - {157: 1067, 505: 3313, 509: 3311, 3312, 3310, 3308, 542: 1067, 545: 1067, 733: 3309, 3307}, - {157: 3828}, + {157: 1067, 505: 3314, 509: 3312, 3313, 3311, 3309, 542: 1067, 545: 1067, 733: 3310, 3308}, + {157: 3829}, {157: 1068, 542: 1068, 545: 1068}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3827}, - {157: 1065, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3828}, + {157: 1065, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1320 {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 474: 1242, 1242, 1242, 1242, 1242, 480: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 491: 1242, 493: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 502: 1242, 1242, 1242, 1242, 509: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 544: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 585: 1242}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3830}, - {478: 3831, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {49: 3772, 101: 3768, 165: 3774, 173: 3769, 3767, 193: 3771, 506: 3779, 543: 3765, 646: 3778, 679: 3770, 3775, 3776, 684: 3777, 739: 3773, 899: 3766, 997: 3832}, - {47: 3833}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3831}, + {478: 3832, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {49: 3773, 101: 3769, 165: 3775, 173: 3770, 3768, 193: 3772, 506: 3780, 543: 3766, 646: 3779, 679: 3771, 3776, 3777, 684: 3778, 739: 3774, 899: 3767, 997: 3833}, + {47: 3834}, // 1325 {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 474: 1243, 1243, 1243, 1243, 1243, 480: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 491: 1243, 493: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 502: 1243, 1243, 1243, 1243, 509: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 544: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 585: 1243}, - {1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 474: 1244, 1244, 1244, 1244, 1244, 480: 1244, 1244, 3318, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 491: 1244, 493: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 502: 1244, 1244, 1244, 1244, 509: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 544: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 585: 1244}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3836}, - {505: 3313, 509: 3311, 3312, 3310, 3308, 522: 3837, 733: 3309, 3307}, + {1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 474: 1244, 1244, 1244, 1244, 1244, 480: 1244, 1244, 3319, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 491: 1244, 493: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 502: 1244, 1244, 1244, 1244, 509: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 544: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 585: 1244}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3837}, + {505: 3314, 509: 3312, 3313, 3311, 3309, 522: 3838, 733: 3310, 3308}, {1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 474: 1245, 1245, 1245, 1245, 1245, 480: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 491: 1245, 493: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 502: 1245, 1245, 1245, 1245, 509: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 544: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 585: 1245}, // 1330 {1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 474: 1246, 1246, 1246, 1246, 1246, 480: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 491: 1246, 493: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 502: 1246, 1246, 1246, 1246, 509: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 544: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 585: 1246}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3840}, - {7: 3841}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3842}, - {7: 1912, 47: 3843, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3841}, + {7: 3842}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3843}, + {7: 1912, 47: 3844, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1335 {1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 474: 1247, 1247, 1247, 1247, 1247, 480: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 491: 1247, 493: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 502: 1247, 1247, 1247, 1247, 509: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 544: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 585: 1247}, - {7: 1913, 47: 3946, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {7: 3943}, - {7: 1250, 47: 1250, 476: 1250, 1250, 480: 805, 482: 1250, 485: 1250, 1250, 1250, 805, 805, 493: 2697, 498: 1250, 500: 2698, 502: 2694, 505: 1250, 509: 1250, 1250, 1250, 1250, 518: 1250, 523: 1250, 544: 1250, 547: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 585: 1250, 766: 3859, 3860}, - {473: 3747, 576: 3864, 910: 3863, 974: 3862}, + {7: 1913, 47: 3947, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {7: 3944}, + {7: 1250, 47: 1250, 476: 1250, 1250, 480: 805, 482: 1250, 485: 1250, 1250, 1250, 805, 805, 493: 2698, 498: 1250, 500: 2699, 502: 2695, 505: 1250, 509: 1250, 1250, 1250, 1250, 518: 1250, 523: 1250, 544: 1250, 547: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 585: 1250, 766: 3860, 3861}, + {473: 3748, 576: 3865, 910: 3864, 974: 3863}, // 1340 - {473: 2559, 501: 2557, 569: 2556, 645: 2552, 708: 3856, 747: 3855, 2553, 2554, 2555, 2564, 755: 2562, 3857, 3858}, - {47: 3854, 480: 806, 488: 806, 806}, + {473: 2560, 501: 2558, 569: 2557, 645: 2553, 708: 3857, 747: 3856, 2554, 2555, 2556, 2565, 755: 2563, 3858, 3859}, + {47: 3855, 480: 806, 488: 806, 806}, + {47: 3854}, {47: 3853}, - {47: 3852}, {833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 480: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 491: 833, 493: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 509: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 544: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 569: 833, 585: 833, 645: 833, 653: 833, 738: 833}, // 1345 {834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 480: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 491: 834, 493: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 509: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 544: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 569: 834, 585: 834, 645: 834, 653: 834, 738: 834}, {835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 480: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 491: 835, 493: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 509: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 544: 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 835, 569: 835, 585: 835, 645: 835, 653: 835, 738: 835}, {990, 990, 47: 990, 472: 990, 474: 990, 480: 806, 990, 488: 806, 806}, - {989, 989, 47: 989, 472: 989, 474: 989, 480: 805, 989, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {989, 989, 47: 989, 472: 989, 474: 989, 480: 805, 989, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, {818, 818, 47: 818, 472: 818, 474: 818, 481: 818}, // 1350 {817, 817, 47: 817, 472: 817, 474: 817, 481: 817}, - {811, 811, 47: 811, 472: 811, 474: 811, 481: 811, 493: 2697, 500: 2698, 767: 3861}, + {811, 811, 47: 811, 472: 811, 474: 811, 481: 811, 493: 2698, 500: 2699, 767: 3862}, {810, 810, 47: 810, 472: 810, 474: 810, 481: 810}, {809, 809, 47: 809, 472: 809, 474: 809, 481: 809}, - {1287, 1287, 7: 3876, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2694, 766: 2695, 810: 3875}, + {1287, 1287, 7: 3877, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2695, 766: 2696, 810: 3876}, // 1355 {8, 8, 7: 8, 47: 8, 472: 8, 474: 8, 480: 8, 8, 488: 8, 8, 493: 8, 8, 8, 8, 500: 8, 502: 8}, - {473: 3865, 838: 3866}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1327, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 3870, 1325: 3869, 3868}, + {473: 3866, 838: 3867}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1327, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 3871, 1325: 3870, 3869}, {6, 6, 7: 6, 47: 6, 472: 6, 474: 6, 480: 6, 6, 488: 6, 6, 493: 6, 6, 6, 6, 500: 6, 502: 6}, - {1323, 1323, 7: 1323, 47: 1323, 472: 1323, 481: 1323, 493: 1323, 497: 1323, 502: 1323, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {1323, 1323, 7: 1323, 47: 1323, 472: 1323, 481: 1323, 493: 1323, 497: 1323, 502: 1323, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1360 - {47: 3874}, - {7: 3872, 47: 1326}, + {47: 3875}, + {7: 3873, 47: 1326}, {7: 1324, 47: 1324}, - {1322, 1322, 7: 1322, 47: 1322, 472: 1322, 3755, 481: 1322, 493: 1322, 497: 1322, 502: 1322}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 3873}, + {1322, 1322, 7: 1322, 47: 1322, 472: 1322, 3756, 481: 1322, 493: 1322, 497: 1322, 502: 1322}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 3874}, // 1365 {7: 1325, 47: 1325}, {1328, 1328, 7: 1328, 47: 1328, 86: 1328, 472: 1328, 474: 1328, 480: 1328, 1328, 488: 1328, 1328, 493: 1328, 1328, 1328, 1328, 500: 1328, 502: 1328, 505: 1328}, - {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2697, 860, 860, 860, 500: 2698, 767: 2699, 828: 3878}, - {576: 3864, 910: 3877}, + {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2698, 860, 860, 860, 500: 2699, 767: 2700, 828: 3879}, + {576: 3865, 910: 3878}, {7, 7, 7: 7, 47: 7, 472: 7, 474: 7, 480: 7, 7, 488: 7, 7, 493: 7, 7, 7, 7, 500: 7, 502: 7}, // 1370 - {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3880, 831, 3881, 886: 3879}, - {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3906, 887: 3905}, - {281: 3886, 653: 3885}, - {544: 3882}, - {281: 3883}, + {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3881, 831, 3882, 886: 3880}, + {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3907, 887: 3906}, + {281: 3887, 653: 3886}, + {544: 3883}, + {281: 3884}, // 1375 - {181: 3884}, + {181: 3885}, {823, 823, 47: 823, 472: 823, 474: 823, 480: 823, 823, 488: 823, 823, 495: 823}, - {822, 822, 47: 822, 138: 822, 150: 822, 171: 822, 472: 822, 474: 822, 480: 822, 822, 488: 822, 822, 495: 822, 1082: 3888, 3899}, - {822, 822, 47: 822, 138: 822, 150: 822, 472: 822, 474: 822, 480: 822, 822, 488: 822, 822, 495: 822, 1082: 3888, 3887}, - {829, 829, 47: 829, 138: 3897, 150: 3896, 472: 829, 474: 829, 480: 829, 829, 488: 829, 829, 495: 829}, + {822, 822, 47: 822, 138: 822, 150: 822, 171: 822, 472: 822, 474: 822, 480: 822, 822, 488: 822, 822, 495: 822, 1082: 3889, 3900}, + {822, 822, 47: 822, 138: 822, 150: 822, 472: 822, 474: 822, 480: 822, 822, 488: 822, 822, 495: 822, 1082: 3889, 3888}, + {829, 829, 47: 829, 138: 3898, 150: 3897, 472: 829, 474: 829, 480: 829, 829, 488: 829, 829, 495: 829}, // 1380 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 3891}, - {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 544: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 569: 1046, 573: 1046, 582: 1046, 585: 1046, 1046, 1046, 638: 1046, 642: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 3894, 1046, 1046, 656: 1046, 1046, 659: 1046, 1046, 668: 1046, 1046, 1046, 1046, 1046, 1046, 678: 1046, 685: 1046, 1046, 688: 1046, 703: 1046}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 3892}, + {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 544: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 569: 1046, 573: 1046, 582: 1046, 585: 1046, 1046, 1046, 638: 1046, 642: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 3895, 1046, 1046, 656: 1046, 1046, 659: 1046, 1046, 668: 1046, 1046, 1046, 1046, 1046, 1046, 678: 1046, 685: 1046, 1046, 688: 1046, 703: 1046}, {1044, 1044, 7: 1044, 47: 1044, 138: 1044, 150: 1044, 171: 1044, 472: 1044, 474: 1044, 480: 1044, 1044, 488: 1044, 1044, 495: 1044, 499: 1044, 649: 1044, 669: 1044, 671: 1044}, - {821, 821, 7: 3892, 47: 821, 138: 821, 150: 821, 171: 821, 472: 821, 474: 821, 480: 821, 821, 488: 821, 821, 495: 821}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3893}, + {821, 821, 7: 3893, 47: 821, 138: 821, 150: 821, 171: 821, 472: 821, 474: 821, 480: 821, 821, 488: 821, 821, 495: 821}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3894}, // 1385 {1043, 1043, 7: 1043, 47: 1043, 138: 1043, 150: 1043, 161: 1043, 171: 1043, 472: 1043, 474: 1043, 480: 1043, 1043, 488: 1043, 1043, 495: 1043, 499: 1043, 649: 1043, 1043, 669: 1043, 671: 1043}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3895, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3896, 2732, 2733, 2731}, {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 544: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 569: 1045, 573: 1045, 582: 1045, 585: 1045, 1045, 1045, 638: 1045, 642: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 652: 1045, 1045, 656: 1045, 1045, 659: 1045, 1045, 668: 1045, 1045, 1045, 1045, 1045, 1045, 678: 1045, 685: 1045, 1045, 688: 1045, 703: 1045}, {826, 826, 47: 826, 472: 826, 474: 826, 480: 826, 826, 488: 826, 826, 495: 826}, - {263: 3898}, + {263: 3899}, // 1390 {824, 824, 47: 824, 472: 824, 474: 824, 480: 824, 824, 488: 824, 824, 495: 824}, - {830, 830, 47: 830, 138: 3902, 150: 3900, 171: 3901, 472: 830, 474: 830, 480: 830, 830, 488: 830, 830, 495: 830}, + {830, 830, 47: 830, 138: 3903, 150: 3901, 171: 3902, 472: 830, 474: 830, 480: 830, 830, 488: 830, 830, 495: 830}, {828, 828, 47: 828, 472: 828, 474: 828, 480: 828, 828, 488: 828, 828, 495: 828}, - {508: 2705, 732: 3904}, - {263: 3903}, + {508: 2706, 732: 3905}, + {263: 3904}, // 1395 {825, 825, 47: 825, 472: 825, 474: 825, 480: 825, 825, 488: 825, 825, 495: 825}, {827, 827, 47: 827, 472: 827, 474: 827, 480: 827, 827, 488: 827, 827, 495: 827}, {991, 991, 47: 991, 472: 991, 474: 991, 480: 991, 991, 488: 991, 991}, - {1265: 3907}, - {475: 3908}, + {1265: 3908}, + {475: 3909}, // 1400 - {100, 100, 47: 100, 98: 3912, 107: 3911, 472: 100, 474: 100, 480: 100, 100, 488: 100, 100, 657: 100, 832: 3910, 1047: 3909}, - {87, 87, 47: 87, 472: 87, 474: 87, 480: 87, 87, 488: 87, 87, 657: 3933, 942: 3932}, - {781: 3915, 787: 3917, 792: 3918, 3916, 1046: 3914, 1208: 3913}, + {100, 100, 47: 100, 98: 3913, 107: 3912, 472: 100, 474: 100, 480: 100, 100, 488: 100, 100, 657: 100, 832: 3911, 1047: 3910}, + {87, 87, 47: 87, 472: 87, 474: 87, 480: 87, 87, 488: 87, 87, 657: 3934, 942: 3933}, + {781: 3916, 787: 3918, 792: 3919, 3917, 1046: 3915, 1208: 3914}, {98, 98, 15: 98, 48: 98, 50: 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 472: 98, 98, 499: 98, 544: 98, 652: 98, 781: 98, 787: 98, 792: 98, 98}, {97, 97, 15: 97, 48: 97, 50: 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 472: 97, 97, 499: 97, 544: 97, 652: 97, 781: 97, 787: 97, 792: 97, 97}, // 1405 - {99, 99, 47: 99, 472: 99, 99, 99, 480: 99, 99, 488: 99, 99, 491: 99, 504: 99, 657: 99, 781: 3915, 787: 3917, 792: 3918, 3916, 1046: 3931}, + {99, 99, 47: 99, 472: 99, 99, 99, 480: 99, 99, 488: 99, 99, 491: 99, 504: 99, 657: 99, 781: 3916, 787: 3918, 792: 3919, 3917, 1046: 3932}, {95, 95, 47: 95, 472: 95, 95, 95, 480: 95, 95, 488: 95, 95, 491: 95, 504: 95, 657: 95, 781: 95, 787: 95, 792: 95, 95}, - {659: 3929}, - {787: 3926}, - {659: 3924}, + {659: 3930}, + {787: 3927}, + {659: 3925}, // 1410 - {659: 3919}, - {475: 3921, 577: 3922, 580: 3923, 851: 3920}, + {659: 3920}, + {475: 3922, 577: 3923, 580: 3924, 851: 3921}, {91, 91, 47: 91, 472: 91, 91, 91, 480: 91, 91, 488: 91, 91, 491: 91, 504: 91, 657: 91, 781: 91, 787: 91, 792: 91, 91}, {90, 90, 47: 90, 472: 90, 90, 90, 480: 90, 90, 488: 90, 90, 491: 90, 504: 90, 657: 90, 781: 90, 787: 90, 792: 90, 90}, {89, 89, 47: 89, 472: 89, 89, 89, 480: 89, 89, 488: 89, 89, 491: 89, 504: 89, 657: 89, 781: 89, 787: 89, 792: 89, 89}, // 1415 {88, 88, 47: 88, 472: 88, 88, 88, 480: 88, 88, 488: 88, 88, 491: 88, 504: 88, 657: 88, 781: 88, 787: 88, 792: 88, 88}, - {475: 3921, 577: 3922, 580: 3923, 851: 3925}, + {475: 3922, 577: 3923, 580: 3924, 851: 3926}, {92, 92, 47: 92, 472: 92, 92, 92, 480: 92, 92, 488: 92, 92, 491: 92, 504: 92, 657: 92, 781: 92, 787: 92, 792: 92, 92}, - {659: 3927}, - {475: 3921, 577: 3922, 580: 3923, 851: 3928}, + {659: 3928}, + {475: 3922, 577: 3923, 580: 3924, 851: 3929}, // 1420 {93, 93, 47: 93, 472: 93, 93, 93, 480: 93, 93, 488: 93, 93, 491: 93, 504: 93, 657: 93, 781: 93, 787: 93, 792: 93, 93}, - {475: 3921, 577: 3922, 580: 3923, 851: 3930}, + {475: 3922, 577: 3923, 580: 3924, 851: 3931}, {94, 94, 47: 94, 472: 94, 94, 94, 480: 94, 94, 488: 94, 94, 491: 94, 504: 94, 657: 94, 781: 94, 787: 94, 792: 94, 94}, {96, 96, 47: 96, 472: 96, 96, 96, 480: 96, 96, 488: 96, 96, 491: 96, 504: 96, 657: 96, 781: 96, 787: 96, 792: 96, 96}, {836, 836, 47: 836, 472: 836, 474: 836, 480: 836, 836, 488: 836, 836}, // 1425 - {85, 85, 47: 85, 472: 85, 85, 85, 480: 85, 85, 488: 85, 85, 491: 85, 504: 85, 781: 85, 1298: 3934, 3935}, - {83, 83, 47: 83, 472: 83, 83, 83, 480: 83, 83, 488: 83, 83, 491: 83, 504: 83, 781: 3939, 1238: 3938}, - {659: 3936}, - {475: 3921, 577: 3922, 580: 3923, 851: 3937}, + {85, 85, 47: 85, 472: 85, 85, 85, 480: 85, 85, 488: 85, 85, 491: 85, 504: 85, 781: 85, 1298: 3935, 3936}, + {83, 83, 47: 83, 472: 83, 83, 83, 480: 83, 83, 488: 83, 83, 491: 83, 504: 83, 781: 3940, 1238: 3939}, + {659: 3937}, + {475: 3922, 577: 3923, 580: 3924, 851: 3938}, {84, 84, 47: 84, 472: 84, 84, 84, 480: 84, 84, 488: 84, 84, 491: 84, 504: 84, 781: 84}, // 1430 {86, 86, 47: 86, 472: 86, 86, 86, 480: 86, 86, 488: 86, 86, 491: 86, 504: 86}, - {659: 3940}, - {475: 3921, 577: 3922, 580: 3923, 851: 3941}, + {659: 3941}, + {475: 3922, 577: 3923, 580: 3924, 851: 3942}, {82, 82, 47: 82, 472: 82, 82, 82, 480: 82, 82, 488: 82, 82, 491: 82, 504: 82}, {832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 480: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 491: 832, 493: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 509: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 544: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 569: 832, 585: 832, 645: 832, 653: 832, 738: 832}, // 1435 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3944}, - {7: 1912, 47: 3945, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3945}, + {7: 1912, 47: 3946, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 474: 1248, 1248, 1248, 1248, 1248, 480: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 491: 1248, 493: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 502: 1248, 1248, 1248, 1248, 509: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 544: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 585: 1248}, {1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 474: 1249, 1249, 1249, 1249, 1249, 480: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 491: 1249, 493: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 502: 1249, 1249, 1249, 1249, 509: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 544: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 585: 1249}, - {1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 474: 1251, 1251, 1251, 1251, 1251, 480: 1251, 1251, 3318, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 491: 1251, 493: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 502: 1251, 1251, 1251, 1251, 509: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 544: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 585: 1251}, + {1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 474: 1251, 1251, 1251, 1251, 1251, 480: 1251, 1251, 3319, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 491: 1251, 493: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 502: 1251, 1251, 1251, 1251, 509: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 544: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 585: 1251}, // 1440 - {1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 474: 1253, 1253, 1253, 1253, 1253, 480: 1253, 1253, 3318, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 491: 1253, 493: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 502: 1253, 1253, 1253, 1253, 509: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 544: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 585: 1253}, - {1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 474: 1254, 1254, 1254, 1254, 1254, 480: 1254, 1254, 3318, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 491: 1254, 493: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 502: 1254, 1254, 1254, 1254, 509: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 544: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 585: 1254}, - {1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 474: 1255, 1255, 1255, 1255, 1255, 480: 1255, 1255, 3318, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 491: 1255, 493: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 502: 1255, 1255, 1255, 1255, 509: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 544: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255}, - {1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 474: 1256, 1256, 1256, 1256, 1256, 480: 1256, 1256, 3318, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 491: 1256, 493: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 502: 1256, 1256, 1256, 1256, 509: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 544: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 585: 1256}, - {475: 3955}, + {1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 474: 1253, 1253, 1253, 1253, 1253, 480: 1253, 1253, 3319, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 491: 1253, 493: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 502: 1253, 1253, 1253, 1253, 509: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 544: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 585: 1253}, + {1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 474: 1254, 1254, 1254, 1254, 1254, 480: 1254, 1254, 3319, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 491: 1254, 493: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 502: 1254, 1254, 1254, 1254, 509: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 544: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 585: 1254}, + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 474: 1255, 1255, 1255, 1255, 1255, 480: 1255, 1255, 3319, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 491: 1255, 493: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 502: 1255, 1255, 1255, 1255, 509: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 544: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 585: 1255}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 474: 1256, 1256, 1256, 1256, 1256, 480: 1256, 1256, 3319, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 491: 1256, 493: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 502: 1256, 1256, 1256, 1256, 509: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 544: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 585: 1256}, + {475: 3956}, // 1445 - {475: 3954}, + {475: 3955}, {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 474: 1236, 1236, 1236, 1236, 1236, 480: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 491: 1236, 493: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 502: 1236, 1236, 1236, 1236, 509: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 544: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 585: 1236}, {1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 474: 1237, 1237, 1237, 1237, 1237, 480: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 491: 1237, 493: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 502: 1237, 1237, 1237, 1237, 509: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 544: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 585: 1237}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3957, 2731, 2732, 2730}, - {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 3958, 1268, 1268, 1268, 1268, 1268, 480: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 491: 1268, 493: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 502: 1268, 1268, 1268, 1268, 509: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 544: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 585: 1268, 651: 3753, 654: 1268, 1268}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3958, 2732, 2733, 2731}, + {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 3959, 1268, 1268, 1268, 1268, 1268, 480: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 491: 1268, 493: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 502: 1268, 1268, 1268, 1268, 509: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 544: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 585: 1268, 651: 3754, 654: 1268, 1268}, // 1450 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 3959}, - {47: 3960}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 3960}, + {47: 3961}, {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 474: 1104, 1104, 1104, 1104, 1104, 480: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 491: 1104, 493: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 502: 1104, 1104, 1104, 1104, 509: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 544: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 585: 1104}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 3962}, - {485: 3675}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 3963}, + {485: 3676}, // 1455 {1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 474: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 502: 1307, 1307, 1307, 1307, 509: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 544: 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 573: 1307, 582: 1307, 585: 1307, 1307, 638: 1307, 642: 1307, 1307, 1307}, {1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 474: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 502: 1304, 1304, 1304, 1304, 509: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 544: 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 1304, 573: 1304, 582: 1304, 585: 1304, 1304, 638: 1304, 642: 1304, 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, 474: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 502: 1303, 1303, 1303, 1303, 509: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 544: 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 1303, 573: 1303, 582: 1303, 585: 1303, 1303, 638: 1303, 642: 1303, 1303, 1303}, {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 474: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 502: 1301, 1301, 1301, 1301, 509: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 544: 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 573: 1301, 582: 1301, 585: 1301, 1301, 638: 1301, 642: 1301, 1301, 1301}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3969, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3968}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3970, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3969}, // 1460 - {47: 3973, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3970}, - {47: 3971, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3972}, + {47: 3974, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3971}, + {47: 3972, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3973}, {1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 474: 1112, 1112, 1112, 1112, 1112, 480: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 491: 1112, 493: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 502: 1112, 1112, 1112, 1112, 509: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 544: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 585: 1112}, // 1465 - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3974}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3975}, {1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 474: 1113, 1113, 1113, 1113, 1113, 480: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 491: 1113, 493: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 502: 1113, 1113, 1113, 1113, 509: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 544: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 585: 1113}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3977, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3976}, - {7: 3987, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3978}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3978, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3977}, + {7: 3988, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3979}, // 1470 - {7: 3979, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3981, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3980}, - {47: 3985, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3982}, - {47: 3983, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {7: 3980, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3982, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3981}, + {47: 3986, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3983}, + {47: 3984, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1475 - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3984}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3985}, {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 474: 1108, 1108, 1108, 1108, 1108, 480: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 491: 1108, 493: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 502: 1108, 1108, 1108, 1108, 509: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 544: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 585: 1108}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3986}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3987}, {1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 474: 1110, 1110, 1110, 1110, 1110, 480: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 491: 1110, 493: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 502: 1110, 1110, 1110, 1110, 509: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 544: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 585: 1110}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 650: 3989, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3988}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 650: 3990, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3989}, // 1480 - {47: 3993, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3990}, - {47: 3991, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3992}, + {47: 3994, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3991}, + {47: 3992, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3993}, {1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 474: 1109, 1109, 1109, 1109, 1109, 480: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 491: 1109, 493: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 502: 1109, 1109, 1109, 1109, 509: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 544: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 585: 1109}, // 1485 - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 3994}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 3995}, {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 474: 1111, 1111, 1111, 1111, 1111, 480: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 491: 1111, 493: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 502: 1111, 1111, 1111, 1111, 509: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 544: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 585: 1111}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 802: 3996}, - {7: 3997}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3998}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 802: 3997}, + {7: 3998}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3999}, // 1490 - {7: 3999, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4000}, - {47: 4001, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {7: 4000, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4001}, + {47: 4002, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 474: 1158, 1158, 1158, 1158, 1158, 480: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 491: 1158, 493: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 502: 1158, 1158, 1158, 1158, 509: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 544: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 585: 1158}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 802: 4003}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 802: 4004}, // 1495 - {7: 4004}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4005}, - {7: 4006, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4007}, - {47: 4008, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {7: 4005}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4006}, + {7: 4007, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4008}, + {47: 4009, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1500 {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 474: 1159, 1159, 1159, 1159, 1159, 480: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 491: 1159, 493: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 502: 1159, 1159, 1159, 1159, 509: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 544: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 585: 1159}, - {173: 4012, 4011, 193: 4013, 218: 4014, 1218: 4010}, - {7: 4015}, + {173: 4013, 4012, 193: 4014, 218: 4015, 1218: 4011}, + {7: 4016}, {7: 1148}, {7: 1147}, // 1505 {7: 1146}, {7: 1145}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4016}, - {47: 4017, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4017}, + {47: 4018, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 474: 1165, 1165, 1165, 1165, 1165, 480: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 491: 1165, 493: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 502: 1165, 1165, 1165, 1165, 509: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 544: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 585: 1165}, // 1510 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4019}, - {7: 4020}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 4022}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4020}, + {7: 4021}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 4023}, {1964, 1964, 4: 1964, 1964, 1964, 1964, 13: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 70: 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 1964, 104: 1964, 126: 1964, 1964, 1964, 1964, 479: 1964, 1964, 482: 1964, 493: 1964, 497: 1964, 500: 1964, 503: 1964, 506: 1964, 646: 1964, 648: 1964, 656: 1964}, - {47: 4028}, + {47: 4029}, // 1515 {29, 29, 4: 29, 29, 29, 13: 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, 47: 29, 70: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 479: 29, 29, 482: 29, 503: 29, 506: 29, 646: 29, 648: 29, 656: 29}, - {508: 2705, 732: 4021, 763: 4027}, - {508: 2705, 732: 4026}, + {508: 2706, 732: 4022, 763: 4028}, + {508: 2706, 732: 4027}, {27, 27, 4: 27, 27, 27, 13: 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, 47: 27, 70: 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 479: 27, 27, 482: 27, 503: 27, 506: 27, 646: 27, 648: 27, 656: 27}, {28, 28, 4: 28, 28, 28, 13: 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, 47: 28, 70: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 479: 28, 28, 482: 28, 503: 28, 506: 28, 646: 28, 648: 28, 656: 28}, // 1520 {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 474: 1136, 1136, 1136, 1136, 1136, 480: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 491: 1136, 493: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 502: 1136, 1136, 1136, 1136, 509: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 544: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 585: 1136}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4030}, - {47: 4031}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4031}, + {47: 4032}, {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 474: 1137, 1137, 1137, 1137, 1137, 480: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 491: 1137, 493: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 502: 1137, 1137, 1137, 1137, 509: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 544: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 585: 1137}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4033}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4034}, // 1525 - {47: 4034, 478: 4035, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {47: 4035, 478: 4036, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 474: 1153, 1153, 1153, 1153, 1153, 480: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 491: 1153, 493: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 502: 1153, 1153, 1153, 1153, 509: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 544: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 585: 1153}, - {506: 3779, 543: 4037, 646: 3778, 899: 4036}, - {473: 3794, 762: 4040}, - {473: 3794, 762: 4038}, + {506: 3780, 543: 4038, 646: 3779, 899: 4037}, + {473: 3795, 762: 4041}, + {473: 3795, 762: 4039}, // 1530 - {47: 4039}, + {47: 4040}, {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 474: 1151, 1151, 1151, 1151, 1151, 480: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 491: 1151, 493: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 502: 1151, 1151, 1151, 1151, 509: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 544: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 585: 1151}, - {47: 4041}, + {47: 4042}, {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 474: 1152, 1152, 1152, 1152, 1152, 480: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 491: 1152, 493: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 502: 1152, 1152, 1152, 1152, 509: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 544: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 585: 1152}, {1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 474: 1175, 1175, 1175, 1175, 1175, 480: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 491: 1175, 493: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 502: 1175, 1175, 1175, 1175, 509: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 544: 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 585: 1175}, // 1535 {1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 474: 1176, 1176, 1176, 1176, 1176, 480: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 491: 1176, 493: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 502: 1176, 1176, 1176, 1176, 509: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 544: 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 585: 1176}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 4045}, - {47: 4046}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 4046}, + {47: 4047}, {1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 474: 1172, 1172, 1172, 1172, 1172, 480: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 491: 1172, 493: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 502: 1172, 1172, 1172, 1172, 509: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 544: 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 585: 1172}, {1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 474: 1177, 1177, 1177, 1177, 1177, 480: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 491: 1177, 493: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 502: 1177, 1177, 1177, 1177, 509: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 544: 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 585: 1177}, // 1540 - {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3514, 744: 3512, 3513, 783: 3515, 786: 3516, 813: 4049, 815: 3517}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4050}, - {47: 4051, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3330, 746: 3522, 764: 4052}, + {2: 1231, 1231, 1231, 1231, 1231, 8: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 48: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 473: 1231, 475: 1231, 1231, 1231, 479: 1231, 483: 1231, 1231, 1231, 1231, 1231, 492: 1231, 501: 1231, 506: 1231, 1231, 1231, 543: 1231, 566: 1231, 1231, 1231, 570: 1231, 1231, 1231, 574: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 583: 1231, 1231, 587: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 639: 1231, 1231, 1231, 647: 1231, 650: 3515, 744: 3513, 3514, 783: 3516, 786: 3517, 813: 4050, 815: 3518}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4051}, + {47: 4052, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 474: 950, 950, 950, 950, 950, 480: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 491: 950, 493: 950, 950, 950, 950, 950, 950, 950, 950, 502: 950, 950, 950, 950, 509: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 544: 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, 585: 950, 740: 3331, 746: 3523, 764: 4053}, {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 474: 1134, 1134, 1134, 1134, 1134, 480: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 491: 1134, 493: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 502: 1134, 1134, 1134, 1134, 509: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 544: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 585: 1134}, // 1545 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 4054}, - {47: 4055}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 4055}, + {47: 4056}, {1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 474: 1105, 1105, 1105, 1105, 1105, 480: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 491: 1105, 493: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 502: 1105, 1105, 1105, 1105, 509: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 544: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 585: 1105}, {147: 2291, 170: 2291, 188: 2291, 492: 2291, 518: 2291, 544: 2291, 555: 2291, 564: 2291, 2291, 571: 2291, 2291, 584: 2291}, {147: 2290, 170: 2290, 188: 2290, 492: 2290, 518: 2290, 544: 2290, 555: 2290, 564: 2290, 2290, 571: 2290, 2290, 584: 2290}, // 1550 {2: 1891, 1891, 1891, 1891, 1891, 8: 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 48: 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 473: 1891, 475: 1891, 1891, 479: 1891, 483: 1891, 1891, 1891, 1891, 1891, 492: 1891, 501: 1891, 506: 1891, 1891, 1891, 543: 1891, 566: 1891, 1891, 1891, 570: 1891, 1891, 1891, 574: 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 583: 1891, 1891, 587: 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 639: 1891, 1891, 1891}, - {518: 4083, 544: 4082, 555: 4081, 564: 4067, 4068, 1109: 4084}, + {518: 4084, 544: 4083, 555: 4082, 564: 4068, 4069, 1109: 4085}, {473: 1887}, {2: 1885, 1885, 1885, 1885, 1885, 8: 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 48: 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 473: 1885, 475: 1885, 1885, 479: 1885, 483: 1885, 1885, 1885, 1885, 1885, 492: 1885, 501: 1885, 506: 1885, 1885, 1885, 543: 1885, 566: 1885, 1885, 1885, 570: 1885, 1885, 1885, 574: 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 583: 1885, 1885, 587: 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 639: 1885, 1885, 1885}, {2: 1883, 1883, 1883, 1883, 1883, 8: 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 48: 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 473: 1883, 475: 1883, 1883, 479: 1883, 483: 1883, 1883, 1883, 1883, 1883, 492: 1883, 501: 1883, 506: 1883, 1883, 1883, 543: 1883, 566: 1883, 1883, 1883, 570: 1883, 1883, 1883, 574: 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 583: 1883, 1883, 587: 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 639: 1883, 1883, 1883}, // 1555 - {473: 4077, 708: 4078}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 4074}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 4070, 3222, 3302, 3221, 3218}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 4069, 3222, 3302, 3221, 3218}, + {473: 4078, 708: 4079}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 4075}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 4071, 3223, 3303, 3222, 3219}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 4070, 3223, 3303, 3222, 3219}, {2: 1872, 1872, 1872, 1872, 1872, 8: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 48: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 473: 1872, 475: 1872, 1872, 479: 1872, 483: 1872, 1872, 1872, 1872, 1872, 492: 1872, 501: 1872, 506: 1872, 1872, 1872, 543: 1872, 566: 1872, 1872, 1872, 570: 1872, 1872, 1872, 574: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 583: 1872, 1872, 587: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 639: 1872, 1872, 1872}, // 1560 {2: 1871, 1871, 1871, 1871, 1871, 8: 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 48: 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 473: 1871, 475: 1871, 1871, 479: 1871, 483: 1871, 1871, 1871, 1871, 1871, 492: 1871, 501: 1871, 506: 1871, 1871, 1871, 543: 1871, 566: 1871, 1871, 1871, 570: 1871, 1871, 1871, 574: 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 583: 1871, 1871, 587: 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 639: 1871, 1871, 1871}, - {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 474: 1874, 1874, 478: 1874, 480: 1874, 1874, 3318, 1874, 1874, 488: 1874, 1874, 491: 1874, 493: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 502: 1874, 1874, 1874, 1874, 509: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 519: 1874, 1874, 1874, 1874, 524: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 545: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 585: 3319}, - {1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 4072, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 474: 1870, 1870, 478: 1870, 480: 1870, 1870, 3318, 1870, 1870, 488: 1870, 1870, 491: 1870, 493: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 502: 1870, 1870, 1870, 1870, 509: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 519: 1870, 1870, 1870, 1870, 524: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 545: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 585: 3319, 1235: 4071}, + {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 474: 1874, 1874, 478: 1874, 480: 1874, 1874, 3319, 1874, 1874, 488: 1874, 1874, 491: 1874, 493: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 502: 1874, 1874, 1874, 1874, 509: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 519: 1874, 1874, 1874, 1874, 524: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 545: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 585: 3320}, + {1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 4073, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 474: 1870, 1870, 478: 1870, 480: 1870, 1870, 3319, 1870, 1870, 488: 1870, 1870, 491: 1870, 493: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 502: 1870, 1870, 1870, 1870, 509: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 519: 1870, 1870, 1870, 1870, 524: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 545: 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 1870, 585: 3320, 1235: 4072}, {1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 474: 1875, 1875, 478: 1875, 480: 1875, 1875, 483: 1875, 1875, 488: 1875, 1875, 491: 1875, 493: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 502: 1875, 1875, 1875, 1875, 509: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 519: 1875, 1875, 1875, 1875, 524: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 545: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875}, - {475: 4073}, + {475: 4074}, // 1565 {1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 474: 1869, 1869, 478: 1869, 480: 1869, 1869, 483: 1869, 1869, 488: 1869, 1869, 491: 1869, 493: 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 502: 1869, 1869, 1869, 1869, 509: 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 519: 1869, 1869, 1869, 1869, 524: 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 545: 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869, 1869}, - {485: 3654, 3655, 3660, 505: 4075, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 4076}, + {485: 3655, 3656, 3661, 505: 4076, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 4077}, {1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 474: 1876, 1876, 478: 1876, 480: 1876, 1876, 483: 1876, 1876, 488: 1876, 1876, 491: 1876, 493: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 502: 1876, 1876, 1876, 1876, 509: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 519: 1876, 1876, 1876, 1876, 524: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 545: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 2558, 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3847, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 2556, 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 645: 2552, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3846, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 747: 3849, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 3851, 3850, 777: 4079}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 2559, 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3848, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 2557, 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 645: 2553, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3847, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 747: 3850, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 3852, 3851, 777: 4080}, // 1570 {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 474: 1877, 1877, 478: 1877, 480: 1877, 1877, 483: 1877, 1877, 488: 1877, 1877, 491: 1877, 493: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 502: 1877, 1877, 1877, 1877, 509: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 519: 1877, 1877, 1877, 1877, 524: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 545: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877}, - {7: 3558, 47: 4080}, + {7: 3559, 47: 4081}, {1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 474: 1878, 1878, 478: 1878, 480: 1878, 1878, 483: 1878, 1878, 488: 1878, 1878, 491: 1878, 493: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 502: 1878, 1878, 1878, 1878, 509: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 519: 1878, 1878, 1878, 1878, 524: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 545: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878}, {2: 1890, 1890, 1890, 1890, 1890, 8: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 48: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 473: 1890, 475: 1890, 1890, 479: 1890, 483: 1890, 1890, 1890, 1890, 1890, 492: 1890, 501: 1890, 506: 1890, 1890, 1890, 543: 1890, 566: 1890, 1890, 1890, 570: 1890, 1890, 1890, 574: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 583: 1890, 1890, 587: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 639: 1890, 1890, 1890}, {473: 1886}, // 1575 {2: 1884, 1884, 1884, 1884, 1884, 8: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 48: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 473: 1884, 475: 1884, 1884, 479: 1884, 483: 1884, 1884, 1884, 1884, 1884, 492: 1884, 501: 1884, 506: 1884, 1884, 1884, 543: 1884, 566: 1884, 1884, 1884, 570: 1884, 1884, 1884, 574: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 583: 1884, 1884, 587: 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 1884, 639: 1884, 1884, 1884}, {2: 1882, 1882, 1882, 1882, 1882, 8: 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 48: 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 473: 1882, 475: 1882, 1882, 479: 1882, 483: 1882, 1882, 1882, 1882, 1882, 492: 1882, 501: 1882, 506: 1882, 1882, 1882, 543: 1882, 566: 1882, 1882, 1882, 570: 1882, 1882, 1882, 574: 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 583: 1882, 1882, 587: 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 1882, 639: 1882, 1882, 1882}, - {170: 4108, 492: 4109, 571: 4107, 4106}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 4100, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 4101, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 4099, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 650: 4102, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 4097, 1170: 4098}, + {170: 4109, 492: 4110, 571: 4108, 4107}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 4101, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 4102, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 4100, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 650: 4103, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 4098, 1170: 4099}, {2: 1899, 1899, 1899, 1899, 1899, 8: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 48: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 473: 1899, 475: 1899, 1899, 479: 1899, 483: 1899, 1899, 1899, 1899, 1899, 492: 1899, 501: 1899, 506: 1899, 1899, 1899, 543: 1899, 566: 1899, 1899, 1899, 570: 1899, 1899, 1899, 574: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 583: 1899, 1899, 587: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 639: 1899, 1899, 1899, 650: 1899}, // 1580 {2: 1898, 1898, 1898, 1898, 1898, 8: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 48: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 473: 1898, 475: 1898, 1898, 479: 1898, 483: 1898, 1898, 1898, 1898, 1898, 492: 1898, 501: 1898, 506: 1898, 1898, 1898, 543: 1898, 566: 1898, 1898, 1898, 570: 1898, 1898, 1898, 574: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 583: 1898, 1898, 587: 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 1898, 639: 1898, 1898, 1898, 650: 1898}, @@ -8018,17 +8019,17 @@ var ( // 1585 {2: 1893, 1893, 1893, 1893, 1893, 8: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 48: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 473: 1893, 475: 1893, 1893, 479: 1893, 483: 1893, 1893, 1893, 1893, 1893, 492: 1893, 501: 1893, 506: 1893, 1893, 1893, 543: 1893, 566: 1893, 1893, 1893, 570: 1893, 1893, 1893, 574: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 583: 1893, 1893, 587: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 639: 1893, 1893, 1893, 650: 1893}, {2: 1892, 1892, 1892, 1892, 1892, 8: 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 48: 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 473: 1892, 475: 1892, 1892, 479: 1892, 483: 1892, 1892, 1892, 1892, 1892, 492: 1892, 501: 1892, 506: 1892, 1892, 1892, 543: 1892, 566: 1892, 1892, 1892, 570: 1892, 1892, 1892, 574: 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 583: 1892, 1892, 587: 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 639: 1892, 1892, 1892, 650: 1892}, - {170: 1889, 476: 4057, 4056, 492: 1889, 571: 1889, 1889, 809: 4096}, + {170: 1889, 476: 4058, 4057, 492: 1889, 571: 1889, 1889, 809: 4097}, {170: 1888, 492: 1888, 571: 1888, 1888}, {1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 474: 1903, 1903, 478: 1903, 480: 1903, 1903, 483: 1903, 1903, 488: 1903, 1903, 491: 1903, 493: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 502: 1903, 1903, 1903, 1903, 509: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 519: 1903, 1903, 1903, 1903, 524: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 545: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903}, // 1590 - {473: 2559, 708: 4105}, - {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 474: 739, 739, 739, 739, 739, 480: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 491: 739, 493: 739, 739, 739, 739, 739, 739, 739, 739, 502: 739, 739, 739, 739, 509: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 544: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 585: 739, 658: 4103}, + {473: 2560, 708: 4106}, + {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 474: 739, 739, 739, 739, 739, 480: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 491: 739, 493: 739, 739, 739, 739, 739, 739, 739, 739, 502: 739, 739, 739, 739, 509: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 544: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 585: 739, 658: 4104}, {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1881, 1704, 1704, 1704, 1704, 1704, 480: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 491: 1704, 493: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 502: 1704, 1704, 1704, 1704, 509: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 544: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 585: 1704, 651: 1704, 654: 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, 1880, 1703, 1703, 1703, 1703, 1703, 480: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 491: 1703, 493: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 502: 1703, 1703, 1703, 1703, 509: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 544: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 585: 1703, 651: 1703, 654: 1703, 1703}, {473: 1879}, // 1595 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 4104}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 4105}, {1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 474: 1901, 1901, 478: 1901, 480: 1901, 1901, 483: 1901, 1901, 488: 1901, 1901, 491: 1901, 493: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 502: 1901, 1901, 1901, 1901, 509: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 519: 1901, 1901, 1901, 1901, 524: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 545: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901}, {1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 474: 1902, 1902, 478: 1902, 480: 1902, 1902, 483: 1902, 1902, 488: 1902, 1902, 491: 1902, 493: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 502: 1902, 1902, 1902, 1902, 509: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 519: 1902, 1902, 1902, 1902, 524: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 545: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902}, {1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 474: 1928, 1928, 478: 1928, 480: 1928, 1928, 483: 1928, 1928, 488: 1928, 1928, 491: 1928, 493: 1928, 1928, 1928, 1928, 1928, 499: 1928, 1928, 502: 1928, 1928, 1928, 1928, 509: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 519: 1928, 1928, 1928, 1928, 524: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 545: 1928, 1928}, @@ -8036,171 +8037,171 @@ var ( // 1600 {1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 474: 1926, 1926, 478: 1926, 480: 1926, 1926, 483: 1926, 1926, 488: 1926, 1926, 491: 1926, 493: 1926, 1926, 1926, 1926, 1926, 499: 1926, 1926, 502: 1926, 1926, 1926, 1926, 509: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 519: 1926, 1926, 1926, 1926, 524: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 545: 1926, 1926}, {1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 474: 1904, 1904, 478: 1904, 480: 1904, 1904, 483: 1904, 1904, 488: 1904, 1904, 491: 1904, 493: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 502: 1904, 1904, 1904, 1904, 509: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 519: 1904, 1904, 1904, 1904, 524: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 545: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 4113}, - {2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 473: 2314, 490: 2314, 493: 2314, 498: 2314, 504: 2314, 506: 2314, 529: 2314, 2314, 543: 2314, 646: 2314, 651: 4134, 668: 2314, 2314, 671: 2314, 676: 2314, 2314, 679: 2314, 2314, 2314, 2314, 2314, 2314, 687: 2314, 689: 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 704: 2314, 2314, 2314, 2314}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 4114}, + {2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 473: 2314, 490: 2314, 493: 2314, 498: 2314, 504: 2314, 506: 2314, 529: 2314, 2314, 543: 2314, 646: 2314, 651: 4135, 668: 2314, 2314, 671: 2314, 676: 2314, 2314, 679: 2314, 2314, 2314, 2314, 2314, 2314, 687: 2314, 689: 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314, 704: 2314, 2314, 2314, 2314}, {7: 2311, 47: 2311}, // 1605 - {7: 4114, 47: 4115}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4133}, - {305: 4116}, - {473: 4117}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 4118}, + {7: 4115, 47: 4116}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4134}, + {305: 4117}, + {473: 4118}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 4119}, // 1610 - {47: 1922, 474: 4121, 485: 3654, 3655, 3660, 523: 3656, 544: 4120, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653, 1216: 4119}, - {47: 4132}, - {225: 4125, 519: 4124}, - {137: 4122}, - {249: 4123}, + {47: 1922, 474: 4122, 485: 3655, 3656, 3661, 523: 3657, 544: 4121, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654, 1216: 4120}, + {47: 4133}, + {225: 4126, 519: 4125}, + {137: 4123}, + {249: 4124}, // 1615 {47: 1918}, - {350: 4127}, - {181: 4126}, + {350: 4128}, + {181: 4127}, {47: 1919}, - {181: 4128}, + {181: 4129}, // 1620 - {47: 1921, 474: 4129}, - {137: 4130}, - {249: 4131}, + {47: 1921, 474: 4130}, + {137: 4131}, + {249: 4132}, {47: 1920}, {1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 474: 1929, 1929, 478: 1929, 480: 1929, 1929, 483: 1929, 1929, 488: 1929, 1929, 491: 1929, 493: 1929, 1929, 1929, 1929, 1929, 499: 1929, 1929, 502: 1929, 1929, 1929, 1929, 509: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 519: 1929, 1929, 1929, 1929, 524: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 545: 1929, 1929}, // 1625 {7: 2310, 47: 2310}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4135, 2731, 2732, 2730}, - {2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 473: 2313, 490: 2313, 493: 2313, 498: 2313, 504: 2313, 506: 2313, 529: 2313, 2313, 543: 2313, 646: 2313, 651: 4136, 668: 2313, 2313, 671: 2313, 676: 2313, 2313, 679: 2313, 2313, 2313, 2313, 2313, 2313, 687: 2313, 689: 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 704: 2313, 2313, 2313, 2313}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4137, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4136, 2732, 2733, 2731}, + {2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 473: 2313, 490: 2313, 493: 2313, 498: 2313, 504: 2313, 506: 2313, 529: 2313, 2313, 543: 2313, 646: 2313, 651: 4137, 668: 2313, 2313, 671: 2313, 676: 2313, 2313, 679: 2313, 2313, 2313, 2313, 2313, 2313, 687: 2313, 689: 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 2313, 704: 2313, 2313, 2313, 2313}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4138, 2732, 2733, 2731}, {2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 473: 2312, 490: 2312, 493: 2312, 498: 2312, 504: 2312, 506: 2312, 529: 2312, 2312, 543: 2312, 646: 2312, 668: 2312, 2312, 671: 2312, 676: 2312, 2312, 679: 2312, 2312, 2312, 2312, 2312, 2312, 687: 2312, 689: 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 2312, 704: 2312, 2312, 2312, 2312}, // 1630 - {1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 474: 1930, 1930, 478: 1930, 480: 1930, 1930, 483: 1930, 1930, 488: 1930, 1930, 491: 1930, 493: 1930, 1930, 1930, 1930, 1930, 499: 1930, 1930, 502: 1930, 1930, 1930, 1930, 509: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 519: 1930, 1930, 1930, 1930, 524: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 545: 1930, 1930, 733: 3309, 3307}, + {1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 474: 1930, 1930, 478: 1930, 480: 1930, 1930, 483: 1930, 1930, 488: 1930, 1930, 491: 1930, 493: 1930, 1930, 1930, 1930, 1930, 499: 1930, 1930, 502: 1930, 1930, 1930, 1930, 509: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 519: 1930, 1930, 1930, 1930, 524: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 545: 1930, 1930, 733: 3310, 3308}, {1293, 1293, 7: 1293, 47: 1293, 125: 1293, 472: 1293, 474: 1293, 480: 1293, 1293, 488: 1293, 1293, 493: 1293, 1293, 1293, 1293, 500: 1293, 502: 1293, 514: 1293, 516: 1293, 524: 1293, 527: 1293, 1293}, {1292, 1292, 7: 1292, 47: 1292, 125: 1292, 472: 1292, 474: 1292, 480: 1292, 1292, 488: 1292, 1292, 493: 1292, 1292, 1292, 1292, 500: 1292, 502: 1292, 514: 1292, 516: 1292, 524: 1292, 527: 1292, 1292}, {1291, 1291, 7: 1291, 47: 1291, 125: 1291, 472: 1291, 474: 1291, 480: 1291, 1291, 488: 1291, 1291, 493: 1291, 1291, 1291, 1291, 500: 1291, 502: 1291, 514: 1291, 516: 1291, 524: 1291, 527: 1291, 1291}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4143}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4144}, // 1635 - {1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 474: 1934, 1934, 478: 1934, 480: 1934, 1934, 483: 1934, 1934, 488: 1934, 1934, 491: 1934, 493: 1934, 1934, 1934, 1934, 1934, 499: 1934, 1934, 502: 1934, 1934, 1934, 3313, 509: 3311, 3312, 3310, 3308, 1934, 1934, 1934, 1934, 1934, 519: 1934, 1934, 1934, 1934, 524: 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 545: 1934, 1934, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4145}, - {47: 4146}, + {1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 474: 1934, 1934, 478: 1934, 480: 1934, 1934, 483: 1934, 1934, 488: 1934, 1934, 491: 1934, 493: 1934, 1934, 1934, 1934, 1934, 499: 1934, 1934, 502: 1934, 1934, 1934, 3314, 509: 3312, 3313, 3311, 3309, 1934, 1934, 1934, 1934, 1934, 519: 1934, 1934, 1934, 1934, 524: 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 545: 1934, 1934, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4146}, + {47: 4147}, {2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 474: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 502: 2213, 2213, 2213, 2213, 509: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 544: 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 573: 2213, 582: 2213, 585: 2213, 2213, 638: 2213, 642: 2213, 2213, 2213}, - {494: 4148}, + {494: 4149}, // 1640 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4149}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4150}, {2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 474: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 502: 2214, 2214, 2214, 2214, 509: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 544: 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 573: 2214, 582: 2214, 585: 2214, 2214, 638: 2214, 642: 2214, 2214, 2214}, - {246, 246, 47: 246, 472: 246, 474: 246, 480: 246, 246, 488: 246, 246, 493: 246, 246, 246, 246, 500: 246, 502: 246, 505: 3313, 509: 3311, 3312, 3310, 3308, 246, 246, 516: 246, 733: 3309, 3307}, + {246, 246, 47: 246, 472: 246, 474: 246, 480: 246, 246, 488: 246, 246, 493: 246, 246, 246, 246, 500: 246, 502: 246, 505: 3314, 509: 3312, 3313, 3311, 3309, 246, 246, 516: 246, 733: 3310, 3308}, {4, 4}, - {137: 4153}, + {137: 4154}, // 1645 - {245, 245, 493: 245, 497: 2691, 500: 245, 502: 245, 789: 2692, 4154}, - {1287, 1287, 493: 1287, 500: 1287, 502: 2694, 766: 2695, 810: 4155}, - {860, 860, 493: 2697, 500: 2698, 767: 2699, 828: 4156}, + {245, 245, 493: 245, 497: 2692, 500: 245, 502: 245, 789: 2693, 4155}, + {1287, 1287, 493: 1287, 500: 1287, 502: 2695, 766: 2696, 810: 4156}, + {860, 860, 493: 2698, 500: 2699, 767: 2700, 828: 4157}, {2, 2}, - {569: 4159}, + {569: 4160}, // 1650 {2: 1845, 1845, 1845, 1845, 1845, 8: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 48: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 473: 1845, 495: 1845, 499: 1845, 569: 1845, 579: 1845}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4160}, - {2388, 2388, 2388, 2388, 4206, 4208, 397, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 69: 4177, 72: 4198, 4199, 81: 4200, 132: 4180, 196: 4165, 4163, 4184, 201: 4185, 211: 4179, 219: 4195, 232: 4174, 241: 4181, 247: 4176, 264: 4186, 272: 4182, 279: 4196, 4197, 286: 4166, 474: 4194, 479: 4205, 4242, 482: 2156, 490: 2388, 496: 4201, 502: 4183, 4193, 4168, 506: 2156, 582: 4173, 587: 4169, 646: 2156, 648: 4211, 652: 4162, 660: 4188, 668: 4175, 670: 4202, 678: 4187, 685: 4189, 688: 4170, 703: 4178, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4244, 868: 4192, 881: 4190, 917: 4167, 924: 4171, 987: 4204, 1135: 4172, 1162: 4191, 1167: 4203, 4161}, - {2154, 2154, 4982, 4983, 490: 4984, 1097: 4981, 1166: 4980}, - {490: 4954}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4161}, + {2388, 2388, 2388, 2388, 4207, 4209, 397, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 69: 4178, 72: 4199, 4200, 81: 4201, 132: 4181, 196: 4166, 4164, 4185, 201: 4186, 211: 4180, 219: 4196, 232: 4175, 241: 4182, 247: 4177, 264: 4187, 272: 4183, 279: 4197, 4198, 286: 4167, 474: 4195, 479: 4206, 4243, 482: 2156, 490: 2388, 496: 4202, 502: 4184, 4194, 4169, 506: 2156, 582: 4174, 587: 4170, 646: 2156, 648: 4212, 652: 4163, 660: 4189, 668: 4176, 670: 4203, 678: 4188, 685: 4190, 688: 4171, 703: 4179, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4245, 868: 4193, 881: 4191, 917: 4168, 924: 4172, 987: 4205, 1135: 4173, 1162: 4192, 1167: 4204, 4162}, + {2154, 2154, 4983, 4984, 490: 4985, 1097: 4982, 1166: 4981}, + {490: 4955}, // 1655 - {217: 4952}, - {160: 4944}, - {475: 2037, 479: 2037, 498: 4246, 735: 4941}, - {475: 2037, 479: 2037, 498: 4246, 735: 4938}, - {2473, 2473, 2473, 2473, 4206, 4208, 397, 2473, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 479: 4205, 4242, 482: 2156, 490: 2473, 503: 4934, 506: 2156, 646: 2156, 648: 4211, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4935}, + {2504, 2504, 217: 4953}, + {160: 4945}, + {475: 2037, 479: 2037, 498: 4247, 735: 4942}, + {475: 2037, 479: 2037, 498: 4247, 735: 4939}, + {2473, 2473, 2473, 2473, 4207, 4209, 397, 2473, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 479: 4206, 4243, 482: 2156, 490: 2473, 503: 4935, 506: 2156, 646: 2156, 648: 4212, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4936}, // 1660 - {217: 4921}, - {649: 4913}, - {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 473: 2393, 490: 4772, 566: 2393, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4553, 648: 2382, 674: 2382, 2382, 831: 4774, 845: 4388, 871: 4770, 901: 4771, 912: 4773}, + {217: 4922}, + {649: 4914}, + {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 473: 2393, 490: 4773, 566: 2393, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4554, 648: 2382, 674: 2382, 2382, 831: 4775, 845: 4389, 871: 4771, 901: 4772, 912: 4774}, {2461, 2461, 2461, 2461, 7: 2461, 490: 2461}, {2460, 2460, 2460, 2460, 7: 2460, 490: 2460}, // 1665 - {490: 4768}, - {490: 4765}, - {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 490: 4744, 566: 2393, 573: 4374, 582: 4389, 586: 4743, 642: 4390, 648: 4375, 674: 4747, 827: 4746, 845: 4388, 871: 4742, 912: 4745, 999: 4748}, - {490: 4731}, - {490: 4729}, + {490: 4769}, + {490: 4766}, + {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 490: 4745, 566: 2393, 573: 4375, 582: 4390, 586: 4744, 642: 4391, 648: 4376, 674: 4748, 827: 4747, 845: 4389, 871: 4743, 912: 4746, 999: 4749}, + {490: 4732}, + {490: 4730}, // 1670 - {490: 4726}, - {490: 4723}, - {18: 4720, 490: 4719}, - {18: 4716, 490: 4715}, - {490: 4705}, + {490: 4727}, + {490: 4724}, + {18: 4721, 490: 4720}, + {18: 4717, 490: 4716}, + {490: 4706}, // 1675 - {659: 4698}, + {659: 4699}, + {941: 4698}, {941: 4697}, - {941: 4696}, - {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 566: 2393, 845: 4388, 871: 4692}, - {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 566: 2393, 845: 4388, 871: 4414}, + {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 566: 2393, 845: 4389, 871: 4693}, + {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 566: 2393, 845: 4389, 871: 4415}, // 1680 - {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 582: 4389, 642: 4390, 648: 4387, 845: 4388, 871: 4385, 999: 4386}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 478: 4372, 498: 4246, 573: 4374, 648: 4375, 4370, 735: 4371, 827: 4373, 845: 4369}, + {2: 2393, 2393, 2393, 2393, 2393, 8: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 48: 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 2393, 582: 4390, 642: 4391, 648: 4388, 845: 4389, 871: 4386, 999: 4387}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 478: 4373, 498: 4247, 573: 4375, 648: 4376, 4371, 735: 4372, 827: 4374, 845: 4370}, {2429, 2429, 2429, 2429, 7: 2429, 490: 2429}, {2428, 2428, 2428, 2428, 7: 2428, 490: 2428}, {2427, 2427, 2427, 2427, 7: 2427, 490: 2427}, // 1685 {2426, 2426, 2426, 2426, 6: 396, 2426, 27: 396, 490: 2426}, + {194: 4369}, {194: 4368}, - {194: 4367}, {2423, 2423, 2423, 2423, 7: 2423, 490: 2423}, {2422, 2422, 2422, 2422, 7: 2422, 490: 2422}, // 1690 {2418, 2418, 2418, 2418, 7: 2418, 490: 2418}, {2417, 2417, 2417, 2417, 7: 2417, 490: 2417}, - {149: 2037, 235: 2037, 256: 2037, 258: 2037, 479: 2037, 498: 4246, 735: 4361}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 479: 2037, 498: 4246, 735: 4358}, - {151: 4357, 686: 4356}, + {149: 2037, 235: 2037, 256: 2037, 258: 2037, 479: 2037, 498: 4247, 735: 4362}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 479: 2037, 498: 4247, 735: 4359}, + {151: 4358, 686: 4357}, // 1695 - {2387, 2387, 2387, 2387, 7: 4354, 490: 2387}, + {2387, 2387, 2387, 2387, 7: 4355, 490: 2387}, {2386, 2386, 2386, 2386, 7: 2386, 490: 2386}, {14: 2155, 16: 2155, 19: 2155, 482: 2155, 506: 2155, 646: 2155}, - {475: 2037, 498: 4246, 735: 4352}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 735: 4350}, + {475: 2037, 498: 4247, 735: 4353}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 735: 4351}, // 1700 - {20: 4345, 180: 4346, 242: 4347}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 735: 4343}, - {240: 4340}, - {240: 4337}, - {498: 4246, 508: 2037, 735: 4335}, + {20: 4346, 180: 4347, 242: 4348}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 735: 4344}, + {240: 4341}, + {240: 4338}, + {498: 4247, 508: 2037, 735: 4336}, // 1705 - {498: 4246, 508: 2037, 735: 4333}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 498: 4246, 735: 4331}, - {498: 4246, 508: 2037, 735: 4329}, + {498: 4247, 508: 2037, 735: 4334}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 498: 4247, 735: 4332}, + {498: 4247, 508: 2037, 735: 4330}, {2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 13: 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 47: 2110, 472: 2110, 2110, 2110, 478: 2110, 2110, 2110, 482: 2110, 490: 2110, 2110, 501: 2110, 503: 2110, 506: 2110, 2110, 569: 2110, 645: 2110, 2110, 648: 2110}, {431, 431, 431, 431, 431, 431, 431, 431, 13: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 472: 431, 431, 431, 478: 431, 431, 431, 482: 431, 490: 431, 431, 501: 431, 503: 431, 506: 431, 431, 569: 431, 645: 431, 431, 648: 431}, // 1710 - {14: 3804, 482: 4324, 506: 3805, 646: 3803, 772: 4323}, - {6: 4317, 27: 4318}, - {498: 4246, 508: 2037, 735: 4315}, - {498: 4246, 508: 2037, 735: 4313}, - {475: 2037, 498: 4246, 735: 4311}, + {14: 3805, 482: 4325, 506: 3806, 646: 3804, 772: 4324}, + {6: 4318, 27: 4319}, + {498: 4247, 508: 2037, 735: 4316}, + {498: 4247, 508: 2037, 735: 4314}, + {475: 2037, 498: 4247, 735: 4312}, // 1715 - {498: 4246, 508: 2037, 735: 4309}, - {498: 4246, 508: 2037, 735: 4307}, - {475: 2037, 498: 4246, 735: 4305}, - {475: 2037, 498: 4246, 735: 4303}, - {498: 4246, 508: 2037, 735: 4301}, + {498: 4247, 508: 2037, 735: 4310}, + {498: 4247, 508: 2037, 735: 4308}, + {475: 2037, 498: 4247, 735: 4306}, + {475: 2037, 498: 4247, 735: 4304}, + {498: 4247, 508: 2037, 735: 4302}, // 1720 - {498: 4246, 508: 2037, 735: 4299}, + {498: 4247, 508: 2037, 735: 4300}, {417, 417, 417, 417, 417, 417, 417, 417, 13: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 472: 417, 417, 417, 478: 417, 417, 417, 482: 417, 490: 417, 417, 501: 417, 503: 417, 506: 417, 417, 569: 417, 645: 417, 417, 648: 417}, - {479: 2037, 498: 4246, 508: 2037, 735: 4297}, - {479: 2037, 498: 4246, 508: 2037, 735: 4294}, - {479: 2037, 498: 4246, 508: 2037, 735: 4291}, + {479: 2037, 498: 4247, 508: 2037, 735: 4298}, + {479: 2037, 498: 4247, 508: 2037, 735: 4295}, + {479: 2037, 498: 4247, 508: 2037, 735: 4292}, // 1725 - {498: 4246, 508: 2037, 735: 4289}, - {498: 4246, 508: 2037, 735: 4287}, - {498: 4246, 508: 2037, 574: 2037, 2037, 735: 4285}, - {475: 2037, 498: 4246, 735: 4283}, - {475: 2037, 498: 4246, 735: 4281}, + {498: 4247, 508: 2037, 735: 4290}, + {498: 4247, 508: 2037, 735: 4288}, + {498: 4247, 508: 2037, 574: 2037, 2037, 735: 4286}, + {475: 2037, 498: 4247, 735: 4284}, + {475: 2037, 498: 4247, 735: 4282}, // 1730 - {498: 4246, 508: 2037, 735: 4279}, - {498: 4246, 508: 2037, 735: 4277}, - {479: 2037, 498: 4246, 508: 2037, 735: 4273}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 492: 2037, 498: 4246, 735: 4270}, - {473: 2037, 498: 4246, 735: 4265}, + {498: 4247, 508: 2037, 735: 4280}, + {498: 4247, 508: 2037, 735: 4278}, + {479: 2037, 498: 4247, 508: 2037, 735: 4274}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 492: 2037, 498: 4247, 735: 4271}, + {473: 2037, 498: 4247, 735: 4266}, // 1735 - {475: 2037, 498: 4246, 735: 4262}, + {475: 2037, 498: 4247, 735: 4263}, {391, 391, 391, 391, 391, 391, 391, 391, 13: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 472: 391, 391, 391, 478: 391, 391, 391, 482: 391, 490: 391, 391, 501: 391, 503: 391, 506: 391, 391, 569: 391, 645: 391, 391, 648: 391}, - {175: 2037, 197: 2037, 200: 2037, 233: 2037, 273: 2037, 289: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 479: 2037, 498: 4246, 735: 4247}, + {175: 2037, 197: 2037, 200: 2037, 233: 2037, 273: 2037, 289: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 479: 2037, 498: 4247, 735: 4248}, {2: 2036, 2036, 2036, 2036, 2036, 8: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 48: 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 473: 2036, 475: 2036, 479: 2036, 485: 2036, 2036, 491: 2036, 2036, 507: 2036, 2036, 543: 2036, 571: 2036, 2036, 574: 2036, 2036}, - {175: 4250, 197: 4253, 200: 4249, 233: 4251, 273: 4252, 289: 4254, 4255, 4259, 4258, 4256, 4260, 4261, 4257, 479: 4248}, + {175: 4251, 197: 4254, 200: 4250, 233: 4252, 273: 4253, 289: 4255, 4256, 4260, 4259, 4257, 4261, 4262, 4258, 479: 4249}, // 1740 {385, 385, 385, 385, 385, 385, 385, 385, 13: 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 472: 385, 385, 385, 478: 385, 385, 385, 482: 385, 490: 385, 385, 501: 385, 503: 385, 506: 385, 385, 569: 385, 645: 385, 385, 648: 385}, {384, 384, 384, 384, 384, 384, 384, 384, 13: 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 472: 384, 384, 384, 478: 384, 384, 384, 482: 384, 490: 384, 384, 501: 384, 503: 384, 506: 384, 384, 569: 384, 645: 384, 384, 648: 384}, @@ -8218,126 +8219,126 @@ var ( {374, 374, 374, 374, 374, 374, 374, 374, 13: 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 472: 374, 374, 374, 478: 374, 374, 374, 482: 374, 490: 374, 374, 501: 374, 503: 374, 506: 374, 374, 569: 374, 645: 374, 374, 648: 374}, {373, 373, 373, 373, 373, 373, 373, 373, 13: 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 472: 373, 373, 373, 478: 373, 373, 373, 482: 373, 490: 373, 373, 501: 373, 503: 373, 506: 373, 373, 569: 373, 645: 373, 373, 648: 373}, {372, 372, 372, 372, 372, 372, 372, 372, 13: 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 472: 372, 372, 372, 478: 372, 372, 372, 482: 372, 490: 372, 372, 501: 372, 503: 372, 506: 372, 372, 569: 372, 645: 372, 372, 648: 372}, - {475: 4264, 1038: 4263}, + {475: 4265, 1038: 4264}, // 1755 {398, 398, 398, 398, 398, 398, 398, 398, 13: 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 472: 398, 398, 398, 478: 398, 398, 398, 482: 398, 490: 398, 398, 501: 398, 503: 398, 506: 398, 398, 569: 398, 645: 398, 398, 648: 398}, {9, 9, 9, 9, 9, 9, 9, 9, 13: 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, 472: 9, 9, 9, 478: 9, 9, 9, 482: 9, 490: 9, 9, 501: 9, 503: 9, 9, 506: 9, 9, 569: 9, 645: 9, 9, 648: 9}, - {473: 4266}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 561, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 4267, 1144: 4268}, - {560, 560, 7: 3892, 47: 560, 474: 560}, + {473: 4267}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 561, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 4268, 1144: 4269}, + {560, 560, 7: 3893, 47: 560, 474: 560}, // 1760 - {47: 4269}, + {47: 4270}, {399, 399, 399, 399, 399, 399, 399, 399, 13: 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 472: 399, 399, 399, 478: 399, 399, 399, 482: 399, 490: 399, 399, 501: 399, 503: 399, 506: 399, 399, 569: 399, 645: 399, 399, 648: 399}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 492: 4271, 663: 3459, 2731, 2732, 2730, 737: 4272}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 492: 4272, 663: 3460, 2732, 2733, 2731, 737: 4273}, {401, 401, 401, 401, 401, 401, 401, 401, 13: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 472: 401, 401, 401, 478: 401, 401, 401, 482: 401, 490: 401, 401, 501: 401, 503: 401, 506: 401, 401, 569: 401, 645: 401, 401, 648: 401}, {400, 400, 400, 400, 400, 400, 400, 400, 13: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 472: 400, 400, 400, 478: 400, 400, 400, 482: 400, 490: 400, 400, 501: 400, 503: 400, 506: 400, 400, 569: 400, 645: 400, 400, 648: 400}, // 1765 - {479: 4275, 508: 2705, 732: 2704, 743: 4276, 1136: 4274}, + {479: 4276, 508: 2706, 732: 2705, 743: 4277, 1136: 4275}, {404, 404, 404, 404, 404, 404, 404, 404, 13: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 472: 404, 404, 404, 478: 404, 404, 404, 482: 404, 490: 404, 404, 501: 404, 503: 404, 506: 404, 404, 569: 404, 645: 404, 404, 648: 404}, {395, 395, 395, 395, 395, 395, 395, 395, 13: 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 472: 395, 395, 395, 478: 395, 395, 395, 482: 395, 490: 395, 395, 501: 395, 503: 395, 506: 395, 395, 569: 395, 645: 395, 395, 648: 395}, {394, 394, 394, 394, 394, 394, 394, 394, 13: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 472: 394, 394, 394, 478: 394, 394, 394, 482: 394, 490: 394, 394, 501: 394, 503: 394, 506: 394, 394, 569: 394, 645: 394, 394, 648: 394}, - {508: 2705, 732: 2704, 743: 4278}, + {508: 2706, 732: 2705, 743: 4279}, // 1770 {405, 405, 405, 405, 405, 405, 405, 405, 13: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 472: 405, 405, 405, 478: 405, 405, 405, 482: 405, 490: 405, 405, 501: 405, 503: 405, 506: 405, 405, 569: 405, 645: 405, 405, 648: 405}, - {508: 2705, 732: 2704, 743: 4280}, + {508: 2706, 732: 2705, 743: 4281}, {406, 406, 406, 406, 406, 406, 406, 406, 13: 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 472: 406, 406, 406, 478: 406, 406, 406, 482: 406, 490: 406, 406, 501: 406, 503: 406, 506: 406, 406, 569: 406, 645: 406, 406, 648: 406}, - {475: 4282}, + {475: 4283}, {407, 407, 407, 407, 407, 407, 407, 407, 13: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 472: 407, 407, 407, 478: 407, 407, 407, 482: 407, 490: 407, 407, 501: 407, 503: 407, 506: 407, 407, 569: 407, 645: 407, 407, 648: 407}, // 1775 - {475: 4284}, + {475: 4285}, {408, 408, 408, 408, 408, 408, 408, 408, 13: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 472: 408, 408, 408, 478: 408, 408, 408, 482: 408, 490: 408, 408, 501: 408, 503: 408, 506: 408, 408, 569: 408, 645: 408, 408, 648: 408}, - {508: 3391, 574: 3393, 3392, 818: 4286}, + {508: 3392, 574: 3394, 3393, 818: 4287}, {409, 409, 409, 409, 409, 409, 409, 409, 13: 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 472: 409, 409, 409, 478: 409, 409, 409, 482: 409, 490: 409, 409, 501: 409, 503: 409, 506: 409, 409, 569: 409, 645: 409, 409, 648: 409}, - {508: 2705, 732: 2704, 743: 4288}, + {508: 2706, 732: 2705, 743: 4289}, // 1780 {410, 410, 410, 410, 410, 410, 410, 410, 13: 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 472: 410, 410, 410, 478: 410, 410, 410, 482: 410, 490: 410, 410, 501: 410, 503: 410, 506: 410, 410, 569: 410, 645: 410, 410, 648: 410}, - {508: 2705, 732: 2704, 743: 4290}, + {508: 2706, 732: 2705, 743: 4291}, {411, 411, 411, 411, 411, 411, 411, 411, 13: 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 472: 411, 411, 411, 478: 411, 411, 411, 482: 411, 490: 411, 411, 501: 411, 503: 411, 506: 411, 411, 569: 411, 645: 411, 411, 648: 411}, - {479: 4293, 508: 2705, 732: 2704, 743: 4292}, + {479: 4294, 508: 2706, 732: 2705, 743: 4293}, {413, 413, 413, 413, 413, 413, 413, 413, 13: 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 472: 413, 413, 413, 478: 413, 413, 413, 482: 413, 490: 413, 413, 501: 413, 503: 413, 506: 413, 413, 569: 413, 645: 413, 413, 648: 413}, // 1785 {412, 412, 412, 412, 412, 412, 412, 412, 13: 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 472: 412, 412, 412, 478: 412, 412, 412, 482: 412, 490: 412, 412, 501: 412, 503: 412, 506: 412, 412, 569: 412, 645: 412, 412, 648: 412}, - {479: 4296, 508: 2705, 732: 2704, 743: 4295}, + {479: 4297, 508: 2706, 732: 2705, 743: 4296}, {415, 415, 415, 415, 415, 415, 415, 415, 13: 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 472: 415, 415, 415, 478: 415, 415, 415, 482: 415, 490: 415, 415, 501: 415, 503: 415, 506: 415, 415, 569: 415, 645: 415, 415, 648: 415}, {414, 414, 414, 414, 414, 414, 414, 414, 13: 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 472: 414, 414, 414, 478: 414, 414, 414, 482: 414, 490: 414, 414, 501: 414, 503: 414, 506: 414, 414, 569: 414, 645: 414, 414, 648: 414}, - {479: 4275, 508: 2705, 732: 2704, 743: 4276, 1136: 4298}, + {479: 4276, 508: 2706, 732: 2705, 743: 4277, 1136: 4299}, // 1790 {416, 416, 416, 416, 416, 416, 416, 416, 13: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 472: 416, 416, 416, 478: 416, 416, 416, 482: 416, 490: 416, 416, 501: 416, 503: 416, 506: 416, 416, 569: 416, 645: 416, 416, 648: 416}, - {508: 2705, 732: 2704, 743: 4300}, + {508: 2706, 732: 2705, 743: 4301}, {418, 418, 418, 418, 418, 418, 418, 418, 13: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 472: 418, 418, 418, 478: 418, 418, 418, 482: 418, 490: 418, 418, 501: 418, 503: 418, 506: 418, 418, 569: 418, 645: 418, 418, 648: 418}, - {508: 2705, 732: 2704, 743: 4302}, + {508: 2706, 732: 2705, 743: 4303}, {419, 419, 419, 419, 419, 419, 419, 419, 13: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 472: 419, 419, 419, 478: 419, 419, 419, 482: 419, 490: 419, 419, 501: 419, 503: 419, 506: 419, 419, 569: 419, 645: 419, 419, 648: 419}, // 1795 - {475: 4304}, + {475: 4305}, {420, 420, 420, 420, 420, 420, 420, 420, 13: 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 472: 420, 420, 420, 478: 420, 420, 420, 482: 420, 490: 420, 420, 501: 420, 503: 420, 506: 420, 420, 569: 420, 645: 420, 420, 648: 420}, - {475: 4306}, + {475: 4307}, {421, 421, 421, 421, 421, 421, 421, 421, 13: 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 472: 421, 421, 421, 478: 421, 421, 421, 482: 421, 490: 421, 421, 501: 421, 503: 421, 506: 421, 421, 569: 421, 645: 421, 421, 648: 421}, - {508: 2705, 732: 2704, 743: 4308}, + {508: 2706, 732: 2705, 743: 4309}, // 1800 {422, 422, 422, 422, 422, 422, 422, 422, 13: 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 472: 422, 422, 422, 478: 422, 422, 422, 482: 422, 490: 422, 422, 501: 422, 503: 422, 506: 422, 422, 569: 422, 645: 422, 422, 648: 422}, - {508: 2705, 732: 2704, 743: 4310}, + {508: 2706, 732: 2705, 743: 4311}, {423, 423, 423, 423, 423, 423, 423, 423, 13: 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 472: 423, 423, 423, 478: 423, 423, 423, 482: 423, 490: 423, 423, 501: 423, 503: 423, 506: 423, 423, 569: 423, 645: 423, 423, 648: 423}, - {475: 4312}, + {475: 4313}, {424, 424, 424, 424, 424, 424, 424, 424, 13: 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 472: 424, 424, 424, 478: 424, 424, 424, 482: 424, 490: 424, 424, 501: 424, 503: 424, 506: 424, 424, 569: 424, 645: 424, 424, 648: 424}, // 1805 - {508: 2705, 732: 2704, 743: 4314}, + {508: 2706, 732: 2705, 743: 4315}, {425, 425, 425, 425, 425, 425, 425, 425, 13: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 472: 425, 425, 425, 478: 425, 425, 425, 482: 425, 490: 425, 425, 501: 425, 503: 425, 506: 425, 425, 569: 425, 645: 425, 425, 648: 425}, - {508: 2705, 732: 2704, 743: 4316}, + {508: 2706, 732: 2705, 743: 4317}, {427, 427, 427, 427, 427, 427, 427, 427, 13: 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 472: 427, 427, 427, 478: 427, 427, 427, 482: 427, 490: 427, 427, 501: 427, 503: 427, 506: 427, 427, 569: 427, 645: 427, 427, 648: 427}, - {498: 4246, 508: 2037, 735: 4321}, + {498: 4247, 508: 2037, 735: 4322}, // 1810 - {498: 4246, 508: 2037, 735: 4319}, - {508: 2705, 732: 2704, 743: 4320}, + {498: 4247, 508: 2037, 735: 4320}, + {508: 2706, 732: 2705, 743: 4321}, {426, 426, 426, 426, 426, 426, 426, 426, 13: 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 472: 426, 426, 426, 478: 426, 426, 426, 482: 426, 490: 426, 426, 501: 426, 503: 426, 506: 426, 426, 569: 426, 645: 426, 426, 648: 426}, - {508: 2705, 732: 2704, 743: 4322}, + {508: 2706, 732: 2705, 743: 4323}, {428, 428, 428, 428, 428, 428, 428, 428, 13: 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 472: 428, 428, 428, 478: 428, 428, 428, 482: 428, 490: 428, 428, 501: 428, 503: 428, 506: 428, 428, 569: 428, 645: 428, 428, 648: 428}, // 1815 - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 543: 2037, 735: 4327}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 543: 2037, 735: 4325}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3457, 663: 3459, 2731, 2732, 2730, 737: 3456, 870: 4326}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 543: 2037, 735: 4328}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 543: 2037, 735: 4326}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3458, 663: 3460, 2732, 2733, 2731, 737: 3457, 870: 4327}, {429, 429, 429, 429, 429, 429, 429, 429, 13: 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 472: 429, 429, 429, 478: 429, 429, 429, 482: 429, 490: 429, 429, 501: 429, 503: 429, 506: 429, 429, 569: 429, 645: 429, 429, 648: 429}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 4328}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 4329}, // 1820 {430, 430, 430, 430, 430, 430, 430, 430, 13: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 472: 430, 430, 430, 478: 430, 430, 430, 482: 430, 490: 430, 430, 501: 430, 503: 430, 506: 430, 430, 569: 430, 645: 430, 430, 648: 430}, - {508: 2705, 732: 2704, 743: 4330}, + {508: 2706, 732: 2705, 743: 4331}, {2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 13: 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 47: 2111, 472: 2111, 2111, 2111, 478: 2111, 2111, 2111, 482: 2111, 490: 2111, 2111, 501: 2111, 503: 2111, 506: 2111, 2111, 569: 2111, 645: 2111, 2111, 648: 2111}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4332, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4333, 2732, 2733, 2731}, {2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 13: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 47: 2112, 472: 2112, 2112, 2112, 478: 2112, 2112, 2112, 482: 2112, 490: 2112, 2112, 501: 2112, 503: 2112, 506: 2112, 2112, 569: 2112, 645: 2112, 2112, 648: 2112}, // 1825 - {508: 2705, 732: 2704, 743: 4334}, + {508: 2706, 732: 2705, 743: 4335}, {2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 13: 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113, 47: 2113, 472: 2113, 2113, 2113, 478: 2113, 2113, 2113, 482: 2113, 490: 2113, 2113, 501: 2113, 503: 2113, 506: 2113, 2113, 569: 2113, 645: 2113, 2113, 648: 2113}, - {508: 2705, 732: 2704, 743: 4336}, + {508: 2706, 732: 2705, 743: 4337}, {2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 13: 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 2114, 47: 2114, 472: 2114, 2114, 2114, 478: 2114, 2114, 2114, 482: 2114, 490: 2114, 2114, 501: 2114, 503: 2114, 506: 2114, 2114, 569: 2114, 645: 2114, 2114, 648: 2114}, - {475: 2037, 498: 4246, 735: 4338}, + {475: 2037, 498: 4247, 735: 4339}, // 1830 - {475: 4339}, + {475: 4340}, {2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 13: 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 2115, 47: 2115, 472: 2115, 2115, 2115, 478: 2115, 2115, 2115, 482: 2115, 490: 2115, 2115, 501: 2115, 503: 2115, 506: 2115, 2115, 569: 2115, 645: 2115, 2115, 648: 2115}, - {475: 2037, 498: 4246, 735: 4341}, - {475: 4342}, + {475: 2037, 498: 4247, 735: 4342}, + {475: 4343}, {2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 13: 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116, 47: 2116, 472: 2116, 2116, 2116, 478: 2116, 2116, 2116, 482: 2116, 490: 2116, 2116, 501: 2116, 503: 2116, 506: 2116, 2116, 569: 2116, 645: 2116, 2116, 648: 2116}, // 1835 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 663: 3459, 2731, 2732, 2730, 737: 4344}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 663: 3460, 2732, 2733, 2731, 737: 4345}, {2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 13: 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117, 47: 2117, 472: 2117, 2117, 2117, 478: 2117, 2117, 2117, 482: 2117, 490: 2117, 2117, 501: 2117, 503: 2117, 506: 2117, 2117, 569: 2117, 645: 2117, 2117, 648: 2117}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 735: 4348}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 735: 4349}, {403, 403, 403, 403, 403, 403, 403, 403, 13: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 472: 403, 403, 403, 478: 403, 403, 403, 482: 403, 490: 403, 403, 501: 403, 503: 403, 506: 403, 403, 569: 403, 645: 403, 403, 648: 403}, {402, 402, 402, 402, 402, 402, 402, 402, 13: 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 472: 402, 402, 402, 478: 402, 402, 402, 482: 402, 490: 402, 402, 501: 402, 503: 402, 506: 402, 402, 569: 402, 645: 402, 402, 648: 402}, // 1840 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 663: 3459, 2731, 2732, 2730, 737: 4349}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 663: 3460, 2732, 2733, 2731, 737: 4350}, {2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 13: 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 47: 2118, 472: 2118, 2118, 2118, 478: 2118, 2118, 2118, 482: 2118, 490: 2118, 2118, 501: 2118, 503: 2118, 506: 2118, 2118, 569: 2118, 645: 2118, 2118, 648: 2118}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 663: 3459, 2731, 2732, 2730, 737: 4351}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 663: 3460, 2732, 2733, 2731, 737: 4352}, {2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 13: 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 47: 2119, 472: 2119, 2119, 2119, 478: 2119, 2119, 2119, 482: 2119, 490: 2119, 2119, 501: 2119, 503: 2119, 506: 2119, 2119, 569: 2119, 645: 2119, 2119, 648: 2119}, - {475: 4353}, + {475: 4354}, // 1845 {2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 13: 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120, 47: 2120, 472: 2120, 2120, 2120, 478: 2120, 2120, 2120, 482: 2120, 490: 2120, 2120, 501: 2120, 503: 2120, 506: 2120, 2120, 569: 2120, 645: 2120, 2120, 648: 2120}, - {4: 4206, 4208, 397, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 69: 4177, 72: 4198, 4199, 81: 4200, 132: 4180, 196: 4165, 198: 4184, 201: 4185, 211: 4179, 219: 4195, 232: 4174, 241: 4181, 247: 4176, 264: 4186, 272: 4182, 279: 4196, 4197, 286: 4166, 474: 4194, 479: 4205, 4242, 482: 2156, 496: 4201, 502: 4183, 4193, 4168, 506: 2156, 582: 4173, 587: 4169, 646: 2156, 648: 4211, 660: 4188, 668: 4175, 670: 4202, 678: 4187, 685: 4189, 688: 4170, 703: 4178, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4244, 868: 4192, 881: 4190, 917: 4167, 924: 4171, 987: 4355, 1135: 4172, 1162: 4191}, + {4: 4207, 4209, 397, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 69: 4178, 72: 4199, 4200, 81: 4201, 132: 4181, 196: 4166, 198: 4185, 201: 4186, 211: 4180, 219: 4196, 232: 4175, 241: 4182, 247: 4177, 264: 4187, 272: 4183, 279: 4197, 4198, 286: 4167, 474: 4195, 479: 4206, 4243, 482: 2156, 496: 4202, 502: 4184, 4194, 4169, 506: 2156, 582: 4174, 587: 4170, 646: 2156, 648: 4212, 660: 4189, 668: 4176, 670: 4203, 678: 4188, 685: 4190, 688: 4171, 703: 4179, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4245, 868: 4193, 881: 4191, 917: 4168, 924: 4172, 987: 4356, 1135: 4173, 1162: 4192}, {2385, 2385, 2385, 2385, 7: 2385, 490: 2385}, {2399, 2399, 2399, 2399, 7: 2399, 490: 2399}, {2398, 2398, 2398, 2398, 7: 2398, 490: 2398}, // 1850 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 479: 4359, 663: 4360, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 479: 4360, 663: 4361, 2732, 2733, 2731}, {2401, 2401, 2401, 2401, 7: 2401, 81: 2401, 490: 2401}, {2400, 2400, 2400, 2400, 7: 2400, 81: 2400, 490: 2400}, - {149: 4366, 235: 4363, 256: 4364, 258: 4365, 479: 4362}, + {149: 4367, 235: 4364, 256: 4365, 258: 4366, 479: 4363}, {2406, 2406, 2406, 2406, 7: 2406, 490: 2406, 496: 2406}, // 1855 {2405, 2405, 2405, 2405, 7: 2405, 490: 2405, 496: 2405}, @@ -8347,80 +8348,80 @@ var ( {2424, 2424, 2424, 2424, 7: 2424, 490: 2424}, // 1860 {2425, 2425, 2425, 2425, 7: 2425, 490: 2425}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4382, 2731, 2732, 2730}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4381}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4380}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4379}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4383, 2732, 2733, 2731}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4382}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4381}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4380}, // 1865 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4376, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4377, 2732, 2733, 2731}, {2: 2397, 2397, 2397, 2397, 2397, 8: 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 48: 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 2397, 473: 2397, 481: 2397, 494: 2397, 566: 2397}, {2: 2396, 2396, 2396, 2396, 2396, 8: 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 48: 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 473: 2396, 481: 2396, 494: 2396, 566: 2396}, - {649: 4377}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4378, 2731, 2732, 2730}, + {649: 4378}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4379, 2732, 2733, 2731}, // 1870 {2430, 2430, 2430, 2430, 7: 2430, 490: 2430}, {2431, 2431, 2431, 2431, 7: 2431, 490: 2431}, {2432, 2432, 2432, 2432, 7: 2432, 490: 2432}, {2433, 2433, 2433, 2433, 7: 2433, 490: 2433}, - {649: 4383}, + {649: 4384}, // 1875 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4384, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4385, 2732, 2733, 2731}, {2434, 2434, 2434, 2434, 7: 2434, 490: 2434}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4400}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4395, 2731, 2732, 2730}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4391, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4401}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4396, 2732, 2733, 2731}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4392, 2732, 2733, 2731}, // 1880 {2: 2392, 2392, 2392, 2392, 2392, 8: 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 48: 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 473: 2392, 566: 2392}, {2: 439, 439, 439, 439, 439, 8: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 48: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439}, {2: 438, 438, 438, 438, 438, 8: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 48: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438}, - {84: 4394, 87: 4393, 854: 4392}, + {84: 4395, 87: 4394, 854: 4393}, {2419, 2419, 2419, 2419, 7: 2419, 490: 2419}, // 1885 {1824, 1824, 1824, 1824, 1824, 7: 1824, 17: 1824, 47: 1824, 81: 1824, 1824, 1824, 1824, 1824, 87: 1824, 474: 1824, 481: 1824, 490: 1824, 496: 1824}, {1823, 1823, 1823, 1823, 1823, 7: 1823, 17: 1823, 47: 1823, 81: 1823, 1823, 1823, 1823, 1823, 87: 1823, 474: 1823, 481: 1823, 490: 1823, 496: 1823}, - {147: 4397, 476: 4057, 4056, 809: 4398, 932: 4396}, + {147: 4398, 476: 4058, 4057, 809: 4399, 932: 4397}, {2421, 2421, 2421, 2421, 7: 2421, 490: 2421}, {2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 2289, 47: 2289, 472: 2289, 476: 2289, 2289, 2289, 2289, 482: 2289, 490: 2289, 492: 2289, 573: 2289, 582: 2289, 586: 2289, 638: 2289, 642: 2289, 2289, 2289}, // 1890 - {147: 4399}, + {147: 4400}, {2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 2288, 47: 2288, 472: 2288, 476: 2288, 2288, 2288, 2288, 482: 2288, 490: 2288, 492: 2288, 573: 2288, 582: 2288, 586: 2288, 638: 2288, 642: 2288, 2288, 2288}, - {504: 4401, 668: 4402}, + {504: 4402, 668: 4403}, + {479: 4405}, {479: 4404}, - {479: 4403}, // 1895 {2435, 2435, 2435, 2435, 7: 2435, 490: 2435}, - {473: 4406, 475: 3208, 485: 4408, 4409, 492: 3199, 508: 3203, 571: 3198, 3200, 574: 3202, 3201, 577: 3206, 580: 3207, 593: 3205, 711: 4407, 3204, 1131: 4405}, + {473: 4407, 475: 3209, 485: 4409, 4410, 492: 3200, 508: 3204, 571: 3199, 3201, 574: 3203, 3202, 577: 3207, 580: 3208, 593: 3206, 711: 4408, 3205, 1131: 4406}, {2437, 2437, 2437, 2437, 7: 2437, 490: 2437}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4412}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4413}, {2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 47: 2205, 472: 2205, 476: 2205, 2205, 2205, 2205, 482: 2205, 490: 2205, 492: 2205, 573: 2205, 582: 2205, 586: 2205, 638: 2205, 642: 2205, 2205, 2205}, // 1900 - {508: 3391, 574: 3393, 3392, 818: 4411}, - {508: 3391, 574: 3393, 3392, 818: 4410}, + {508: 3392, 574: 3394, 3393, 818: 4412}, + {508: 3392, 574: 3394, 3393, 818: 4411}, {2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 47: 2203, 472: 2203, 476: 2203, 2203, 2203, 2203, 482: 2203, 490: 2203, 492: 2203, 573: 2203, 582: 2203, 586: 2203, 638: 2203, 642: 2203, 2203, 2203}, {2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 47: 2204, 472: 2204, 476: 2204, 2204, 2204, 2204, 482: 2204, 490: 2204, 492: 2204, 573: 2204, 582: 2204, 586: 2204, 638: 2204, 642: 2204, 2204, 2204}, - {47: 4413, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {47: 4414, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 1905 {2436, 2436, 2436, 2436, 7: 2436, 490: 2436}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4415}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4418}, - {584: 4417}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4416}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4419}, + {584: 4418}, {2: 1849, 1849, 1849, 1849, 1849, 8: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 48: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 475: 1849, 570: 1849}, // 1910 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4420, 846: 4419}, - {2391, 2391, 2391, 2391, 7: 2391, 4689, 4690, 490: 2391, 927: 4688}, - {10: 4422, 101: 4470, 109: 4471, 165: 4461, 173: 4481, 4480, 4446, 193: 4483, 218: 4482, 225: 4443, 311: 4450, 4442, 332: 4459, 358: 4466, 4465, 363: 4469, 398: 4477, 504: 4460, 506: 4464, 543: 4455, 646: 4463, 676: 4468, 4467, 679: 4444, 4449, 4447, 4440, 4434, 4448, 687: 4456, 689: 4441, 4473, 4435, 4436, 4437, 4438, 4439, 4462, 4475, 4479, 4474, 4433, 4478, 4445, 704: 4432, 4472, 4431, 4476, 899: 4451, 1154: 4453, 1177: 4430, 4457, 4427, 1197: 4425, 1211: 4428, 1213: 4429, 1231: 4426, 1247: 4452, 4423, 4454, 1306: 4424, 1318: 4458, 1321: 4421, 1346: 4484}, - {2252, 2252, 2252, 2252, 4564, 4570, 4558, 2252, 2252, 2252, 4562, 4571, 4569, 47: 2252, 472: 4563, 476: 4057, 4056, 2259, 4561, 482: 4568, 490: 2252, 492: 4557, 573: 2293, 582: 2382, 586: 4555, 638: 4560, 642: 4553, 4575, 4572, 809: 4556, 831: 4565, 908: 4567, 926: 4573, 935: 4566, 954: 4559, 1002: 4574, 4687}, - {2252, 2252, 2252, 2252, 4564, 4570, 4558, 2252, 2252, 2252, 4562, 4571, 4569, 47: 2252, 472: 4563, 476: 4057, 4056, 2259, 4561, 482: 4568, 490: 2252, 492: 4557, 573: 2293, 582: 2382, 586: 4555, 638: 4560, 642: 4553, 4575, 4572, 809: 4556, 831: 4565, 908: 4567, 926: 4573, 935: 4566, 954: 4559, 1002: 4574, 4554}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4421, 846: 4420}, + {2391, 2391, 2391, 2391, 7: 2391, 4690, 4691, 490: 2391, 927: 4689}, + {10: 4423, 101: 4471, 109: 4472, 165: 4462, 173: 4482, 4481, 4447, 193: 4484, 218: 4483, 225: 4444, 311: 4451, 4443, 332: 4460, 358: 4467, 4466, 363: 4470, 398: 4478, 504: 4461, 506: 4465, 543: 4456, 646: 4464, 676: 4469, 4468, 679: 4445, 4450, 4448, 4441, 4435, 4449, 687: 4457, 689: 4442, 4474, 4436, 4437, 4438, 4439, 4440, 4463, 4476, 4480, 4475, 4434, 4479, 4446, 704: 4433, 4473, 4432, 4477, 899: 4452, 1154: 4454, 1177: 4431, 4458, 4428, 1197: 4426, 1211: 4429, 1213: 4430, 1231: 4427, 1247: 4453, 4424, 4455, 1306: 4425, 1318: 4459, 1321: 4422, 1346: 4485}, + {2252, 2252, 2252, 2252, 4565, 4571, 4559, 2252, 2252, 2252, 4563, 4572, 4570, 47: 2252, 472: 4564, 476: 4058, 4057, 2259, 4562, 482: 4569, 490: 2252, 492: 4558, 573: 2293, 582: 2382, 586: 4556, 638: 4561, 642: 4554, 4576, 4573, 809: 4557, 831: 4566, 908: 4568, 926: 4574, 935: 4567, 954: 4560, 1002: 4575, 4688}, + {2252, 2252, 2252, 2252, 4565, 4571, 4559, 2252, 2252, 2252, 4563, 4572, 4570, 47: 2252, 472: 4564, 476: 4058, 4057, 2259, 4562, 482: 4569, 490: 2252, 492: 4558, 573: 2293, 582: 2382, 586: 4556, 638: 4561, 642: 4554, 4576, 4573, 809: 4557, 831: 4566, 908: 4568, 926: 4574, 935: 4567, 954: 4560, 1002: 4575, 4555}, // 1915 {371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 47: 371, 472: 371, 476: 371, 371, 371, 371, 482: 371, 490: 371, 492: 371, 573: 371, 582: 371, 586: 371, 638: 371, 642: 371, 371, 371}, {370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 47: 370, 472: 370, 476: 370, 370, 370, 370, 482: 370, 490: 370, 492: 370, 573: 370, 582: 370, 586: 370, 638: 370, 642: 370, 370, 370}, {369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 47: 369, 472: 369, 476: 369, 369, 369, 369, 482: 369, 490: 369, 492: 369, 573: 369, 582: 369, 586: 369, 638: 369, 642: 369, 369, 369}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 49: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 739: 286, 741: 286, 762: 3795, 785: 4551}, - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4550}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 49: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 739: 286, 741: 286, 762: 3796, 785: 4552}, + {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4551}, // 1920 - {279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 47: 279, 49: 279, 472: 279, 3781, 476: 279, 279, 279, 279, 482: 279, 490: 279, 492: 279, 573: 279, 582: 279, 586: 279, 638: 279, 642: 279, 279, 279, 739: 279, 741: 279, 762: 3782, 902: 4548, 907: 3783}, - {279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 47: 279, 49: 279, 472: 279, 3781, 476: 279, 279, 279, 279, 482: 279, 490: 279, 492: 279, 573: 279, 582: 279, 586: 279, 638: 279, 642: 279, 279, 279, 739: 279, 741: 279, 762: 3782, 902: 4546, 907: 3783}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4545}, + {279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 47: 279, 49: 279, 472: 279, 3782, 476: 279, 279, 279, 279, 482: 279, 490: 279, 492: 279, 573: 279, 582: 279, 586: 279, 638: 279, 642: 279, 279, 279, 739: 279, 741: 279, 762: 3783, 902: 4549, 907: 3784}, + {279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 47: 279, 49: 279, 472: 279, 3782, 476: 279, 279, 279, 279, 482: 279, 490: 279, 492: 279, 573: 279, 582: 279, 586: 279, 638: 279, 642: 279, 279, 279, 739: 279, 741: 279, 762: 3783, 902: 4547, 907: 3784}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4546}, {363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 47: 363, 49: 363, 472: 363, 363, 476: 363, 363, 363, 363, 482: 363, 490: 363, 492: 363, 573: 363, 582: 363, 586: 363, 638: 363, 642: 363, 363, 363, 739: 363, 741: 363}, {362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 47: 362, 49: 362, 472: 362, 362, 476: 362, 362, 362, 362, 482: 362, 490: 362, 492: 362, 573: 362, 582: 362, 586: 362, 638: 362, 642: 362, 362, 362, 739: 362, 741: 362}, // 1925 @@ -8443,27 +8444,27 @@ var ( {344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 47: 344, 49: 344, 472: 344, 344, 476: 344, 344, 344, 344, 482: 344, 490: 344, 492: 344, 573: 344, 582: 344, 586: 344, 638: 344, 642: 344, 344, 344, 739: 344, 741: 344}, // 1940 {343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 47: 343, 49: 343, 472: 343, 343, 476: 343, 343, 343, 343, 482: 343, 490: 343, 492: 343, 573: 343, 582: 343, 586: 343, 638: 343, 642: 343, 343, 343, 739: 343, 741: 343}, - {342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 47: 342, 49: 342, 472: 342, 342, 476: 342, 342, 342, 342, 482: 342, 490: 342, 492: 342, 573: 342, 582: 342, 586: 342, 638: 342, 642: 342, 342, 342, 739: 342, 741: 342, 1272: 4544}, + {342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 47: 342, 49: 342, 472: 342, 342, 476: 342, 342, 342, 342, 482: 342, 490: 342, 492: 342, 573: 342, 582: 342, 586: 342, 638: 342, 642: 342, 342, 342, 739: 342, 741: 342, 1272: 4545}, {340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 47: 340, 472: 340, 340, 476: 340, 340, 340, 340, 482: 340, 490: 340, 492: 340, 573: 340, 582: 340, 586: 340, 638: 340, 642: 340, 340, 340}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 472: 273, 3794, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 762: 4541, 772: 3802, 797: 4542}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 472: 273, 3794, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 762: 4538, 772: 3802, 797: 4539}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 472: 273, 3795, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 762: 4542, 772: 3803, 797: 4543}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 472: 273, 3795, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 762: 4539, 772: 3803, 797: 4540}, // 1945 - {473: 3794, 762: 4536}, - {473: 3794, 762: 4534}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4533}, - {473: 3794, 762: 4532}, + {473: 3795, 762: 4537}, + {473: 3795, 762: 4535}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4534}, + {473: 3795, 762: 4533}, {331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 47: 331, 472: 331, 476: 331, 331, 331, 331, 482: 331, 490: 331, 492: 331, 573: 331, 582: 331, 586: 331, 638: 331, 642: 331, 331, 331}, // 1950 - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 102: 4513, 4515, 106: 4514, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4512, 882: 4531}, - {473: 4527}, - {473: 4517}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 102: 4514, 4516, 106: 4515, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4513, 882: 4532}, + {473: 4528}, + {473: 4518}, {327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 47: 327, 472: 327, 476: 327, 327, 327, 327, 482: 327, 490: 327, 492: 327, 573: 327, 582: 327, 586: 327, 638: 327, 642: 327, 327, 327}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 102: 4513, 4515, 106: 4514, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 4510, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 4509, 676: 4468, 4467, 687: 4511, 772: 3802, 797: 4512, 882: 4508, 1154: 4507}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 102: 4514, 4516, 106: 4515, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 4511, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 4510, 676: 4469, 4468, 687: 4512, 772: 3803, 797: 4513, 882: 4509, 1154: 4508}, // 1955 - {324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 14: 324, 47: 324, 472: 324, 324, 476: 324, 324, 324, 324, 482: 324, 490: 324, 492: 324, 506: 324, 543: 324, 573: 324, 582: 324, 586: 324, 638: 324, 642: 324, 324, 324, 646: 324, 842: 4506}, - {323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 14: 323, 47: 323, 472: 323, 323, 476: 323, 323, 323, 323, 482: 323, 490: 323, 492: 323, 506: 323, 543: 323, 573: 323, 582: 323, 586: 323, 638: 323, 642: 323, 323, 323, 646: 323, 842: 4505}, - {322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 14: 322, 47: 322, 472: 322, 322, 476: 322, 322, 322, 322, 482: 322, 490: 322, 492: 322, 506: 322, 543: 322, 573: 322, 582: 322, 586: 322, 638: 322, 642: 322, 322, 322, 646: 322, 676: 4503, 4502, 842: 4504}, - {506: 4497, 646: 4496, 676: 4499, 4498}, + {324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 14: 324, 47: 324, 472: 324, 324, 476: 324, 324, 324, 324, 482: 324, 490: 324, 492: 324, 506: 324, 543: 324, 573: 324, 582: 324, 586: 324, 638: 324, 642: 324, 324, 324, 646: 324, 842: 4507}, + {323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 14: 323, 47: 323, 472: 323, 323, 476: 323, 323, 323, 323, 482: 323, 490: 323, 492: 323, 506: 323, 543: 323, 573: 323, 582: 323, 586: 323, 638: 323, 642: 323, 323, 323, 646: 323, 842: 4506}, + {322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 14: 322, 47: 322, 472: 322, 322, 476: 322, 322, 322, 322, 482: 322, 490: 322, 492: 322, 506: 322, 543: 322, 573: 322, 582: 322, 586: 322, 638: 322, 642: 322, 322, 322, 646: 322, 676: 4504, 4503, 842: 4505}, + {506: 4498, 646: 4497, 676: 4500, 4499}, {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 14: 317, 47: 317, 102: 317, 317, 106: 317, 472: 317, 317, 476: 317, 317, 317, 317, 482: 317, 490: 317, 492: 317, 506: 317, 543: 317, 573: 317, 582: 317, 586: 317, 638: 317, 642: 317, 317, 317, 646: 317}, // 1960 {316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 14: 316, 47: 316, 102: 316, 316, 106: 316, 472: 316, 316, 476: 316, 316, 316, 316, 482: 316, 490: 316, 492: 316, 506: 316, 543: 316, 573: 316, 582: 316, 586: 316, 638: 316, 642: 316, 316, 316, 646: 316}, @@ -8472,22 +8473,22 @@ var ( {306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 47: 306, 49: 306, 472: 306, 306, 476: 306, 306, 306, 306, 482: 306, 490: 306, 492: 306, 573: 306, 582: 306, 586: 306, 638: 306, 642: 306, 306, 306, 739: 306, 741: 306}, {305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 47: 305, 472: 305, 476: 305, 305, 305, 305, 482: 305, 490: 305, 492: 305, 573: 305, 582: 305, 586: 305, 638: 305, 642: 305, 305, 305}, // 1965 - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4495}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4496}, {303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 47: 303, 472: 303, 476: 303, 303, 303, 303, 482: 303, 490: 303, 492: 303, 573: 303, 582: 303, 586: 303, 638: 303, 642: 303, 303, 303}, {302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 47: 302, 472: 302, 476: 302, 302, 302, 302, 482: 302, 490: 302, 492: 302, 573: 302, 582: 302, 586: 302, 638: 302, 642: 302, 302, 302}, {300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 14: 300, 47: 300, 102: 300, 300, 106: 300, 472: 300, 476: 300, 300, 300, 300, 482: 300, 490: 300, 492: 300, 506: 300, 543: 300, 573: 300, 582: 300, 586: 300, 638: 300, 642: 300, 300, 300, 646: 300}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 14: 286, 47: 286, 102: 286, 286, 106: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 506: 286, 543: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 646: 286, 762: 3795, 785: 4494}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 14: 286, 47: 286, 102: 286, 286, 106: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 506: 286, 543: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 646: 286, 762: 3796, 785: 4495}, // 1970 {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 14: 298, 47: 298, 102: 298, 298, 106: 298, 472: 298, 476: 298, 298, 298, 298, 482: 298, 490: 298, 492: 298, 506: 298, 543: 298, 573: 298, 582: 298, 586: 298, 638: 298, 642: 298, 298, 298, 646: 298}, {297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 14: 297, 47: 297, 102: 297, 297, 106: 297, 472: 297, 476: 297, 297, 297, 297, 482: 297, 490: 297, 492: 297, 506: 297, 543: 297, 573: 297, 582: 297, 586: 297, 638: 297, 642: 297, 297, 297, 646: 297}, {292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 47: 292, 472: 292, 476: 292, 292, 292, 292, 482: 292, 490: 292, 492: 292, 573: 292, 582: 292, 586: 292, 638: 292, 642: 292, 292, 292}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4493}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4492}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4494}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4493}, // 1975 - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4491}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 49: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 739: 286, 741: 286, 762: 3795, 785: 4485}, - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4486}, - {288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 47: 288, 49: 4488, 472: 288, 476: 288, 288, 288, 288, 482: 288, 490: 288, 492: 288, 573: 288, 582: 288, 586: 288, 638: 288, 642: 288, 288, 288, 739: 4487, 741: 4489, 873: 4490}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4492}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 49: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 739: 286, 741: 286, 762: 3796, 785: 4486}, + {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4487}, + {288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 47: 288, 49: 4489, 472: 288, 476: 288, 288, 288, 288, 482: 288, 490: 288, 492: 288, 573: 288, 582: 288, 586: 288, 638: 288, 642: 288, 288, 288, 739: 4488, 741: 4490, 873: 4491}, {284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 47: 284, 49: 284, 472: 284, 476: 284, 284, 284, 284, 482: 284, 490: 284, 492: 284, 573: 284, 582: 284, 586: 284, 638: 284, 642: 284, 284, 284, 739: 284, 741: 284}, // 1980 {283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 47: 283, 49: 283, 472: 283, 476: 283, 283, 283, 283, 482: 283, 490: 283, 492: 283, 573: 283, 582: 283, 586: 283, 638: 283, 642: 283, 283, 283, 739: 283, 741: 283}, @@ -8499,8 +8500,8 @@ var ( {291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 47: 291, 472: 291, 476: 291, 291, 291, 291, 482: 291, 490: 291, 492: 291, 573: 291, 582: 291, 586: 291, 638: 291, 642: 291, 291, 291}, {299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 14: 299, 47: 299, 102: 299, 299, 106: 299, 472: 299, 476: 299, 299, 299, 299, 482: 299, 490: 299, 492: 299, 506: 299, 543: 299, 573: 299, 582: 299, 586: 299, 638: 299, 642: 299, 299, 299, 646: 299}, {304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 47: 304, 472: 304, 476: 304, 304, 304, 304, 482: 304, 490: 304, 492: 304, 573: 304, 582: 304, 586: 304, 638: 304, 642: 304, 304, 304}, - {321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 14: 321, 47: 321, 472: 321, 321, 476: 321, 321, 321, 321, 482: 321, 490: 321, 492: 321, 506: 321, 543: 321, 573: 321, 582: 321, 586: 321, 638: 321, 642: 321, 321, 321, 646: 321, 842: 4501}, - {320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 14: 320, 47: 320, 472: 320, 320, 476: 320, 320, 320, 320, 482: 320, 490: 320, 492: 320, 506: 320, 543: 320, 573: 320, 582: 320, 586: 320, 638: 320, 642: 320, 320, 320, 646: 320, 842: 4500}, + {321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 14: 321, 47: 321, 472: 321, 321, 476: 321, 321, 321, 321, 482: 321, 490: 321, 492: 321, 506: 321, 543: 321, 573: 321, 582: 321, 586: 321, 638: 321, 642: 321, 321, 321, 646: 321, 842: 4502}, + {320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 14: 320, 47: 320, 472: 320, 320, 476: 320, 320, 320, 320, 482: 320, 490: 320, 492: 320, 506: 320, 543: 320, 573: 320, 582: 320, 586: 320, 638: 320, 642: 320, 320, 320, 646: 320, 842: 4501}, // 1990 {473: 315}, {473: 314}, @@ -8512,11 +8513,11 @@ var ( {473: 308}, {318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 14: 318, 47: 318, 102: 318, 318, 106: 318, 472: 318, 318, 476: 318, 318, 318, 318, 482: 318, 490: 318, 492: 318, 506: 318, 543: 318, 573: 318, 582: 318, 586: 318, 638: 318, 642: 318, 318, 318, 646: 318}, {319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 14: 319, 47: 319, 102: 319, 319, 106: 319, 472: 319, 319, 476: 319, 319, 319, 319, 482: 319, 490: 319, 492: 319, 506: 319, 543: 319, 573: 319, 582: 319, 586: 319, 638: 319, 642: 319, 319, 319, 646: 319}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 102: 4513, 4515, 106: 4514, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4512, 882: 4516}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 102: 4514, 4516, 106: 4515, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4513, 882: 4517}, // 2000 {325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 47: 325, 472: 325, 476: 325, 325, 325, 325, 482: 325, 490: 325, 492: 325, 573: 325, 582: 325, 586: 325, 638: 325, 642: 325, 325, 325}, + {504: 3808, 842: 4507}, {504: 3807, 842: 4506}, - {504: 3806, 842: 4505}, {301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 47: 301, 472: 301, 476: 301, 301, 301, 301, 482: 301, 490: 301, 492: 301, 573: 301, 582: 301, 586: 301, 638: 301, 642: 301, 301, 301}, {296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 47: 296, 472: 296, 476: 296, 296, 296, 296, 482: 296, 490: 296, 492: 296, 573: 296, 582: 296, 586: 296, 638: 296, 642: 296, 296, 296}, // 2005 @@ -8524,123 +8525,123 @@ var ( {294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 47: 294, 472: 294, 476: 294, 294, 294, 294, 482: 294, 490: 294, 492: 294, 573: 294, 582: 294, 586: 294, 638: 294, 642: 294, 294, 294}, {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 47: 293, 472: 293, 476: 293, 293, 293, 293, 482: 293, 490: 293, 492: 293, 573: 293, 582: 293, 586: 293, 638: 293, 642: 293, 293, 293}, {326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 47: 326, 472: 326, 476: 326, 326, 326, 326, 482: 326, 490: 326, 492: 326, 573: 326, 582: 326, 586: 326, 638: 326, 642: 326, 326, 326}, - {475: 4519, 577: 4520, 580: 4521, 968: 4522, 1148: 4518}, + {475: 4520, 577: 4521, 580: 4522, 968: 4523, 1148: 4519}, // 2010 - {7: 4524, 47: 4523}, + {7: 4525, 47: 4524}, {7: 261, 47: 261}, {7: 260, 47: 260}, {7: 259, 47: 259}, {7: 258, 47: 258}, // 2015 - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 102: 4513, 4515, 106: 4514, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4512, 882: 4526}, - {475: 4519, 577: 4520, 580: 4521, 968: 4525}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 102: 4514, 4516, 106: 4515, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4513, 882: 4527}, + {475: 4520, 577: 4521, 580: 4522, 968: 4526}, {7: 257, 47: 257}, {328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 47: 328, 472: 328, 476: 328, 328, 328, 328, 482: 328, 490: 328, 492: 328, 573: 328, 582: 328, 586: 328, 638: 328, 642: 328, 328, 328}, - {475: 4519, 577: 4520, 580: 4521, 968: 4522, 1148: 4528}, + {475: 4520, 577: 4521, 580: 4522, 968: 4523, 1148: 4529}, // 2020 - {7: 4524, 47: 4529}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 102: 4513, 4515, 106: 4514, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4512, 882: 4530}, + {7: 4525, 47: 4530}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 102: 4514, 4516, 106: 4515, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4513, 882: 4531}, {329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 47: 329, 472: 329, 476: 329, 329, 329, 329, 482: 329, 490: 329, 492: 329, 573: 329, 582: 329, 586: 329, 638: 329, 642: 329, 329, 329}, {330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 47: 330, 472: 330, 476: 330, 330, 330, 330, 482: 330, 490: 330, 492: 330, 573: 330, 582: 330, 586: 330, 638: 330, 642: 330, 330, 330}, {332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 47: 332, 472: 332, 476: 332, 332, 332, 332, 482: 332, 490: 332, 492: 332, 573: 332, 582: 332, 586: 332, 638: 332, 642: 332, 332, 332}, // 2025 {333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 47: 333, 472: 333, 476: 333, 333, 333, 333, 482: 333, 490: 333, 492: 333, 573: 333, 582: 333, 586: 333, 638: 333, 642: 333, 333, 333}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4535}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4536}, {334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 47: 334, 472: 334, 476: 334, 334, 334, 334, 482: 334, 490: 334, 492: 334, 573: 334, 582: 334, 586: 334, 638: 334, 642: 334, 334, 334}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4537}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4538}, {335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 47: 335, 472: 335, 476: 335, 335, 335, 335, 482: 335, 490: 335, 492: 335, 573: 335, 582: 335, 586: 335, 638: 335, 642: 335, 335, 335}, // 2030 - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4540}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4541}, {336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 47: 336, 472: 336, 476: 336, 336, 336, 336, 482: 336, 490: 336, 492: 336, 573: 336, 582: 336, 586: 336, 638: 336, 642: 336, 336, 336}, {337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 47: 337, 472: 337, 476: 337, 337, 337, 337, 482: 337, 490: 337, 492: 337, 573: 337, 582: 337, 586: 337, 638: 337, 642: 337, 337, 337}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3804, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3805, 543: 3801, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3803, 772: 3802, 797: 4543}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 14: 3805, 47: 273, 472: 273, 476: 273, 273, 273, 273, 482: 273, 490: 273, 492: 273, 506: 3806, 543: 3802, 573: 273, 582: 273, 586: 273, 638: 273, 642: 273, 273, 273, 646: 3804, 772: 3803, 797: 4544}, {338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 47: 338, 472: 338, 476: 338, 338, 338, 338, 482: 338, 490: 338, 492: 338, 573: 338, 582: 338, 586: 338, 638: 338, 642: 338, 338, 338}, // 2035 {339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 47: 339, 472: 339, 476: 339, 339, 339, 339, 482: 339, 490: 339, 492: 339, 573: 339, 582: 339, 586: 339, 638: 339, 642: 339, 339, 339}, {341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 47: 341, 49: 341, 472: 341, 341, 476: 341, 341, 341, 341, 482: 341, 490: 341, 492: 341, 573: 341, 582: 341, 586: 341, 638: 341, 642: 341, 341, 341, 739: 341, 741: 341}, {364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 47: 364, 472: 364, 476: 364, 364, 364, 364, 482: 364, 490: 364, 492: 364, 573: 364, 582: 364, 586: 364, 638: 364, 642: 364, 364, 364}, - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4547}, - {365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 47: 365, 49: 4488, 472: 365, 476: 365, 365, 365, 365, 482: 365, 490: 365, 492: 365, 573: 365, 582: 365, 586: 365, 638: 365, 642: 365, 365, 365, 739: 4487, 741: 4489, 873: 4490}, + {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4548}, + {365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 47: 365, 49: 4489, 472: 365, 476: 365, 365, 365, 365, 482: 365, 490: 365, 492: 365, 573: 365, 582: 365, 586: 365, 638: 365, 642: 365, 365, 365, 739: 4488, 741: 4490, 873: 4491}, // 2040 - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4549}, - {366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 47: 366, 49: 4488, 472: 366, 476: 366, 366, 366, 366, 482: 366, 490: 366, 492: 366, 573: 366, 582: 366, 586: 366, 638: 366, 642: 366, 366, 366, 739: 4487, 741: 4489, 873: 4490}, - {367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 47: 367, 49: 4488, 472: 367, 476: 367, 367, 367, 367, 482: 367, 490: 367, 492: 367, 573: 367, 582: 367, 586: 367, 638: 367, 642: 367, 367, 367, 739: 4487, 741: 4489, 873: 4490}, - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4552}, - {368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 47: 368, 49: 4488, 472: 368, 476: 368, 368, 368, 368, 482: 368, 490: 368, 492: 368, 573: 368, 582: 368, 586: 368, 638: 368, 642: 368, 368, 368, 739: 4487, 741: 4489, 873: 4490}, + {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4550}, + {366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 47: 366, 49: 4489, 472: 366, 476: 366, 366, 366, 366, 482: 366, 490: 366, 492: 366, 573: 366, 582: 366, 586: 366, 638: 366, 642: 366, 366, 366, 739: 4488, 741: 4490, 873: 4491}, + {367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 47: 367, 49: 4489, 472: 367, 476: 367, 367, 367, 367, 482: 367, 490: 367, 492: 367, 573: 367, 582: 367, 586: 367, 638: 367, 642: 367, 367, 367, 739: 4488, 741: 4490, 873: 4491}, + {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 47: 281, 49: 281, 472: 281, 476: 281, 281, 281, 281, 482: 281, 490: 281, 492: 281, 573: 281, 582: 281, 586: 281, 638: 281, 642: 281, 281, 281, 739: 281, 741: 281, 874: 4553}, + {368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 47: 368, 49: 4489, 472: 368, 476: 368, 368, 368, 368, 482: 368, 490: 368, 492: 368, 573: 368, 582: 368, 586: 368, 638: 368, 642: 368, 368, 368, 739: 4488, 741: 4490, 873: 4491}, // 2045 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 573: 2381, 582: 2381, 586: 2381, 638: 2381, 648: 2381, 663: 4686, 2731, 2732, 2730, 674: 2381, 2381, 1141: 4685}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 573: 2381, 582: 2381, 586: 2381, 638: 2381, 648: 2381, 663: 4687, 2732, 2733, 2731, 674: 2381, 2381, 1141: 4686}, {2315, 2315, 2315, 2315, 7: 2315, 2315, 2315, 47: 2315, 490: 2315}, {573: 2292}, - {492: 4684}, + {492: 4685}, {2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282, 47: 2282, 472: 2282, 476: 2282, 2282, 2282, 2282, 482: 2282, 490: 2282, 492: 2282, 573: 2282, 582: 2282, 586: 2282, 638: 2282, 642: 2282, 2282, 2282}, // 2050 {2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 47: 2281, 472: 2281, 476: 2281, 2281, 2281, 2281, 482: 2281, 490: 2281, 492: 2281, 573: 2281, 582: 2281, 586: 2281, 638: 2281, 642: 2281, 2281, 2281}, - {573: 4680}, - {2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 47: 2278, 472: 2278, 476: 2278, 2278, 2278, 2278, 482: 2278, 490: 2278, 492: 2278, 573: 4679, 582: 2278, 586: 2278, 638: 2278, 642: 2278, 2278, 2278}, - {149: 4667, 265: 4669, 360: 4670, 473: 4666, 475: 3208, 485: 4408, 4409, 492: 3199, 508: 3203, 571: 3198, 3200, 574: 3202, 3201, 577: 3206, 580: 3207, 588: 4654, 4651, 591: 4652, 4653, 3205, 711: 4407, 3204, 4664, 944: 4649, 4650, 4668, 994: 4665, 1079: 4662, 1131: 4663, 1199: 4661}, - {479: 4659}, + {573: 4681}, + {2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 2278, 47: 2278, 472: 2278, 476: 2278, 2278, 2278, 2278, 482: 2278, 490: 2278, 492: 2278, 573: 4680, 582: 2278, 586: 2278, 638: 2278, 642: 2278, 2278, 2278}, + {149: 4668, 265: 4670, 360: 4671, 473: 4667, 475: 3209, 485: 4409, 4410, 492: 3200, 508: 3204, 571: 3199, 3201, 574: 3203, 3202, 577: 3207, 580: 3208, 588: 4655, 4652, 591: 4653, 4654, 3206, 711: 4408, 3205, 4665, 944: 4650, 4651, 4669, 994: 4666, 1079: 4663, 1131: 4664, 1199: 4662}, + {479: 4660}, // 2055 - {653: 4647}, - {475: 4646}, - {582: 4637}, - {478: 4630}, + {653: 4648}, + {475: 4647}, + {582: 4638}, + {478: 4631}, {2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 2270, 47: 2270, 472: 2270, 476: 2270, 2270, 2270, 2270, 482: 2270, 490: 2270, 492: 2270, 573: 2270, 582: 2270, 586: 2270, 638: 2270, 642: 2270, 2270, 2270}, // 2060 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3457, 663: 3459, 2731, 2732, 2730, 737: 3456, 870: 4629}, - {175: 4627, 200: 4628, 479: 4626, 1184: 4625}, - {180: 4624, 242: 4623, 479: 4622, 1302: 4621}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3794, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3795, 785: 4620}, - {307: 4619}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3458, 663: 3460, 2732, 2733, 2731, 737: 3457, 870: 4630}, + {175: 4628, 200: 4629, 479: 4627, 1184: 4626}, + {180: 4625, 242: 4624, 479: 4623, 1302: 4622}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 47: 286, 472: 286, 3795, 476: 286, 286, 286, 286, 482: 286, 490: 286, 492: 286, 573: 286, 582: 286, 586: 286, 638: 286, 642: 286, 286, 286, 762: 3796, 785: 4621}, + {307: 4620}, // 2065 {2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 2254, 47: 2254, 472: 2254, 476: 2254, 2254, 2254, 2254, 482: 2254, 490: 2254, 492: 2254, 573: 2254, 582: 2254, 586: 2254, 638: 2254, 642: 2254, 2254, 2254}, - {2251, 2251, 2251, 2251, 4564, 4570, 4558, 2251, 2251, 2251, 4562, 4571, 4569, 47: 2251, 472: 4563, 476: 4057, 4056, 2259, 4561, 482: 4568, 490: 2251, 492: 4557, 573: 2293, 582: 2382, 586: 4555, 638: 4560, 642: 4553, 4575, 4572, 809: 4556, 831: 4565, 908: 4567, 926: 4618, 935: 4566, 954: 4559}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4576}, - {2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 47: 2191, 472: 2191, 4578, 476: 2191, 2191, 2191, 2191, 482: 2191, 490: 2191, 492: 2191, 573: 2191, 582: 2191, 586: 2191, 638: 2191, 642: 2191, 2191, 2191, 647: 2191, 1227: 4577}, - {2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 47: 2241, 472: 2241, 476: 2241, 2241, 2241, 2241, 482: 2241, 490: 2241, 492: 2241, 573: 2241, 582: 2241, 586: 2241, 638: 2241, 642: 2241, 2241, 2241, 647: 4593, 1243: 4594, 4595}, + {2251, 2251, 2251, 2251, 4565, 4571, 4559, 2251, 2251, 2251, 4563, 4572, 4570, 47: 2251, 472: 4564, 476: 4058, 4057, 2259, 4562, 482: 4569, 490: 2251, 492: 4558, 573: 2293, 582: 2382, 586: 4556, 638: 4561, 642: 4554, 4576, 4573, 809: 4557, 831: 4566, 908: 4568, 926: 4619, 935: 4567, 954: 4560}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4577}, + {2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 47: 2191, 472: 2191, 4579, 476: 2191, 2191, 2191, 2191, 482: 2191, 490: 2191, 492: 2191, 573: 2191, 582: 2191, 586: 2191, 638: 2191, 642: 2191, 2191, 2191, 647: 2191, 1227: 4578}, + {2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 2241, 47: 2241, 472: 2241, 476: 2241, 2241, 2241, 2241, 482: 2241, 490: 2241, 492: 2241, 573: 2241, 582: 2241, 586: 2241, 638: 2241, 642: 2241, 2241, 2241, 647: 4594, 1243: 4595, 4596}, // 2070 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 4579}, - {7: 4591, 47: 4590}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 4580}, + {7: 4592, 47: 4591}, {7: 2189, 47: 2189}, - {7: 286, 47: 286, 473: 3794, 529: 286, 286, 762: 3795, 785: 4588}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4583}, + {7: 286, 47: 286, 473: 3795, 529: 286, 286, 762: 3796, 785: 4589}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4584}, // 2075 - {47: 4584, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {7: 1290, 47: 1290, 529: 4587, 4586, 947: 4585}, + {47: 4585, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {7: 1290, 47: 1290, 529: 4588, 4587, 947: 4586}, {7: 2186, 47: 2186}, {1289, 1289, 1289, 1289, 7: 1289, 47: 1289, 490: 1289}, {1288, 1288, 1288, 1288, 7: 1288, 47: 1288, 490: 1288}, // 2080 - {7: 1290, 47: 1290, 529: 4587, 4586, 947: 4589}, + {7: 1290, 47: 1290, 529: 4588, 4587, 947: 4590}, {7: 2187, 47: 2187}, {2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 47: 2190, 472: 2190, 476: 2190, 2190, 2190, 2190, 482: 2190, 490: 2190, 492: 2190, 573: 2190, 582: 2190, 586: 2190, 638: 2190, 642: 2190, 2190, 2190, 647: 2190}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4592}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4593}, {7: 2188, 47: 2188}, // 2085 - {204: 4615, 368: 4616, 386: 4617}, + {204: 4616, 368: 4617, 386: 4618}, {2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 2240, 47: 2240, 472: 2240, 476: 2240, 2240, 2240, 2240, 482: 2240, 490: 2240, 492: 2240, 573: 2240, 582: 2240, 586: 2240, 638: 2240, 642: 2240, 2240, 2240}, - {2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 47: 2236, 472: 4597, 476: 2236, 2236, 2236, 2236, 482: 2236, 490: 2236, 492: 2236, 573: 2236, 582: 2236, 586: 2236, 638: 2236, 642: 2236, 2236, 2236, 1085: 4598, 4599, 1250: 4596}, + {2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 47: 2236, 472: 4598, 476: 2236, 2236, 2236, 2236, 482: 2236, 490: 2236, 492: 2236, 573: 2236, 582: 2236, 586: 2236, 638: 2236, 642: 2236, 2236, 2236, 1085: 4599, 4600, 1250: 4597}, {2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 2239, 47: 2239, 472: 2239, 476: 2239, 2239, 2239, 2239, 482: 2239, 490: 2239, 492: 2239, 573: 2239, 582: 2239, 586: 2239, 638: 2239, 642: 2239, 2239, 2239}, - {653: 4613, 738: 4602}, + {653: 4614, 738: 4603}, // 2090 - {2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 47: 2235, 472: 4611, 476: 2235, 2235, 2235, 2235, 482: 2235, 490: 2235, 492: 2235, 573: 2235, 582: 2235, 586: 2235, 638: 2235, 642: 2235, 2235, 2235, 1086: 4612}, - {2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 47: 2234, 472: 4600, 476: 2234, 2234, 2234, 2234, 482: 2234, 490: 2234, 492: 2234, 573: 2234, 582: 2234, 586: 2234, 638: 2234, 642: 2234, 2234, 2234, 1085: 4601}, - {738: 4602}, + {2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 47: 2235, 472: 4612, 476: 2235, 2235, 2235, 2235, 482: 2235, 490: 2235, 492: 2235, 573: 2235, 582: 2235, 586: 2235, 638: 2235, 642: 2235, 2235, 2235, 1086: 4613}, + {2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 47: 2234, 472: 4601, 476: 2234, 2234, 2234, 2234, 482: 2234, 490: 2234, 492: 2234, 573: 2234, 582: 2234, 586: 2234, 638: 2234, 642: 2234, 2234, 2234, 1085: 4602}, + {738: 4603}, {2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 47: 2232, 472: 2232, 476: 2232, 2232, 2232, 2232, 482: 2232, 490: 2232, 492: 2232, 573: 2232, 582: 2232, 586: 2232, 638: 2232, 642: 2232, 2232, 2232}, - {70: 4607, 504: 4606, 669: 4605, 671: 4604, 1108: 4603}, + {70: 4608, 504: 4607, 669: 4606, 671: 4605, 1108: 4604}, // 2095 {2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238, 47: 2238, 472: 2238, 476: 2238, 2238, 2238, 2238, 482: 2238, 490: 2238, 492: 2238, 573: 2238, 582: 2238, 586: 2238, 638: 2238, 642: 2238, 2238, 2238}, {2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 47: 2231, 472: 2231, 476: 2231, 2231, 2231, 2231, 482: 2231, 490: 2231, 492: 2231, 573: 2231, 582: 2231, 586: 2231, 638: 2231, 642: 2231, 2231, 2231}, {2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 47: 2230, 472: 2230, 476: 2230, 2230, 2230, 2230, 482: 2230, 490: 2230, 492: 2230, 573: 2230, 582: 2230, 586: 2230, 638: 2230, 642: 2230, 2230, 2230}, - {479: 4610, 492: 4609}, - {303: 4608}, + {479: 4611, 492: 4610}, + {303: 4609}, // 2100 {2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 47: 2228, 472: 2228, 476: 2228, 2228, 2228, 2228, 482: 2228, 490: 2228, 492: 2228, 573: 2228, 582: 2228, 586: 2228, 638: 2228, 642: 2228, 2228, 2228}, {2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 47: 2229, 472: 2229, 476: 2229, 2229, 2229, 2229, 482: 2229, 490: 2229, 492: 2229, 573: 2229, 582: 2229, 586: 2229, 638: 2229, 642: 2229, 2229, 2229}, {2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 47: 2227, 472: 2227, 476: 2227, 2227, 2227, 2227, 482: 2227, 490: 2227, 492: 2227, 573: 2227, 582: 2227, 586: 2227, 638: 2227, 642: 2227, 2227, 2227}, - {653: 4613}, + {653: 4614}, {2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 47: 2233, 472: 2233, 476: 2233, 2233, 2233, 2233, 482: 2233, 490: 2233, 492: 2233, 573: 2233, 582: 2233, 586: 2233, 638: 2233, 642: 2233, 2233, 2233}, // 2105 - {70: 4607, 504: 4606, 669: 4605, 671: 4604, 1108: 4614}, + {70: 4608, 504: 4607, 669: 4606, 671: 4605, 1108: 4615}, {2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 47: 2237, 472: 2237, 476: 2237, 2237, 2237, 2237, 482: 2237, 490: 2237, 492: 2237, 573: 2237, 582: 2237, 586: 2237, 638: 2237, 642: 2237, 2237, 2237}, {2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 47: 2244, 472: 2244, 476: 2244, 2244, 2244, 2244, 482: 2244, 490: 2244, 492: 2244, 573: 2244, 582: 2244, 586: 2244, 638: 2244, 642: 2244, 2244, 2244}, {2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 47: 2243, 472: 2243, 476: 2243, 2243, 2243, 2243, 482: 2243, 490: 2243, 492: 2243, 573: 2243, 582: 2243, 586: 2243, 638: 2243, 642: 2243, 2243, 2243}, @@ -8660,42 +8661,42 @@ var ( // 2120 {2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 47: 2260, 472: 2260, 476: 2260, 2260, 2260, 2260, 482: 2260, 490: 2260, 492: 2260, 573: 2260, 582: 2260, 586: 2260, 638: 2260, 642: 2260, 2260, 2260}, {2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 2269, 47: 2269, 472: 2269, 476: 2269, 2269, 2269, 2269, 482: 2269, 490: 2269, 492: 2269, 573: 2269, 582: 2269, 586: 2269, 638: 2269, 642: 2269, 2269, 2269}, - {473: 4631}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4632}, - {47: 4633, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {473: 4632}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4633}, + {47: 4634, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, // 2125 - {2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 47: 2257, 472: 2257, 476: 2257, 2257, 2257, 2257, 482: 2257, 490: 2257, 492: 2257, 573: 2257, 582: 2257, 586: 2257, 638: 2257, 642: 2257, 2257, 2257, 1303: 4636, 1333: 4635, 4634}, + {2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257, 47: 2257, 472: 2257, 476: 2257, 2257, 2257, 2257, 482: 2257, 490: 2257, 492: 2257, 573: 2257, 582: 2257, 586: 2257, 638: 2257, 642: 2257, 2257, 2257, 1303: 4637, 1333: 4636, 4635}, {2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 2271, 47: 2271, 472: 2271, 476: 2271, 2271, 2271, 2271, 482: 2271, 490: 2271, 492: 2271, 573: 2271, 582: 2271, 586: 2271, 638: 2271, 642: 2271, 2271, 2271}, {2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 2256, 47: 2256, 472: 2256, 476: 2256, 2256, 2256, 2256, 482: 2256, 490: 2256, 492: 2256, 573: 2256, 582: 2256, 586: 2256, 638: 2256, 642: 2256, 2256, 2256}, {2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255, 47: 2255, 472: 2255, 476: 2255, 2255, 2255, 2255, 482: 2255, 490: 2255, 492: 2255, 573: 2255, 582: 2255, 586: 2255, 638: 2255, 642: 2255, 2255, 2255}, - {473: 4638}, + {473: 4639}, // 2130 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4639}, - {47: 4640, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 47: 2287, 147: 4397, 472: 2287, 476: 4057, 4056, 2287, 2287, 482: 2287, 490: 2287, 492: 2287, 573: 2287, 582: 2287, 586: 2287, 638: 2287, 642: 2287, 2287, 2287, 809: 4641, 932: 4642, 1039: 4643, 1203: 4644}, - {147: 4399, 492: 4645}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4640}, + {47: 4641, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287, 47: 2287, 147: 4398, 472: 2287, 476: 4058, 4057, 2287, 2287, 482: 2287, 490: 2287, 492: 2287, 573: 2287, 582: 2287, 586: 2287, 638: 2287, 642: 2287, 2287, 2287, 809: 4642, 932: 4643, 1039: 4644, 1203: 4645}, + {147: 4400, 492: 4646}, {2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 2286, 47: 2286, 472: 2286, 476: 2286, 2286, 2286, 2286, 482: 2286, 490: 2286, 492: 2286, 573: 2286, 582: 2286, 586: 2286, 638: 2286, 642: 2286, 2286, 2286}, // 2135 {2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 2284, 47: 2284, 472: 2284, 476: 2284, 2284, 2284, 2284, 482: 2284, 490: 2284, 492: 2284, 573: 2284, 582: 2284, 586: 2284, 638: 2284, 642: 2284, 2284, 2284}, {2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272, 47: 2272, 472: 2272, 476: 2272, 2272, 2272, 2272, 482: 2272, 490: 2272, 492: 2272, 573: 2272, 582: 2272, 586: 2272, 638: 2272, 642: 2272, 2272, 2272}, {2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 2285, 47: 2285, 472: 2285, 476: 2285, 2285, 2285, 2285, 482: 2285, 490: 2285, 492: 2285, 573: 2285, 582: 2285, 586: 2285, 638: 2285, 642: 2285, 2285, 2285}, {2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 2273, 47: 2273, 472: 2273, 476: 2273, 2273, 2273, 2273, 482: 2273, 490: 2273, 492: 2273, 573: 2273, 582: 2273, 586: 2273, 638: 2273, 642: 2273, 2273, 2273}, - {588: 4654, 4651, 591: 4652, 4653, 944: 4649, 4650, 4648}, + {588: 4655, 4652, 591: 4653, 4654, 944: 4650, 4651, 4649}, // 2140 {2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 2274, 47: 2274, 472: 2274, 476: 2274, 2274, 2274, 2274, 482: 2274, 490: 2274, 492: 2274, 573: 2274, 582: 2274, 586: 2274, 638: 2274, 642: 2274, 2274, 2274}, {2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 47: 2217, 472: 2217, 476: 2217, 2217, 2217, 2217, 482: 2217, 490: 2217, 492: 2217, 573: 2217, 582: 2217, 586: 2217, 638: 2217, 642: 2217, 2217, 2217}, - {473: 4655}, + {473: 4656}, {2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 47: 2208, 472: 2208, 2212, 476: 2208, 2208, 2208, 2208, 482: 2208, 490: 2208, 492: 2208, 573: 2208, 582: 2208, 586: 2208, 638: 2208, 642: 2208, 2208, 2208}, {2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 47: 2207, 472: 2207, 2211, 476: 2207, 2207, 2207, 2207, 482: 2207, 490: 2207, 492: 2207, 573: 2207, 582: 2207, 586: 2207, 638: 2207, 642: 2207, 2207, 2207}, // 2145 {2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 47: 2206, 472: 2206, 2210, 476: 2206, 2206, 2206, 2206, 482: 2206, 490: 2206, 492: 2206, 573: 2206, 582: 2206, 586: 2206, 638: 2206, 642: 2206, 2206, 2206}, {473: 2209}, - {47: 4656, 508: 2705, 732: 4657}, + {47: 4657, 508: 2706, 732: 4658}, {2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 47: 2216, 472: 2216, 476: 2216, 2216, 2216, 2216, 482: 2216, 490: 2216, 492: 2216, 573: 2216, 582: 2216, 586: 2216, 638: 2216, 642: 2216, 2216, 2216}, - {47: 4658}, + {47: 4659}, // 2150 {2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 47: 2215, 472: 2215, 476: 2215, 2215, 2215, 2215, 482: 2215, 490: 2215, 492: 2215, 573: 2215, 582: 2215, 586: 2215, 638: 2215, 642: 2215, 2215, 2215}, - {154: 4660}, + {154: 4661}, {2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 2275, 47: 2275, 472: 2275, 476: 2275, 2275, 2275, 2275, 482: 2275, 490: 2275, 492: 2275, 573: 2275, 582: 2275, 586: 2275, 638: 2275, 642: 2275, 2275, 2275}, {2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 2276, 47: 2276, 472: 2276, 476: 2276, 2276, 2276, 2276, 482: 2276, 490: 2276, 492: 2276, 573: 2276, 582: 2276, 586: 2276, 638: 2276, 642: 2276, 2276, 2276}, {2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 47: 2226, 472: 2226, 476: 2226, 2226, 2226, 2226, 482: 2226, 490: 2226, 492: 2226, 573: 2226, 582: 2226, 586: 2226, 638: 2226, 642: 2226, 2226, 2226}, @@ -8703,24 +8704,24 @@ var ( {2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 47: 2225, 472: 2225, 476: 2225, 2225, 2225, 2225, 482: 2225, 490: 2225, 492: 2225, 573: 2225, 582: 2225, 586: 2225, 638: 2225, 642: 2225, 2225, 2225}, {2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 47: 2224, 472: 2224, 476: 2224, 2224, 2224, 2224, 482: 2224, 490: 2224, 492: 2224, 573: 2224, 582: 2224, 586: 2224, 638: 2224, 642: 2224, 2224, 2224}, {2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 47: 2223, 472: 2223, 476: 2223, 2223, 2223, 2223, 482: 2223, 490: 2223, 492: 2223, 573: 2223, 582: 2223, 586: 2223, 638: 2223, 642: 2223, 2223, 2223}, - {149: 4667, 473: 4666, 588: 4654, 4651, 591: 4652, 4653, 944: 4649, 4650, 4668, 994: 4675, 1079: 4676}, - {473: 4671}, + {149: 4668, 473: 4667, 588: 4655, 4652, 591: 4653, 4654, 944: 4650, 4651, 4669, 994: 4676, 1079: 4677}, + {473: 4672}, // 2160 {2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 47: 2218, 472: 2218, 476: 2218, 2218, 2218, 2218, 482: 2218, 490: 2218, 492: 2218, 573: 2218, 582: 2218, 586: 2218, 638: 2218, 642: 2218, 2218, 2218}, - {154: 4147}, - {473: 4144}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 4672, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 4673}, + {154: 4148}, + {473: 4145}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 4673, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 4674}, {2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 47: 2221, 472: 2221, 476: 2221, 2221, 2221, 2221, 482: 2221, 490: 2221, 492: 2221, 573: 2221, 582: 2221, 586: 2221, 638: 2221, 642: 2221, 2221, 2221}, // 2165 - {7: 3558, 47: 4674}, + {7: 3559, 47: 4675}, {2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 47: 2220, 472: 2220, 476: 2220, 2220, 2220, 2220, 482: 2220, 490: 2220, 492: 2220, 573: 2220, 582: 2220, 586: 2220, 638: 2220, 642: 2220, 2220, 2220}, + {47: 4679}, {47: 4678}, - {47: 4677}, {2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 47: 2219, 472: 2219, 476: 2219, 2219, 2219, 2219, 482: 2219, 490: 2219, 492: 2219, 573: 2219, 582: 2219, 586: 2219, 638: 2219, 642: 2219, 2219, 2219}, // 2170 {2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 47: 2222, 472: 2222, 476: 2222, 2222, 2222, 2222, 482: 2222, 490: 2222, 492: 2222, 573: 2222, 582: 2222, 586: 2222, 638: 2222, 642: 2222, 2222, 2222}, {2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 2277, 47: 2277, 472: 2277, 476: 2277, 2277, 2277, 2277, 482: 2277, 490: 2277, 492: 2277, 573: 2277, 582: 2277, 586: 2277, 638: 2277, 642: 2277, 2277, 2277}, - {2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 47: 2280, 83: 4681, 85: 4682, 472: 2280, 476: 2280, 2280, 2280, 2280, 482: 2280, 490: 2280, 492: 2280, 573: 2280, 582: 2280, 586: 2280, 638: 2280, 642: 2280, 2280, 2280, 867: 4683}, + {2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 2280, 47: 2280, 83: 4682, 85: 4683, 472: 2280, 476: 2280, 2280, 2280, 2280, 482: 2280, 490: 2280, 492: 2280, 573: 2280, 582: 2280, 586: 2280, 638: 2280, 642: 2280, 2280, 2280, 867: 4684}, {2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 2408, 17: 2408, 47: 2408, 81: 2408, 2408, 2408, 2408, 2408, 87: 2408, 472: 2408, 474: 2408, 476: 2408, 2408, 2408, 2408, 481: 2408, 2408, 490: 2408, 492: 2408, 496: 2408, 573: 2408, 582: 2408, 586: 2408, 638: 2408, 642: 2408, 2408, 2408}, {2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 2407, 17: 2407, 47: 2407, 81: 2407, 2407, 2407, 2407, 2407, 87: 2407, 472: 2407, 474: 2407, 476: 2407, 2407, 2407, 2407, 481: 2407, 2407, 490: 2407, 492: 2407, 496: 2407, 573: 2407, 582: 2407, 586: 2407, 638: 2407, 642: 2407, 2407, 2407}, // 2175 @@ -8732,543 +8733,543 @@ var ( // 2180 {2438, 2438, 2438, 2438, 7: 2438, 490: 2438}, {2390, 2390, 2390, 2390, 7: 2390, 490: 2390}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4691}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4692}, {2389, 2389, 2389, 2389, 7: 2389, 490: 2389}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4693}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4694}, // 2185 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4420, 846: 4694}, - {2391, 2391, 2391, 2391, 7: 2391, 4689, 4690, 490: 2391, 927: 4695}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4421, 846: 4695}, + {2391, 2391, 2391, 2391, 7: 2391, 4690, 4691, 490: 2391, 927: 4696}, {2439, 2439, 2439, 2439, 7: 2439, 490: 2439}, {2440, 2440, 2440, 2440, 7: 2440, 490: 2440}, {2441, 2441, 2441, 2441, 7: 2441, 490: 2441}, // 2190 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4701, 983: 4700, 1164: 4699}, - {2442, 2442, 2442, 2442, 7: 4703, 490: 2442}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4702, 983: 4701, 1164: 4700}, + {2442, 2442, 2442, 2442, 7: 4704, 490: 2442}, {1300, 1300, 1300, 1300, 7: 1300, 490: 1300}, - {1290, 1290, 1290, 1290, 7: 1290, 490: 1290, 529: 4587, 4586, 947: 4702}, + {1290, 1290, 1290, 1290, 7: 1290, 490: 1290, 529: 4588, 4587, 947: 4703}, {1298, 1298, 1298, 1298, 7: 1298, 490: 1298}, // 2195 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4701, 983: 4704}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4702, 983: 4705}, {1299, 1299, 1299, 1299, 7: 1299, 490: 1299}, - {2: 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4708, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 650: 564, 817: 4707, 835: 4706}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4709}, + {2: 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4709, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 650: 564, 817: 4708, 835: 4707}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4710}, {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, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 48: 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 473: 563, 490: 563, 508: 563, 543: 563, 569: 563, 650: 563}, // 2200 {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, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 48: 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 473: 562, 490: 562, 508: 562, 543: 562, 569: 562, 650: 562}, {2445, 2445, 2445, 2445, 7: 2445, 490: 2445}, {2414, 2414, 2414, 2414, 7: 2414, 18: 2414, 490: 2414}, - {2413, 2413, 2413, 2413, 7: 4713, 18: 2413, 490: 2413}, + {2413, 2413, 2413, 2413, 7: 4714, 18: 2413, 490: 2413}, {2384, 2384, 2384, 2384, 7: 2384, 18: 2384, 47: 2384, 98: 2384, 161: 2384, 474: 2384, 490: 2384, 495: 2384, 648: 2384, 650: 2384}, // 2205 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4714, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4715, 2732, 2733, 2731}, {2383, 2383, 2383, 2383, 7: 2383, 18: 2383, 47: 2383, 98: 2383, 161: 2383, 474: 2383, 490: 2383, 495: 2383, 648: 2383, 650: 2383}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4717}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4718}, {2446, 2446, 2446, 2446, 7: 2446, 490: 2446}, - {18: 4718}, + {18: 4719}, // 2210 {2448, 2448, 2448, 2448, 7: 2448, 490: 2448}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4721}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4722}, {2447, 2447, 2447, 2447, 7: 2447, 490: 2447}, - {18: 4722}, + {18: 4723}, {2449, 2449, 2449, 2449, 7: 2449, 490: 2449}, // 2215 - {2: 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4708, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 650: 564, 817: 4707, 835: 4724}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4725}, + {2: 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4709, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 650: 564, 817: 4708, 835: 4725}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4726}, {2450, 2450, 2450, 2450, 7: 2450, 490: 2450}, - {2: 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4708, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 650: 564, 817: 4707, 835: 4727}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4728}, + {2: 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4709, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 650: 564, 817: 4708, 835: 4728}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4729}, // 2220 {2451, 2451, 2451, 2451, 7: 2451, 490: 2451}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4731}, {2452, 2452, 2452, 2452, 7: 2452, 490: 2452}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4732, 2731, 2732, 2730}, - {474: 4733}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4733, 2732, 2733, 2731}, + {474: 4734}, // 2225 - {569: 4734}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 4735}, - {2412, 2412, 2412, 2412, 7: 2412, 219: 4739, 474: 4738, 490: 2412, 1344: 4737, 4736}, + {569: 4735}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 4736}, + {2412, 2412, 2412, 2412, 7: 2412, 219: 4740, 474: 4739, 490: 2412, 1344: 4738, 4737}, {2453, 2453, 2453, 2453, 7: 2453, 490: 2453}, {2411, 2411, 2411, 2411, 7: 2411, 490: 2411}, // 2230 + {194: 4742}, {194: 4741}, - {194: 4740}, {2409, 2409, 2409, 2409, 7: 2409, 490: 2409}, {2410, 2410, 2410, 2410, 7: 2410, 490: 2410}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4760}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4761}, // 2235 - {573: 4759}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4757}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4755}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4753}, - {573: 4750}, + {573: 4760}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4758}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4756}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4754}, + {573: 4751}, // 2240 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4749, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4750, 2732, 2733, 2731}, {2420, 2420, 2420, 2420, 7: 2420, 490: 2420}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 4751}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4686, 2731, 2732, 2730, 1141: 4752}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 4752}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4687, 2732, 2733, 2731, 1141: 4753}, {2443, 2443, 2443, 2443, 7: 2443, 490: 2443}, // 2245 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4754, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4755, 2732, 2733, 2731}, {2444, 2444, 2444, 2444, 7: 2444, 490: 2444}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4756, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4757, 2732, 2733, 2731}, {2454, 2454, 2454, 2454, 7: 2454, 490: 2454}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 4758}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 4759}, // 2250 - {2455, 2455, 2455, 2455, 7: 4713, 490: 2455}, + {2455, 2455, 2455, 2455, 7: 4714, 490: 2455}, {2456, 2456, 2456, 2456, 7: 2456, 490: 2456}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4761}, - {2042, 2042, 2042, 2042, 7: 2042, 490: 2042, 669: 4764, 671: 4763, 909: 4762}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4762}, + {2042, 2042, 2042, 2042, 7: 2042, 490: 2042, 669: 4765, 671: 4764, 909: 4763}, {2457, 2457, 2457, 2457, 7: 2457, 490: 2457}, // 2255 {2041, 2041, 2041, 2041, 7: 2041, 490: 2041}, {2040, 2040, 2040, 2040, 7: 2040, 490: 2040}, - {136: 4708, 508: 564, 817: 4707, 835: 4766}, - {508: 2705, 732: 4767}, + {136: 4709, 508: 564, 817: 4708, 835: 4767}, + {508: 2706, 732: 4768}, {2458, 2458, 2458, 2458, 7: 2458, 490: 2458}, // 2260 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 650: 4710, 663: 4712, 2731, 2732, 2730, 788: 4711, 830: 4769}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 650: 4711, 663: 4713, 2732, 2733, 2731, 788: 4712, 830: 4770}, {2459, 2459, 2459, 2459, 7: 2459, 490: 2459}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 473: 1848, 566: 4788, 784: 4902}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 473: 1848, 566: 4789, 784: 4903}, {2465, 2465, 2465, 2465, 7: 2465, 490: 2465}, - {1848, 1848, 1848, 1848, 7: 1848, 105: 1848, 136: 1848, 473: 1848, 490: 1848, 566: 4788, 784: 4856, 817: 1848}, + {1848, 1848, 1848, 1848, 7: 1848, 105: 1848, 136: 1848, 473: 1848, 490: 1848, 566: 4789, 784: 4857, 817: 1848}, // 2265 - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 4847}, - {573: 4374, 582: 4780, 586: 4775, 638: 4778, 648: 4375, 674: 4779, 4776, 827: 4777, 1192: 4781}, - {573: 4841}, - {2: 2395, 2395, 2395, 2395, 2395, 8: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 48: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 473: 2395, 573: 4374, 648: 4375, 827: 4797, 1065: 4835}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 473: 1848, 481: 1848, 566: 4788, 784: 4829}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 4848}, + {573: 4375, 582: 4781, 586: 4776, 638: 4779, 648: 4376, 674: 4780, 4777, 827: 4778, 1192: 4782}, + {573: 4842}, + {2: 2395, 2395, 2395, 2395, 2395, 8: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 48: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 473: 2395, 573: 4375, 648: 4376, 827: 4798, 1065: 4836}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 473: 1848, 481: 1848, 566: 4789, 784: 4830}, // 2270 - {2: 2395, 2395, 2395, 2395, 2395, 8: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 48: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 473: 2395, 481: 2395, 573: 4374, 648: 4375, 827: 4797, 1065: 4798}, - {573: 4786}, - {473: 4782}, + {2: 2395, 2395, 2395, 2395, 2395, 8: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 48: 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, 473: 2395, 481: 2395, 573: 4375, 648: 4376, 827: 4798, 1065: 4799}, + {573: 4787}, + {473: 4783}, {440, 440, 440, 440, 7: 440, 47: 440, 490: 440}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4783}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4784}, // 2275 - {47: 4784, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2287, 2287, 2287, 2287, 7: 2287, 47: 2287, 147: 4397, 476: 4057, 4056, 490: 2287, 809: 4398, 932: 4642, 1039: 4785}, + {47: 4785, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2287, 2287, 2287, 2287, 7: 2287, 47: 2287, 147: 4398, 476: 4058, 4057, 490: 2287, 809: 4399, 932: 4643, 1039: 4786}, {2245, 2245, 2245, 2245, 7: 2245, 47: 2245, 490: 2245}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 473: 1848, 566: 4788, 784: 4787}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 1844, 663: 4792, 2731, 2732, 2730, 876: 4791}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 473: 1848, 566: 4789, 784: 4788}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 1844, 663: 4793, 2732, 2733, 2731, 876: 4792}, // 2280 - {476: 4057, 4056, 809: 4789}, - {584: 4790}, + {476: 4058, 4057, 809: 4790}, + {584: 4791}, {1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 48: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 473: 1847, 475: 1847, 481: 1847, 490: 1847, 570: 1847, 817: 1847}, - {473: 4793}, + {473: 4794}, {473: 1843}, // 2285 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 4794}, - {7: 4591, 47: 4795}, - {643: 4575, 908: 4796}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 4795}, + {7: 4592, 47: 4796}, + {643: 4576, 908: 4797}, {2246, 2246, 2246, 2246, 7: 2246, 47: 2246, 490: 2246}, {2: 2394, 2394, 2394, 2394, 2394, 8: 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 48: 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 2394, 473: 2394, 481: 2394}, // 2290 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 1844, 481: 1844, 663: 4800, 2731, 2732, 2730, 876: 4801, 940: 4799}, - {473: 4809}, - {82: 4807, 473: 1843, 481: 1843}, - {473: 1834, 481: 4802}, - {141: 4805, 172: 4804, 187: 4806, 903: 4803}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 1844, 481: 1844, 663: 4801, 2732, 2733, 2731, 876: 4802, 940: 4800}, + {473: 4810}, + {82: 4808, 473: 1843, 481: 1843}, + {473: 1834, 481: 4803}, + {141: 4806, 172: 4805, 187: 4807, 903: 4804}, // 2295 {473: 1833}, {1827, 1827, 1827, 1827, 1827, 7: 1827, 17: 1827, 47: 1827, 81: 1827, 1827, 1827, 1827, 1827, 87: 1827, 472: 1827, 1827, 1827, 481: 1827, 490: 1827, 496: 1827}, {1826, 1826, 1826, 1826, 1826, 7: 1826, 17: 1826, 47: 1826, 81: 1826, 1826, 1826, 1826, 1826, 87: 1826, 472: 1826, 1826, 1826, 481: 1826, 490: 1826, 496: 1826}, {1825, 1825, 1825, 1825, 1825, 7: 1825, 17: 1825, 47: 1825, 81: 1825, 1825, 1825, 1825, 1825, 87: 1825, 472: 1825, 1825, 1825, 481: 1825, 490: 1825, 496: 1825}, - {141: 4805, 172: 4804, 187: 4806, 903: 4808}, + {141: 4806, 172: 4805, 187: 4807, 903: 4809}, // 2300 {473: 1832}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 4810}, - {7: 4591, 47: 4811}, - {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4812}, - {2247, 2247, 2247, 2247, 4817, 7: 2247, 17: 4814, 47: 2247, 82: 4821, 4681, 4394, 4682, 87: 4393, 474: 4816, 481: 4820, 490: 2247, 854: 4818, 856: 4815, 867: 4819, 877: 4813}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 4811}, + {7: 4592, 47: 4812}, + {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4813}, + {2247, 2247, 2247, 2247, 4818, 7: 2247, 17: 4815, 47: 2247, 82: 4822, 4682, 4395, 4683, 87: 4394, 474: 4817, 481: 4821, 490: 2247, 854: 4819, 856: 4816, 867: 4820, 877: 4814}, // 2305 {1841, 1841, 1841, 1841, 1841, 7: 1841, 17: 1841, 47: 1841, 81: 1841, 1841, 1841, 1841, 1841, 87: 1841, 474: 1841, 481: 1841, 490: 1841, 496: 1841}, - {498: 4246, 508: 2037, 735: 4827}, + {498: 4247, 508: 2037, 735: 4828}, {1839, 1839, 1839, 1839, 1839, 7: 1839, 17: 1839, 47: 1839, 81: 1839, 1839, 1839, 1839, 1839, 87: 1839, 474: 1839, 481: 1839, 490: 1839, 496: 1839}, - {367: 4825}, - {475: 4824}, + {367: 4826}, + {475: 4825}, // 2310 {1836, 1836, 1836, 1836, 1836, 7: 1836, 17: 1836, 47: 1836, 81: 1836, 1836, 1836, 1836, 1836, 87: 1836, 474: 1836, 481: 1836, 490: 1836, 496: 1836}, {1835, 1835, 1835, 1835, 1835, 7: 1835, 17: 1835, 47: 1835, 81: 1835, 1835, 1835, 1835, 1835, 87: 1835, 474: 1835, 481: 1835, 490: 1835, 496: 1835}, - {141: 4805, 172: 4804, 187: 4806, 903: 4823}, - {141: 4805, 172: 4804, 187: 4806, 903: 4822}, + {141: 4806, 172: 4805, 187: 4807, 903: 4824}, + {141: 4806, 172: 4805, 187: 4807, 903: 4823}, {1828, 1828, 1828, 1828, 1828, 7: 1828, 17: 1828, 47: 1828, 81: 1828, 1828, 1828, 1828, 1828, 87: 1828, 472: 1828, 474: 1828, 481: 1828, 490: 1828, 496: 1828}, // 2315 {1829, 1829, 1829, 1829, 1829, 7: 1829, 17: 1829, 47: 1829, 81: 1829, 1829, 1829, 1829, 1829, 87: 1829, 472: 1829, 474: 1829, 481: 1829, 490: 1829, 496: 1829}, {1837, 1837, 1837, 1837, 1837, 7: 1837, 17: 1837, 47: 1837, 81: 1837, 1837, 1837, 1837, 1837, 87: 1837, 474: 1837, 481: 1837, 490: 1837, 496: 1837}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4826, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4827, 2732, 2733, 2731}, {1838, 1838, 1838, 1838, 1838, 7: 1838, 17: 1838, 47: 1838, 81: 1838, 1838, 1838, 1838, 1838, 87: 1838, 474: 1838, 481: 1838, 490: 1838, 496: 1838}, - {508: 2705, 732: 2704, 743: 4828}, + {508: 2706, 732: 2705, 743: 4829}, // 2320 {1840, 1840, 1840, 1840, 1840, 7: 1840, 17: 1840, 47: 1840, 81: 1840, 1840, 1840, 1840, 1840, 87: 1840, 474: 1840, 481: 1840, 490: 1840, 496: 1840}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 1844, 481: 1844, 663: 4800, 2731, 2732, 2730, 876: 4801, 940: 4830}, - {473: 4831}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 4832}, - {7: 4591, 47: 4833}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 1844, 481: 1844, 663: 4801, 2732, 2733, 2731, 876: 4802, 940: 4831}, + {473: 4832}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 4833}, + {7: 4592, 47: 4834}, // 2325 - {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4834}, - {2248, 2248, 2248, 2248, 4817, 7: 2248, 17: 4814, 47: 2248, 82: 4821, 4681, 4394, 4682, 87: 4393, 474: 4816, 481: 4820, 490: 2248, 854: 4818, 856: 4815, 867: 4819, 877: 4813}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 1844, 663: 4792, 2731, 2732, 2730, 876: 4836}, - {473: 4837}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 4838}, + {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4835}, + {2248, 2248, 2248, 2248, 4818, 7: 2248, 17: 4815, 47: 2248, 82: 4822, 4682, 4395, 4683, 87: 4394, 474: 4817, 481: 4821, 490: 2248, 854: 4819, 856: 4816, 867: 4820, 877: 4814}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 1844, 663: 4793, 2732, 2733, 2731, 876: 4837}, + {473: 4838}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 4839}, // 2330 - {7: 4591, 47: 4839}, - {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4840}, - {2249, 2249, 2249, 2249, 4817, 7: 2249, 17: 4814, 47: 2249, 82: 4821, 4681, 4394, 4682, 87: 4393, 474: 4816, 481: 4820, 490: 2249, 854: 4818, 856: 4815, 867: 4819, 877: 4813}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 1844, 481: 1844, 663: 4800, 2731, 2732, 2730, 876: 4801, 940: 4842}, - {473: 4843}, + {7: 4592, 47: 4840}, + {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4841}, + {2249, 2249, 2249, 2249, 4818, 7: 2249, 17: 4815, 47: 2249, 82: 4822, 4682, 4395, 4683, 87: 4394, 474: 4817, 481: 4821, 490: 2249, 854: 4819, 856: 4816, 867: 4820, 877: 4814}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 1844, 481: 1844, 663: 4801, 2732, 2733, 2731, 876: 4802, 940: 4843}, + {473: 4844}, // 2335 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 4844}, - {7: 4591, 47: 4845}, - {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4846}, - {2250, 2250, 2250, 2250, 4817, 7: 2250, 17: 4814, 47: 2250, 82: 4821, 4681, 4394, 4682, 87: 4393, 474: 4816, 481: 4820, 490: 2250, 854: 4818, 856: 4815, 867: 4819, 877: 4813}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4848, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 4845}, + {7: 4592, 47: 4846}, + {1842, 1842, 1842, 1842, 1842, 7: 1842, 17: 1842, 47: 1842, 82: 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 490: 1842, 878: 4847}, + {2250, 2250, 2250, 2250, 4818, 7: 2250, 17: 4815, 47: 2250, 82: 4822, 4682, 4395, 4683, 87: 4394, 474: 4817, 481: 4821, 490: 2250, 854: 4819, 856: 4816, 867: 4820, 877: 4814}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4849, 2732, 2733, 2731}, // 2340 - {228: 4850, 236: 4852, 239: 4851, 1137: 4849}, - {473: 4853}, + {228: 4851, 236: 4853, 239: 4852, 1137: 4850}, + {473: 4854}, {47: 2199, 473: 2199}, {47: 2198, 473: 2198}, {47: 2197, 473: 2197}, // 2345 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 4854}, - {7: 4114, 47: 4855}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 4855}, + {7: 4115, 47: 4856}, {2462, 2462, 2462, 2462, 7: 2462, 490: 2462}, - {564, 564, 564, 564, 7: 564, 105: 564, 136: 4708, 473: 564, 490: 564, 817: 4707, 835: 4857}, - {2132, 2132, 2132, 2132, 7: 2132, 105: 4859, 473: 4860, 490: 2132, 1096: 4858}, + {564, 564, 564, 564, 7: 564, 105: 564, 136: 4709, 473: 564, 490: 564, 817: 4708, 835: 4858}, + {2132, 2132, 2132, 2132, 7: 2132, 105: 4860, 473: 4861, 490: 2132, 1096: 4859}, // 2350 {2464, 2464, 2464, 2464, 7: 2464, 490: 2464}, - {508: 2705, 732: 4901}, - {490: 4863, 950: 4862, 1095: 4861}, - {7: 4899, 47: 4898}, + {508: 2706, 732: 4902}, + {490: 4864, 950: 4863, 1095: 4862}, + {7: 4900, 47: 4899}, {7: 2130, 47: 2130}, // 2355 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4864, 2731, 2732, 2730}, - {4: 2109, 2109, 7: 2109, 16: 2109, 18: 2109, 20: 2109, 2109, 2109, 2109, 2109, 2109, 47: 2109, 146: 4869, 343: 4868, 473: 2109, 479: 4867, 501: 4866, 648: 2109, 1266: 4865}, - {4: 2122, 2122, 7: 2122, 16: 2122, 18: 2122, 20: 2122, 2122, 2122, 2122, 2122, 2122, 47: 2122, 473: 2122, 648: 2122, 949: 4885}, - {352: 4870, 544: 4871}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4865, 2732, 2733, 2731}, + {4: 2109, 2109, 7: 2109, 16: 2109, 18: 2109, 20: 2109, 2109, 2109, 2109, 2109, 2109, 47: 2109, 146: 4870, 343: 4869, 473: 2109, 479: 4868, 501: 4867, 648: 2109, 1266: 4866}, + {4: 2122, 2122, 7: 2122, 16: 2122, 18: 2122, 20: 2122, 2122, 2122, 2122, 2122, 2122, 47: 2122, 473: 2122, 648: 2122, 949: 4886}, + {352: 4871, 544: 4872}, {4: 2106, 2106, 7: 2106, 16: 2106, 18: 2106, 20: 2106, 2106, 2106, 2106, 2106, 2106, 47: 2106, 473: 2106, 648: 2106}, // 2360 {4: 2104, 2104, 7: 2104, 16: 2104, 18: 2104, 20: 2104, 2104, 2104, 2104, 2104, 2104, 47: 2104, 473: 2104, 648: 2104}, {4: 2103, 2103, 7: 2103, 16: 2103, 18: 2103, 20: 2103, 2103, 2103, 2103, 2103, 2103, 47: 2103, 473: 2103, 648: 2103}, - {399: 4880}, - {473: 4872}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 656: 4874, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 4875, 943: 4876, 1077: 4873}, + {399: 4881}, + {473: 4873}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 656: 4875, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 4876, 943: 4877, 1077: 4874}, // 2365 - {7: 4878, 47: 4877}, + {7: 4879, 47: 4878}, {7: 1924, 47: 1924}, - {7: 1923, 47: 1923, 485: 3654, 3655, 3660, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, + {7: 1923, 47: 1923, 485: 3655, 3656, 3661, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, {7: 1911, 47: 1911}, {4: 2105, 2105, 7: 2105, 16: 2105, 18: 2105, 20: 2105, 2105, 2105, 2105, 2105, 2105, 47: 2105, 473: 2105, 648: 2105}, // 2370 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 656: 4874, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 4875, 943: 4879}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 656: 4875, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 4876, 943: 4880}, {7: 1910, 47: 1910}, - {473: 4882, 656: 4881}, + {473: 4883, 656: 4882}, {4: 2108, 2108, 7: 2108, 16: 2108, 18: 2108, 20: 2108, 2108, 2108, 2108, 2108, 2108, 47: 2108, 473: 2108, 648: 2108}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 656: 4874, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 4875, 943: 4876, 1077: 4883}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 656: 4875, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 4876, 943: 4877, 1077: 4884}, // 2375 - {7: 4878, 47: 4884}, + {7: 4879, 47: 4885}, {4: 2107, 2107, 7: 2107, 16: 2107, 18: 2107, 20: 2107, 2107, 2107, 2107, 2107, 2107, 47: 2107, 473: 2107, 648: 2107}, - {4: 4206, 4889, 7: 2127, 16: 4164, 18: 4214, 20: 4207, 4210, 4209, 4212, 4213, 4215, 47: 2127, 473: 4887, 648: 4211, 779: 4216, 811: 4888, 1308: 4886}, + {4: 4207, 4890, 7: 2127, 16: 4165, 18: 4215, 20: 4208, 4211, 4210, 4213, 4214, 4216, 47: 2127, 473: 4888, 648: 4212, 779: 4217, 811: 4889, 1308: 4887}, {7: 2128, 47: 2128}, - {100: 4892, 1139: 4891, 1307: 4890}, + {100: 4893, 1139: 4892, 1307: 4891}, // 2380 {2121, 2121, 4: 2121, 2121, 7: 2121, 16: 2121, 18: 2121, 20: 2121, 2121, 2121, 2121, 2121, 2121, 47: 2121, 473: 2121, 648: 2121}, - {20: 4345}, - {7: 4896, 47: 4895}, + {20: 4346}, + {7: 4897, 47: 4896}, {7: 2125, 47: 2125}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4893, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4894, 2732, 2733, 2731}, // 2385 - {4: 2122, 2122, 7: 2122, 16: 2122, 18: 2122, 20: 2122, 2122, 2122, 2122, 2122, 2122, 47: 2122, 648: 2122, 949: 4894}, - {4: 4206, 4889, 7: 2123, 16: 4164, 18: 4214, 20: 4207, 4210, 4209, 4212, 4213, 4215, 47: 2123, 648: 4211, 779: 4216, 811: 4888}, + {4: 2122, 2122, 7: 2122, 16: 2122, 18: 2122, 20: 2122, 2122, 2122, 2122, 2122, 2122, 47: 2122, 648: 2122, 949: 4895}, + {4: 4207, 4890, 7: 2123, 16: 4165, 18: 4215, 20: 4208, 4211, 4210, 4213, 4214, 4216, 47: 2123, 648: 4212, 779: 4217, 811: 4889}, {7: 2126, 47: 2126}, - {100: 4892, 1139: 4897}, + {100: 4893, 1139: 4898}, {7: 2124, 47: 2124}, // 2390 {2131, 2131, 2131, 2131, 7: 2131, 472: 2131, 2131, 2131, 478: 2131, 490: 2131, 2131, 501: 2131, 507: 2131, 569: 2131, 645: 2131}, - {490: 4863, 950: 4900}, + {490: 4864, 950: 4901}, {7: 2129, 47: 2129}, {2463, 2463, 2463, 2463, 7: 2463, 490: 2463}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4904, 663: 4111, 2731, 2732, 2730, 742: 4420, 846: 4903}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4905, 663: 4112, 2732, 2733, 2731, 742: 4421, 846: 4904}, // 2395 - {2391, 2391, 2391, 2391, 7: 2391, 4689, 4690, 490: 2391, 927: 4912}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4553, 648: 2382, 663: 4111, 2731, 2732, 2730, 674: 2382, 2382, 742: 4420, 831: 4774, 846: 4906, 901: 4907, 966: 4908, 1142: 4905}, - {7: 4910, 47: 4909}, + {2391, 2391, 2391, 2391, 7: 2391, 4690, 4691, 490: 2391, 927: 4913}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4554, 648: 2382, 663: 4112, 2732, 2733, 2731, 674: 2382, 2382, 742: 4421, 831: 4775, 846: 4907, 901: 4908, 966: 4909, 1142: 4906}, + {7: 4911, 47: 4910}, {7: 437, 47: 437}, {7: 436, 47: 436}, // 2400 {7: 435, 47: 435}, {2466, 2466, 2466, 2466, 7: 2466, 490: 2466}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4553, 648: 2382, 663: 4111, 2731, 2732, 2730, 674: 2382, 2382, 742: 4420, 831: 4774, 846: 4906, 901: 4907, 966: 4911}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4554, 648: 2382, 663: 4112, 2732, 2733, 2731, 674: 2382, 2382, 742: 4421, 831: 4775, 846: 4907, 901: 4908, 966: 4912}, {7: 434, 47: 434}, {2467, 2467, 2467, 2467, 7: 2467, 490: 2467}, // 2405 - {14: 3804, 506: 3805, 646: 3803, 772: 4914}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 479: 4916, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 4915}, - {265, 265, 265, 265, 7: 265, 482: 4918, 490: 265, 1087: 4920}, - {265, 265, 265, 265, 7: 265, 482: 4918, 490: 265, 1087: 4917}, + {14: 3805, 506: 3806, 646: 3804, 772: 4915}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 479: 4917, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 4916}, + {265, 265, 265, 265, 7: 265, 482: 4919, 490: 265, 1087: 4921}, + {265, 265, 265, 265, 7: 265, 482: 4919, 490: 265, 1087: 4918}, {2468, 2468, 2468, 2468, 7: 2468, 490: 2468}, // 2410 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3457, 663: 3459, 2731, 2732, 2730, 737: 3456, 870: 4919}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3458, 663: 3460, 2732, 2733, 2731, 737: 3457, 870: 4920}, {264, 264, 264, 264, 7: 264, 490: 264}, {2469, 2469, 2469, 2469, 7: 2469, 490: 2469}, - {181: 4923, 213: 4922}, - {508: 2705, 732: 2704, 743: 4926}, + {181: 4924, 213: 4923}, + {508: 2706, 732: 2705, 743: 4927}, // 2415 - {338: 4925, 362: 4924}, + {338: 4926, 362: 4925}, {2471, 2471, 2471, 2471, 7: 2471, 490: 2471}, {2470, 2470, 2470, 2470, 7: 2470, 490: 2470}, - {2475, 2475, 2475, 2475, 7: 2475, 178: 4927, 490: 2475, 1075: 4928}, - {262: 4929}, + {2475, 2475, 2475, 2475, 7: 2475, 178: 4928, 490: 2475, 1075: 4929}, + {262: 4930}, // 2420 {2472, 2472, 2472, 2472, 7: 2472, 490: 2472}, - {475: 4931, 1304: 4930}, - {2474, 2474, 2474, 2474, 7: 4932, 14: 2474, 16: 2474, 19: 2474, 479: 2474, 482: 2474, 490: 2474, 504: 2474, 506: 2474, 646: 2474}, + {475: 4932, 1304: 4931}, + {2474, 2474, 2474, 2474, 7: 4933, 14: 2474, 16: 2474, 19: 2474, 479: 2474, 482: 2474, 490: 2474, 504: 2474, 506: 2474, 646: 2474}, {263, 263, 263, 263, 7: 263, 14: 263, 16: 263, 19: 263, 479: 263, 482: 263, 490: 263, 504: 263, 506: 263, 646: 263}, - {475: 4933}, + {475: 4934}, // 2425 {262, 262, 262, 262, 7: 262, 14: 262, 16: 262, 19: 262, 479: 262, 482: 262, 490: 262, 504: 262, 506: 262, 646: 262}, {6: 396, 27: 396}, {390, 390, 390, 390, 390, 390, 390, 390, 13: 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 472: 390, 390, 390, 478: 390, 390, 390, 482: 390, 490: 390, 390, 501: 390, 503: 390, 506: 390, 390, 569: 390, 645: 390, 390, 648: 390}, - {4: 4206, 4208, 397, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 479: 4205, 4242, 482: 2156, 503: 4934, 506: 2156, 646: 2156, 648: 4211, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4937}, + {4: 4207, 4209, 397, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 479: 4206, 4243, 482: 2156, 503: 4935, 506: 2156, 646: 2156, 648: 4212, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4938}, {389, 389, 389, 389, 389, 389, 389, 389, 13: 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 472: 389, 389, 389, 478: 389, 389, 389, 482: 389, 490: 389, 389, 501: 389, 503: 389, 506: 389, 389, 569: 389, 645: 389, 389, 648: 389}, // 2430 - {475: 4940, 479: 4939}, + {475: 4941, 479: 4940}, {2482, 2482, 2482, 2482, 7: 2482, 490: 2482}, {2481, 2481, 2481, 2481, 7: 2481, 490: 2481}, - {475: 4943, 479: 4942}, + {475: 4944, 479: 4943}, {2484, 2484, 2484, 2484, 7: 2484, 490: 2484}, // 2435 {2483, 2483, 2483, 2483, 7: 2483, 490: 2483}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 479: 2037, 498: 4246, 504: 4946, 735: 4945}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 4948, 479: 4950, 663: 4951, 2731, 2732, 2730, 884: 4949}, - {479: 4947}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 479: 2037, 498: 4247, 504: 4947, 735: 4946}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 4949, 479: 4951, 663: 4952, 2732, 2733, 2731, 884: 4950}, + {479: 4948}, {2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 13: 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485, 47: 2485, 472: 2485, 2485, 2485, 478: 2485, 2485, 2485, 482: 2485, 490: 2485, 2485, 501: 2485, 503: 2485, 2485, 506: 2485, 2485, 569: 2485, 645: 2485, 2485, 648: 2485}, // 2440 {2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 13: 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 47: 2488, 472: 2488, 2488, 2488, 478: 2488, 2488, 2488, 482: 2488, 490: 2488, 2488, 501: 2488, 503: 2488, 2488, 506: 2488, 2488, 569: 2488, 645: 2488, 2488, 648: 2488}, {2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 13: 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487, 47: 2487, 472: 2487, 2487, 2487, 478: 2487, 2487, 2487, 482: 2487, 490: 2487, 2487, 501: 2487, 503: 2487, 2487, 506: 2487, 2487, 569: 2487, 645: 2487, 2487, 648: 2487}, {2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 13: 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 2486, 47: 2486, 472: 2486, 2486, 2486, 478: 2486, 2486, 2486, 482: 2486, 490: 2486, 2486, 501: 2486, 503: 2486, 2486, 506: 2486, 2486, 569: 2486, 645: 2486, 2486, 648: 2486}, {2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 13: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 47: 2172, 86: 2172, 88: 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 472: 2172, 2172, 2172, 478: 2172, 2172, 2172, 482: 2172, 490: 2172, 2172, 501: 2172, 503: 2172, 2172, 506: 2172, 2172, 569: 2172, 645: 2172, 2172, 648: 2172}, - {213: 4953}, + {213: 4954}, // 2445 {2503, 2503}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 4955}, - {2343, 2343, 7: 4713, 474: 4958, 648: 4957, 803: 4956}, - {2505, 2505}, - {899, 899, 2971, 2816, 2852, 2973, 2743, 899, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 474: 899, 586: 4975, 663: 4974, 2731, 2732, 2730, 855: 4973}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 4956}, + {2343, 2343, 7: 4714, 474: 4959, 648: 4958, 803: 4957}, + {2506, 2506}, + {899, 899, 2972, 2817, 2853, 2974, 2744, 899, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 474: 899, 586: 4976, 663: 4975, 2732, 2733, 2731, 855: 4974}, // 2450 - {508: 4963, 574: 3393, 3392, 732: 4961, 818: 4962, 989: 4960, 1169: 4959}, - {2342, 2342, 7: 4971}, + {508: 4964, 574: 3394, 3393, 732: 4962, 818: 4963, 989: 4961, 1169: 4960}, + {2342, 2342, 7: 4972}, {2341, 2341, 7: 2341}, - {227: 4965, 231: 4967, 278: 4968, 297: 4966}, - {189: 4964}, + {227: 4966, 231: 4968, 278: 4969, 297: 4967}, + {189: 4965}, // 2455 {189: 2202, 227: 1963, 231: 1963, 278: 1963, 297: 1963}, {2334, 2334, 7: 2334}, {2339, 2339, 7: 2339}, {2338, 2338, 7: 2338}, - {327: 4969, 406: 4970}, + {327: 4970, 406: 4971}, // 2460 {2335, 2335, 7: 2335}, {2337, 2337, 7: 2337}, {2336, 2336, 7: 2336}, - {508: 4963, 574: 3393, 3392, 732: 4961, 818: 4962, 989: 4972}, + {508: 4964, 574: 3394, 3393, 732: 4962, 818: 4963, 989: 4973}, {2340, 2340, 7: 2340}, // 2465 - {2343, 2343, 7: 4977, 474: 4958, 803: 4976}, + {2343, 2343, 7: 4978, 474: 4959, 803: 4977}, {898, 898, 7: 898, 47: 898, 474: 898}, {896, 896, 7: 896, 47: 896, 474: 896}, - {2504, 2504}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 586: 4979, 663: 4978, 2731, 2732, 2730}, + {2505, 2505}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 586: 4980, 663: 4979, 2732, 2733, 2731}, // 2470 {897, 897, 7: 897, 47: 897, 474: 897}, {895, 895, 7: 895, 47: 895, 474: 895}, - {2506, 2506}, + {2507, 2507}, {2480, 2480}, - {369: 5047}, + {369: 5048}, // 2475 - {490: 5039}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 659: 4986, 663: 4985, 2731, 2732, 2730}, - {2122, 2122, 4: 2122, 2122, 16: 2122, 18: 2122, 20: 2122, 2122, 2122, 2122, 2122, 2122, 196: 4165, 648: 2122, 924: 5037, 949: 5038}, - {141: 2140, 354: 4991, 394: 4992, 527: 4990, 573: 2140, 1070: 4993, 4988, 1140: 4989, 1268: 4987}, - {2134, 2134, 100: 2134, 105: 5027, 472: 2134, 2134, 2134, 478: 2134, 491: 2134, 501: 2134, 507: 2134, 569: 2134, 645: 2134, 1269: 5026}, + {490: 5040}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 659: 4987, 663: 4986, 2732, 2733, 2731}, + {2122, 2122, 4: 2122, 2122, 16: 2122, 18: 2122, 20: 2122, 2122, 2122, 2122, 2122, 2122, 196: 4166, 648: 2122, 924: 5038, 949: 5039}, + {141: 2140, 354: 4992, 394: 4993, 527: 4991, 573: 2140, 1070: 4994, 4989, 1140: 4990, 1268: 4988}, + {2134, 2134, 100: 2134, 105: 5028, 472: 2134, 2134, 2134, 478: 2134, 491: 2134, 501: 2134, 507: 2134, 569: 2134, 645: 2134, 1269: 5027}, // 2480 - {141: 5014, 573: 5013}, + {141: 5015, 573: 5014}, {2148, 2148, 100: 2148, 105: 2148, 472: 2148, 2148, 2148, 478: 2148, 491: 2148, 501: 2148, 507: 2148, 569: 2148, 645: 2148}, - {98: 3912, 107: 3911, 473: 5006, 832: 5007}, - {98: 3912, 107: 3911, 473: 4999, 832: 5000}, - {2141, 2141, 100: 2141, 105: 2141, 472: 2141, 2141, 2141, 478: 2141, 491: 2141, 493: 4995, 501: 2141, 507: 2141, 569: 2141, 581: 4994, 645: 2141}, + {98: 3913, 107: 3912, 473: 5007, 832: 5008}, + {98: 3913, 107: 3912, 473: 5000, 832: 5001}, + {2141, 2141, 100: 2141, 105: 2141, 472: 2141, 2141, 2141, 478: 2141, 491: 2141, 493: 4996, 501: 2141, 507: 2141, 569: 2141, 581: 4995, 645: 2141}, // 2485 {141: 2139, 573: 2139}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 4997}, - {508: 2705, 732: 2704, 743: 4996}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 4998}, + {508: 2706, 732: 2705, 743: 4997}, {2142, 2142, 100: 2142, 105: 2142, 472: 2142, 2142, 2142, 478: 2142, 491: 2142, 501: 2142, 507: 2142, 569: 2142, 645: 2142}, - {101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 505: 3313, 509: 3311, 3312, 3310, 3308, 531: 3422, 3419, 3421, 3420, 3416, 3418, 3417, 3414, 3415, 3413, 3423, 733: 3309, 3307, 802: 3412, 821: 4998}, + {101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 505: 3314, 509: 3312, 3313, 3311, 3309, 531: 3423, 3420, 3422, 3421, 3417, 3419, 3418, 3415, 3416, 3414, 3424, 733: 3310, 3308, 802: 3413, 821: 4999}, // 2490 {2143, 2143, 100: 2143, 105: 2143, 472: 2143, 2143, 2143, 478: 2143, 491: 2143, 501: 2143, 507: 2143, 569: 2143, 645: 2143}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 5004}, - {473: 5001}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 5002}, - {7: 4114, 47: 5003}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 5005}, + {473: 5002}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 5003}, + {7: 4115, 47: 5004}, // 2495 {2144, 2144, 100: 2144, 105: 2144, 472: 2144, 2144, 2144, 478: 2144, 491: 2144, 501: 2144, 507: 2144, 569: 2144, 645: 2144}, - {47: 5005, 485: 3654, 3655, 3660, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, + {47: 5006, 485: 3655, 3656, 3661, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, {2145, 2145, 100: 2145, 105: 2145, 472: 2145, 2145, 2145, 478: 2145, 491: 2145, 501: 2145, 507: 2145, 569: 2145, 645: 2145}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 5011}, - {473: 5008}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 5012}, + {473: 5009}, // 2500 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 5009}, - {7: 4114, 47: 5010}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 5010}, + {7: 4115, 47: 5011}, {2146, 2146, 100: 2146, 105: 2146, 472: 2146, 2146, 2146, 478: 2146, 491: 2146, 501: 2146, 507: 2146, 569: 2146, 645: 2146}, - {47: 5012, 485: 3654, 3655, 3660, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, + {47: 5013, 485: 3655, 3656, 3661, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, {2147, 2147, 100: 2147, 105: 2147, 472: 2147, 2147, 2147, 478: 2147, 491: 2147, 501: 2147, 507: 2147, 569: 2147, 645: 2147}, // 2505 - {81: 5019, 473: 2150, 1267: 5018}, - {473: 5015}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 5016}, - {47: 5017, 485: 3654, 3655, 3660, 523: 3656, 556: 3657, 3658, 3651, 3661, 3650, 3659, 3652, 3653}, + {81: 5020, 473: 2150, 1267: 5019}, + {473: 5016}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 5017}, + {47: 5018, 485: 3655, 3656, 3661, 523: 3657, 556: 3658, 3659, 3652, 3662, 3651, 3660, 3653, 3654}, {2151, 2151, 100: 2151, 105: 2151, 215: 2151, 472: 2151, 2151, 2151, 478: 2151, 491: 2151, 501: 2151, 507: 2151, 569: 2151, 645: 2151}, // 2510 - {473: 5022}, - {498: 5020}, - {508: 2705, 732: 5021}, + {473: 5023}, + {498: 5021}, + {508: 2706, 732: 5022}, {473: 2149}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 2309, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 5023, 1000: 5024}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 2309, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 5024, 1000: 5025}, // 2515 - {7: 4114, 47: 2308}, - {47: 5025}, + {7: 4115, 47: 2308}, + {47: 5026}, {2152, 2152, 100: 2152, 105: 2152, 215: 2152, 472: 2152, 2152, 2152, 478: 2152, 491: 2152, 501: 2152, 507: 2152, 569: 2152, 645: 2152}, - {2138, 2138, 100: 5030, 472: 2138, 2138, 2138, 478: 2138, 491: 2138, 501: 2138, 507: 2138, 569: 2138, 645: 2138, 1310: 5029}, - {508: 2705, 732: 2704, 743: 5028}, + {2138, 2138, 100: 5031, 472: 2138, 2138, 2138, 478: 2138, 491: 2138, 501: 2138, 507: 2138, 569: 2138, 645: 2138, 1310: 5030}, + {508: 2706, 732: 2705, 743: 5029}, // 2520 {2133, 2133, 100: 2133, 472: 2133, 2133, 2133, 478: 2133, 491: 2133, 501: 2133, 507: 2133, 569: 2133, 645: 2133}, - {2132, 2132, 472: 2132, 4860, 2132, 478: 2132, 491: 2132, 501: 2132, 507: 2132, 569: 2132, 645: 2132, 1096: 5036}, - {659: 5031}, - {141: 2140, 573: 2140, 1070: 4993, 4988, 1140: 5032}, - {2136, 2136, 215: 5034, 472: 2136, 2136, 2136, 478: 2136, 491: 2136, 501: 2136, 507: 2136, 569: 2136, 645: 2136, 1309: 5033}, + {2132, 2132, 472: 2132, 4861, 2132, 478: 2132, 491: 2132, 501: 2132, 507: 2132, 569: 2132, 645: 2132, 1096: 5037}, + {659: 5032}, + {141: 2140, 573: 2140, 1070: 4994, 4989, 1140: 5033}, + {2136, 2136, 215: 5035, 472: 2136, 2136, 2136, 478: 2136, 491: 2136, 501: 2136, 507: 2136, 569: 2136, 645: 2136, 1309: 5034}, // 2525 {2137, 2137, 472: 2137, 2137, 2137, 478: 2137, 491: 2137, 501: 2137, 507: 2137, 569: 2137, 645: 2137}, - {508: 2705, 732: 2704, 743: 5035}, + {508: 2706, 732: 2705, 743: 5036}, {2135, 2135, 472: 2135, 2135, 2135, 478: 2135, 491: 2135, 501: 2135, 507: 2135, 569: 2135, 645: 2135}, {2153, 2153, 472: 2153, 2153, 2153, 478: 2153, 491: 2153, 501: 2153, 507: 2153, 569: 2153, 645: 2153}, {2477, 2477}, // 2530 - {2476, 2476, 4: 4206, 4889, 16: 4164, 18: 4214, 20: 4207, 4210, 4209, 4212, 4213, 4215, 648: 4211, 779: 4216, 811: 4888}, - {564, 564, 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4708, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 817: 4707, 835: 5040}, - {2416, 2416, 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 5042, 1277: 5041}, + {2476, 2476, 4: 4207, 4890, 16: 4165, 18: 4215, 20: 4208, 4211, 4210, 4213, 4214, 4216, 648: 4212, 779: 4217, 811: 4889}, + {564, 564, 564, 564, 564, 564, 564, 8: 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, 564, 564, 564, 48: 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 4709, 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, 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, 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, 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, 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, 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, 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, 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, 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, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 817: 4708, 835: 5041}, + {2416, 2416, 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 5043, 1277: 5042}, {2478, 2478}, - {7: 4713, 495: 5043}, + {7: 4714, 495: 5044}, // 2535 - {473: 5044}, - {490: 4863, 950: 4862, 1095: 5045}, - {7: 4899, 47: 5046}, + {473: 5045}, + {490: 4864, 950: 4863, 1095: 5046}, + {7: 4900, 47: 5047}, {2415, 2415}, {2479, 2479}, // 2540 - {136: 5049, 879: 102, 1074: 5050}, + {136: 5050, 879: 102, 1074: 5051}, {879: 101}, - {879: 5051}, - {475: 5052}, - {17, 17, 179: 17, 356: 5054, 657: 17, 1246: 5053}, + {879: 5052}, + {475: 5053}, + {17, 17, 179: 17, 356: 5055, 657: 17, 1246: 5054}, // 2545 - {15, 15, 179: 5057, 657: 15, 1245: 5056}, - {508: 2705, 732: 5055}, + {15, 15, 179: 5058, 657: 15, 1245: 5057}, + {508: 2706, 732: 5056}, {16, 16, 179: 16, 657: 16}, - {87, 87, 657: 3933, 942: 5064}, - {13, 13, 184: 13, 370: 5059, 657: 13, 1271: 5058}, + {87, 87, 657: 3934, 942: 5065}, + {13, 13, 184: 13, 370: 5060, 657: 13, 1271: 5059}, // 2550 - {11, 11, 184: 5062, 657: 11, 1270: 5061}, - {508: 2705, 732: 5060}, + {11, 11, 184: 5063, 657: 11, 1270: 5062}, + {508: 2706, 732: 5061}, {12, 12, 184: 12, 657: 12}, {14, 14, 657: 14}, - {508: 2705, 732: 5063}, + {508: 2706, 732: 5064}, // 2555 {10, 10, 657: 10}, {18, 18}, {26: 55, 137: 55, 508: 55}, {59, 59}, - {508: 2705, 732: 5070}, + {508: 2706, 732: 5071}, // 2560 - {508: 2705, 732: 5069}, + {508: 2706, 732: 5070}, {57, 57}, {58, 58}, - {493: 5074}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 5073}, + {493: 5075}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 5074}, // 2565 {493: 60}, - {508: 2705, 732: 5075}, - {246: 5077, 474: 64, 738: 64, 1200: 5076}, - {474: 2558, 738: 2524, 758: 5080, 765: 2525, 778: 2526, 782: 5081}, - {382: 5078}, + {508: 2706, 732: 5076}, + {246: 5078, 474: 64, 738: 64, 1200: 5077}, + {474: 2559, 738: 2525, 758: 5081, 765: 2526, 778: 2527, 782: 5082}, + {382: 5079}, // 2570 - {137: 5079, 474: 63, 738: 63}, + {137: 5080, 474: 63, 738: 63}, {474: 62, 738: 62}, - {738: 2524, 765: 5082, 778: 5083}, + {738: 2525, 765: 5083, 778: 5084}, {65, 65}, {2060, 2060}, // 2575 {2059, 2059}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5088, 1143: 5089, 1312: 5087}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5089, 1143: 5090, 1312: 5088}, {74, 74, 74, 74, 74, 74, 74, 8: 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, 48: 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, 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, 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, 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, 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, 8: 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, 48: 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, 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, 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, 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, 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}, - {75, 75, 7: 5095}, + {75, 75, 7: 5096}, // 2580 - {670: 5091, 686: 5092, 1241: 5090}, + {670: 5092, 686: 5093, 1241: 5091}, {67, 67, 7: 67}, {72, 72, 7: 72}, - {71, 71, 7: 71, 136: 5094}, - {69, 69, 7: 69, 136: 5093}, + {71, 71, 7: 71, 136: 5095}, + {69, 69, 7: 69, 136: 5094}, // 2585 {68, 68, 7: 68}, {70, 70, 7: 70}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5088, 1143: 5096}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5089, 1143: 5097}, {66, 66, 7: 66}, {76, 76}, // 2590 - {136: 5049, 879: 102, 1074: 5101}, - {475: 5100}, + {136: 5050, 879: 102, 1074: 5102}, + {475: 5101}, {54, 54}, - {879: 5102}, - {475: 5103}, + {879: 5103}, + {475: 5104}, // 2595 - {491: 5104, 495: 2102, 507: 5105, 1036: 5106}, + {491: 5105, 495: 2102, 507: 5106, 1036: 5107}, {2101, 2101, 472: 2101, 2101, 2101, 478: 2101, 495: 2101, 501: 2101, 569: 2101, 645: 2101}, {2100, 2100, 472: 2100, 2100, 2100, 478: 2100, 495: 2100, 501: 2100, 569: 2100, 645: 2100}, - {495: 5107}, - {569: 5108}, + {495: 5108}, + {569: 5109}, // 2600 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5109}, - {104, 104, 98: 104, 107: 104, 473: 104, 491: 104, 504: 104, 646: 5111, 657: 104, 1182: 5110}, - {100, 100, 98: 3912, 107: 3911, 473: 100, 491: 100, 504: 100, 657: 100, 832: 3910, 1047: 5114}, - {504: 5112}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 5113}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5110}, + {104, 104, 98: 104, 107: 104, 473: 104, 491: 104, 504: 104, 646: 5112, 657: 104, 1182: 5111}, + {100, 100, 98: 3913, 107: 3912, 473: 100, 491: 100, 504: 100, 657: 100, 832: 3911, 1047: 5115}, + {504: 5113}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 5114}, // 2605 {103, 103, 98: 103, 107: 103, 473: 103, 491: 103, 504: 103, 657: 103}, - {87, 87, 473: 87, 491: 87, 504: 87, 657: 3933, 942: 5115}, - {106, 106, 473: 106, 491: 5117, 504: 106, 1223: 5116}, - {2297, 2297, 473: 5120, 504: 2297, 1188: 5121}, - {508: 2705, 732: 5118}, + {87, 87, 473: 87, 491: 87, 504: 87, 657: 3934, 942: 5116}, + {106, 106, 473: 106, 491: 5118, 504: 106, 1223: 5117}, + {2297, 2297, 473: 5121, 504: 2297, 1188: 5122}, + {508: 2706, 732: 5119}, // 2610 - {657: 5119}, + {657: 5120}, {105, 105, 473: 105, 504: 105}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 2303, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 568: 3317, 663: 4111, 2731, 2732, 2730, 709: 5134, 742: 5133, 1001: 5132, 1186: 5131, 5135}, - {81, 81, 504: 5123, 1240: 5122}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 2303, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 568: 3318, 663: 4112, 2732, 2733, 2731, 709: 5135, 742: 5134, 1001: 5133, 1186: 5132, 5136}, + {81, 81, 504: 5124, 1240: 5123}, {107, 107}, // 2615 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3748, 2731, 2732, 2730, 710: 5126, 1072: 5125, 1239: 5124}, - {80, 80, 7: 5129}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3749, 2732, 2733, 2731, 710: 5127, 1072: 5126, 1239: 5125}, + {80, 80, 7: 5130}, {78, 78, 7: 78}, - {498: 5127}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5128}, + {498: 5128}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5129}, // 2620 {77, 77, 7: 77}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3748, 2731, 2732, 2730, 710: 5126, 1072: 5130}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3749, 2732, 2733, 2731, 710: 5127, 1072: 5131}, {79, 79, 7: 79}, - {7: 5137, 47: 2302}, + {7: 5138, 47: 2302}, {7: 2301, 47: 2301}, // 2625 {7: 2299, 47: 2299}, {7: 2298, 47: 2298}, - {47: 5136}, + {47: 5137}, {2296, 2296, 504: 2296}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 568: 3317, 663: 4111, 2731, 2732, 2730, 709: 5134, 742: 5133, 1001: 5138}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 568: 3318, 663: 4112, 2732, 2733, 2731, 709: 5135, 742: 5134, 1001: 5139}, // 2630 {7: 2300, 47: 2300}, {7: 164, 149: 164, 472: 164, 499: 164, 568: 1822, 649: 164, 662: 1822}, @@ -9279,40 +9280,40 @@ var ( {7: 119, 472: 119, 119, 499: 119, 568: 1728, 649: 119, 662: 1728}, {7: 139, 472: 139, 139, 499: 139, 568: 1651, 649: 139, 662: 1651}, {7: 144, 472: 144, 144, 499: 144, 568: 1644, 649: 144, 662: 1644}, - {319: 5248, 387: 5247, 568: 1625, 662: 1625}, + {319: 5249, 387: 5248, 568: 1625, 662: 1625}, {7: 131, 472: 131, 131, 499: 131, 568: 1622, 649: 131, 662: 1622}, // 2640 {7: 120, 472: 120, 120, 499: 120, 568: 1619, 649: 120, 662: 1619}, - {568: 5245, 662: 5244}, + {568: 5246, 662: 5245}, {7: 725, 472: 725, 499: 725, 568: 256, 649: 725, 662: 256}, {7: 724, 472: 724, 499: 724, 649: 724}, - {7: 160, 149: 5243, 472: 160, 499: 160, 649: 160}, + {7: 160, 149: 5244, 472: 160, 499: 160, 649: 160}, // 2645 {7: 162, 472: 162, 499: 162, 649: 162}, {7: 161, 472: 161, 499: 161, 649: 161}, - {499: 5241}, - {7: 140, 472: 140, 140, 495: 5239, 499: 140, 649: 140}, + {499: 5242}, + {7: 140, 472: 140, 140, 495: 5240, 499: 140, 649: 140}, {7: 157, 472: 157, 499: 157, 649: 157}, // 2650 - {7: 5191, 472: 5192, 499: 5193}, - {7: 155, 472: 155, 5188, 499: 155, 649: 155}, - {7: 153, 185: 5187, 472: 153, 153, 499: 153, 649: 153}, - {7: 151, 276: 5186, 472: 151, 151, 499: 151, 649: 151}, - {7: 150, 18: 5180, 99: 5182, 162: 5181, 164: 5179, 169: 5183, 276: 5184, 472: 150, 150, 499: 150, 649: 150}, + {7: 5192, 472: 5193, 499: 5194}, + {7: 155, 472: 155, 5189, 499: 155, 649: 155}, + {7: 153, 185: 5188, 472: 153, 153, 499: 153, 649: 153}, + {7: 151, 276: 5187, 472: 151, 151, 499: 151, 649: 151}, + {7: 150, 18: 5181, 99: 5183, 162: 5182, 164: 5180, 169: 5184, 276: 5185, 472: 150, 150, 499: 150, 649: 150}, // 2655 {7: 147, 472: 147, 147, 499: 147, 649: 147}, {7: 146, 472: 146, 146, 499: 146, 649: 146}, - {7: 145, 169: 5178, 472: 145, 145, 499: 145, 649: 145}, + {7: 145, 169: 5179, 472: 145, 145, 499: 145, 649: 145}, {7: 142, 472: 142, 142, 499: 142, 649: 142}, {7: 141, 472: 141, 141, 499: 141, 649: 141}, // 2660 - {99: 5177, 1019: 5176}, + {99: 5178, 1019: 5177}, {7: 137, 472: 137, 137, 499: 137, 649: 137}, - {904: 5175}, + {904: 5176}, {7: 135, 472: 135, 135, 499: 135, 649: 135}, {7: 132, 472: 132, 132, 499: 132, 649: 132}, // 2665 - {122: 5174}, + {122: 5175}, {7: 127, 472: 127, 127, 499: 127, 649: 127}, {7: 136, 472: 136, 136, 499: 136, 649: 136}, {7: 138, 472: 138, 138, 499: 138, 649: 138}, @@ -9321,7 +9322,7 @@ var ( {7: 123, 472: 123, 123, 499: 123, 649: 123}, {7: 149, 472: 149, 149, 499: 149, 649: 149}, {7: 148, 472: 148, 148, 499: 148, 649: 148}, - {122: 5185}, + {122: 5186}, {7: 126, 472: 126, 126, 499: 126, 649: 126}, // 2675 {7: 124, 472: 124, 124, 499: 124, 649: 124}, @@ -9330,50 +9331,50 @@ var ( {7: 121, 472: 121, 121, 499: 121, 649: 121}, {7: 152, 472: 152, 152, 499: 152, 649: 152}, // 2680 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 5189}, - {7: 4114, 47: 5190}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 5190}, + {7: 4115, 47: 5191}, {7: 154, 472: 154, 499: 154, 649: 154}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5139, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 5141, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 5147, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 5143, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 5140, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 5148, 3173, 2901, 3126, 5142, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 5145, 2812, 2813, 3052, 5146, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 5144, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5150, 496: 5173, 567: 5167, 643: 5171, 645: 5156, 648: 5166, 650: 5160, 653: 5169, 660: 5161, 663: 3459, 2731, 2732, 2730, 668: 5165, 673: 5162, 737: 5149, 5164, 799: 5151, 808: 5155, 852: 5170, 864: 5168, 934: 5152, 955: 5153, 5159, 961: 5154, 5238, 970: 5163, 972: 5172}, - {2: 118, 118, 118, 118, 118, 8: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 48: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 5205, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 523: 118, 569: 5204, 957: 5206, 1081: 5207}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5140, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 5142, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 5148, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 5144, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 5141, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 5149, 3174, 2902, 3127, 5143, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 5146, 2813, 2814, 3053, 5147, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 5145, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5151, 496: 5174, 567: 5168, 643: 5172, 645: 5157, 648: 5167, 650: 5161, 653: 5170, 660: 5162, 663: 3460, 2732, 2733, 2731, 668: 5166, 673: 5163, 737: 5150, 5165, 799: 5152, 808: 5156, 852: 5171, 864: 5169, 934: 5153, 955: 5154, 5160, 961: 5155, 5239, 970: 5164, 972: 5173}, + {2: 118, 118, 118, 118, 118, 8: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 48: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 5206, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 523: 118, 569: 5205, 957: 5207, 1081: 5208}, // 2685 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5196, 866: 5197}, - {738, 738, 7: 738, 13: 738, 46: 738, 99: 738, 142: 738, 474: 738, 481: 738, 498: 738, 568: 5202, 649: 738, 661: 738, 5201, 667: 738}, - {1196, 1196, 7: 1196, 13: 1196, 46: 1196, 99: 1196, 142: 1196, 473: 3738, 1196, 481: 1196, 498: 1196, 649: 1196, 661: 1196, 667: 1196, 1090: 5200}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5197, 866: 5198}, + {738, 738, 7: 738, 13: 738, 46: 738, 99: 738, 142: 738, 474: 738, 481: 738, 498: 738, 568: 5203, 649: 738, 661: 738, 5202, 667: 738}, + {1196, 1196, 7: 1196, 13: 1196, 46: 1196, 99: 1196, 142: 1196, 473: 3739, 1196, 481: 1196, 498: 1196, 649: 1196, 661: 1196, 667: 1196, 1090: 5201}, {734, 734, 7: 734, 474: 734}, - {108, 108, 7: 5198}, + {108, 108, 7: 5199}, // 2690 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5199}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5200}, {733, 733, 7: 733, 474: 733}, {735, 735, 7: 735, 13: 735, 46: 735, 99: 735, 142: 735, 474: 735, 481: 735, 498: 735, 649: 735, 661: 735, 667: 735}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 663: 3459, 2731, 2732, 2730, 737: 5203}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 663: 3460, 2732, 2733, 2731, 737: 5204}, {736, 736, 7: 736, 13: 736, 46: 736, 99: 736, 142: 736, 474: 736, 481: 736, 498: 736, 649: 736, 661: 736, 667: 736}, // 2695 {737, 737, 7: 737, 13: 737, 46: 737, 99: 737, 142: 737, 474: 737, 481: 737, 498: 737, 649: 737, 661: 737, 667: 737}, {2: 117, 117, 117, 117, 117, 8: 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 48: 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 523: 117}, {2: 116, 116, 116, 116, 116, 8: 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 48: 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 523: 116}, {2: 115, 115, 115, 115, 115, 8: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 48: 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 523: 115}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5208, 663: 5209, 2731, 2732, 2730, 1104: 5210}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5209, 663: 5210, 2732, 2733, 2731, 1104: 5211}, // 2700 - {499: 114, 649: 114, 651: 5236}, - {499: 110, 649: 110, 651: 5233}, - {499: 5211}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5212, 889: 5213, 920: 5214}, - {198, 198, 7: 198, 13: 198, 46: 198, 142: 5218, 474: 198, 661: 198, 1173: 5217}, + {499: 114, 649: 114, 651: 5237}, + {499: 110, 649: 110, 651: 5234}, + {499: 5212}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5213, 889: 5214, 920: 5215}, + {198, 198, 7: 198, 13: 198, 46: 198, 142: 5219, 474: 198, 661: 198, 1173: 5218}, // 2705 {233, 233, 7: 233, 13: 233, 46: 233, 474: 233, 661: 233}, - {109, 109, 7: 5215}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5212, 889: 5216}, + {109, 109, 7: 5216}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5213, 889: 5217}, {232, 232, 7: 232, 13: 232, 46: 232, 474: 232, 661: 232}, {234, 234, 7: 234, 13: 234, 46: 234, 474: 234, 661: 234}, // 2710 - {474: 5220, 659: 5219}, - {13: 5231, 475: 5228, 891: 5230}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 663: 3459, 2731, 2732, 2730, 737: 5222, 1174: 5221}, - {196, 196, 7: 196, 13: 196, 46: 196, 474: 196, 478: 5224, 659: 5223, 661: 196}, + {474: 5221, 659: 5220}, + {13: 5232, 475: 5229, 891: 5231}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 663: 3460, 2732, 2733, 2731, 737: 5223, 1174: 5222}, + {196, 196, 7: 196, 13: 196, 46: 196, 474: 196, 478: 5225, 659: 5224, 661: 196}, {192, 192, 7: 192, 13: 192, 46: 192, 474: 192, 478: 192, 659: 192, 661: 192}, // 2715 - {475: 5228, 891: 5229}, - {475: 5226, 577: 5227, 1056: 5225}, + {475: 5229, 891: 5230}, + {475: 5227, 577: 5228, 1056: 5226}, {194, 194, 7: 194, 13: 194, 46: 194, 474: 194, 661: 194}, {191, 191, 7: 191, 13: 191, 46: 191, 474: 191, 661: 191}, {190, 190, 7: 190, 13: 190, 46: 190, 474: 190, 661: 190}, @@ -9381,50 +9382,50 @@ var ( {730, 730, 7: 730, 13: 730, 46: 730, 730, 474: 730, 661: 730}, {195, 195, 7: 195, 13: 195, 46: 195, 474: 195, 661: 195}, {197, 197, 7: 197, 13: 197, 46: 197, 474: 197, 661: 197}, - {475: 5226, 577: 5227, 1056: 5232}, + {475: 5227, 577: 5228, 1056: 5233}, {193, 193, 7: 193, 13: 193, 46: 193, 474: 193, 661: 193}, // 2725 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5234, 663: 5235, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5235, 663: 5236, 2732, 2733, 2731}, {499: 112, 649: 112}, {499: 111, 649: 111}, - {523: 5237}, + {523: 5238}, {499: 113, 649: 113}, // 2730 {7: 156, 472: 156, 499: 156, 649: 156}, - {277: 5240}, + {277: 5241}, {7: 158, 472: 158, 499: 158, 649: 158}, - {277: 5242}, + {277: 5243}, {7: 159, 472: 159, 499: 159, 649: 159}, // 2735 {7: 163, 149: 163, 472: 163, 499: 163, 649: 163}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 663: 3459, 2731, 2732, 2730, 737: 5246}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 663: 3460, 2732, 2733, 2731, 737: 5247}, {726, 726, 7: 726, 472: 726, 499: 726, 649: 726}, {727, 727, 7: 727, 472: 727, 499: 727, 649: 727}, {7: 134, 472: 134, 134, 499: 134, 649: 134}, // 2740 {7: 133, 472: 133, 133, 499: 133, 649: 133}, - {472: 5289, 568: 1739, 662: 1739}, - {7: 5191, 472: 5251, 649: 5252}, - {2: 118, 118, 118, 118, 118, 8: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 48: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 5205, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 523: 118, 569: 5204, 957: 5206, 1081: 5254}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5196, 866: 5253}, + {472: 5290, 568: 1739, 662: 1739}, + {7: 5192, 472: 5252, 649: 5253}, + {2: 118, 118, 118, 118, 118, 8: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 48: 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 5206, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 523: 118, 569: 5205, 957: 5207, 1081: 5255}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5197, 866: 5254}, // 2745 - {171, 171, 7: 5198}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5208, 663: 5209, 2731, 2732, 2730, 1104: 5255}, - {649: 5256}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5212, 889: 5213, 920: 5257}, - {223, 223, 7: 5215, 474: 223, 661: 5259, 958: 5258, 5260}, + {171, 171, 7: 5199}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5209, 663: 5210, 2732, 2733, 2731, 1104: 5256}, + {649: 5257}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5213, 889: 5214, 920: 5258}, + {223, 223, 7: 5216, 474: 223, 661: 5260, 958: 5259, 5261}, // 2750 {222, 222, 13: 222, 46: 222, 474: 222}, - {131: 5280, 133: 5278, 5281, 5279, 361: 5273, 407: 5275, 960: 5277, 1278: 5276, 1296: 5274}, - {170, 170, 474: 5262, 1160: 5261}, + {131: 5281, 133: 5279, 5282, 5280, 361: 5274, 407: 5276, 960: 5278, 1278: 5277, 1296: 5275}, + {170, 170, 474: 5263, 1160: 5262}, {173, 173}, - {126: 5266, 5264, 5265, 5267, 852: 5263}, + {126: 5267, 5265, 5266, 5268, 852: 5264}, // 2755 - {904: 5272}, - {508: 2705, 732: 5271}, - {508: 2705, 732: 5270}, - {508: 2705, 732: 5269}, - {508: 2705, 732: 5268}, + {904: 5273}, + {508: 2706, 732: 5272}, + {508: 2706, 732: 5271}, + {508: 2706, 732: 5270}, + {508: 2706, 732: 5269}, // 2760 {165, 165}, {166, 166}, @@ -9435,26 +9436,26 @@ var ( {221, 221, 13: 221, 46: 221, 474: 221}, {220, 220, 13: 220, 46: 220, 474: 220}, {219, 219, 13: 219, 46: 219, 474: 219}, - {218, 218, 13: 218, 46: 218, 131: 5280, 133: 5278, 5281, 5279, 474: 218, 505: 5286, 960: 5287}, + {218, 218, 13: 218, 46: 218, 131: 5281, 133: 5279, 5282, 5280, 474: 218, 505: 5287, 960: 5288}, {217, 217, 13: 217, 46: 217, 131: 217, 133: 217, 217, 217, 474: 217, 505: 217}, // 2770 + {475: 5286}, {475: 5285}, {475: 5284}, {475: 5283}, - {475: 5282}, {211, 211, 13: 211, 46: 211, 131: 211, 133: 211, 211, 211, 474: 211, 505: 211}, // 2775 {212, 212, 13: 212, 46: 212, 131: 212, 133: 212, 212, 212, 474: 212, 505: 212}, {213, 213, 13: 213, 46: 213, 131: 213, 133: 213, 213, 213, 474: 213, 505: 213}, {214, 214, 13: 214, 46: 214, 131: 214, 133: 214, 214, 214, 474: 214, 505: 214}, - {131: 5280, 133: 5278, 5281, 5279, 960: 5288}, + {131: 5281, 133: 5279, 5282, 5280, 960: 5289}, {215, 215, 13: 215, 46: 215, 131: 215, 133: 215, 215, 215, 474: 215, 505: 215}, // 2780 {216, 216, 13: 216, 46: 216, 131: 216, 133: 216, 216, 216, 474: 216, 505: 216}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5290}, - {649: 5291}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5196, 866: 5292}, - {170, 170, 7: 5198, 474: 5262, 1160: 5293}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5291}, + {649: 5292}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5197, 866: 5293}, + {170, 170, 7: 5199, 474: 5263, 1160: 5294}, // 2785 {172, 172}, {2173, 2173, 7: 2173, 14: 2173, 16: 2173, 19: 2173, 479: 2173, 482: 2173, 497: 2173, 499: 2173, 504: 2173, 506: 2173, 518: 2173, 646: 2173, 649: 2173}, @@ -9462,182 +9463,182 @@ var ( {2: 845, 845, 845, 845, 845, 8: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 48: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 473: 845, 475: 845, 845, 845, 479: 845, 483: 845, 845, 845, 845, 845, 491: 845, 845, 495: 845, 499: 845, 501: 845, 506: 845, 845, 845, 515: 845, 523: 845, 543: 845, 566: 845, 845, 845, 570: 845, 845, 845, 574: 845, 845, 845, 845, 845, 845, 845, 845, 583: 845, 845, 587: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 639: 845, 845, 845, 647: 845, 650: 845, 744: 845, 845, 752: 845, 845, 845, 761: 845, 768: 845, 845, 845}, {2: 843, 843, 843, 843, 843, 8: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 48: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 473: 843, 491: 843, 495: 843, 499: 843, 579: 843, 752: 843, 843, 843}, // 2790 - {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 473: 1048, 491: 1048, 579: 1048, 752: 5301, 5300, 5299, 836: 5302, 885: 5303}, + {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 473: 1048, 491: 1048, 579: 1048, 752: 5302, 5301, 5300, 836: 5303, 885: 5304}, {2: 1051, 1051, 1051, 1051, 1051, 8: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 48: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 473: 1051, 475: 1051, 1051, 1051, 479: 1051, 483: 1051, 1051, 1051, 1051, 1051, 491: 1051, 1051, 495: 1051, 499: 1051, 501: 1051, 506: 1051, 1051, 1051, 515: 1051, 523: 1051, 543: 1051, 566: 1051, 1051, 1051, 570: 1051, 1051, 1051, 574: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 583: 1051, 1051, 587: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 639: 1051, 1051, 1051, 647: 1051, 650: 1051, 744: 1051, 1051, 752: 1051, 1051, 1051, 761: 1051, 768: 1051, 1051, 1051}, {2: 1050, 1050, 1050, 1050, 1050, 8: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 48: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 473: 1050, 475: 1050, 1050, 1050, 479: 1050, 483: 1050, 1050, 1050, 1050, 1050, 491: 1050, 1050, 495: 1050, 499: 1050, 501: 1050, 506: 1050, 1050, 1050, 515: 1050, 523: 1050, 543: 1050, 566: 1050, 1050, 1050, 570: 1050, 1050, 1050, 574: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 583: 1050, 1050, 587: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 639: 1050, 1050, 1050, 647: 1050, 650: 1050, 744: 1050, 1050, 752: 1050, 1050, 1050, 761: 1050, 768: 1050, 1050, 1050}, {2: 1049, 1049, 1049, 1049, 1049, 8: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 48: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 473: 1049, 475: 1049, 1049, 1049, 479: 1049, 483: 1049, 1049, 1049, 1049, 1049, 491: 1049, 1049, 495: 1049, 499: 1049, 501: 1049, 506: 1049, 1049, 1049, 515: 1049, 523: 1049, 543: 1049, 566: 1049, 1049, 1049, 570: 1049, 1049, 1049, 574: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 583: 1049, 1049, 587: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 639: 1049, 1049, 1049, 647: 1049, 650: 1049, 744: 1049, 1049, 752: 1049, 1049, 1049, 761: 1049, 768: 1049, 1049, 1049}, {2: 1047, 1047, 1047, 1047, 1047, 8: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 48: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 473: 1047, 491: 1047, 495: 1047, 499: 1047, 579: 1047}, // 2795 - {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 473: 1846, 491: 4158, 579: 1846, 853: 5304}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 579: 5308, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5307, 850: 5305, 888: 5306}, + {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 473: 1846, 491: 4159, 579: 1846, 853: 5305}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 579: 5309, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5308, 850: 5306, 888: 5307}, {922, 922, 7: 922, 47: 922, 472: 922, 474: 922, 480: 922, 922, 488: 922, 922, 493: 922, 922, 922, 922, 922, 500: 922, 502: 922, 504: 922, 513: 922, 922, 516: 922}, - {7: 5359, 504: 5429}, - {7: 920, 483: 5326, 5327, 504: 5416, 515: 5325, 517: 5328, 519: 5324, 5329, 5330, 816: 5323, 822: 5322}, + {7: 5360, 504: 5430}, + {7: 920, 483: 5327, 5328, 504: 5417, 515: 5326, 517: 5329, 519: 5325, 5330, 5331, 816: 5324, 822: 5323}, // 2800 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5413, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5414, 2732, 2733, 2731}, {918, 918, 7: 918, 47: 918, 472: 918, 474: 918, 480: 918, 918, 483: 918, 918, 488: 918, 918, 493: 918, 918, 918, 918, 918, 500: 918, 502: 918, 504: 918, 513: 918, 918, 918, 918, 918, 519: 918, 918, 918, 918}, {917, 917, 7: 917, 47: 917, 472: 917, 474: 917, 480: 917, 917, 483: 917, 917, 488: 917, 917, 493: 917, 917, 917, 917, 917, 500: 917, 502: 917, 504: 917, 513: 917, 917, 917, 917, 917, 519: 917, 917, 917, 917}, - {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 474: 913, 478: 913, 480: 913, 913, 483: 913, 913, 488: 913, 913, 5363, 913, 493: 913, 913, 913, 913, 913, 500: 913, 502: 913, 913, 913, 513: 913, 913, 913, 913, 913, 519: 913, 913, 913, 913, 525: 913, 913, 672: 913, 858: 5362}, - {911, 911, 2971, 2816, 2852, 2973, 2743, 911, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 911, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 911, 474: 911, 478: 5320, 480: 911, 911, 483: 911, 911, 488: 911, 911, 493: 911, 911, 911, 911, 911, 500: 911, 502: 911, 504: 911, 513: 911, 911, 911, 911, 911, 519: 911, 911, 911, 911, 663: 5319, 2731, 2732, 2730, 913: 5318, 5317}, + {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 474: 913, 478: 913, 480: 913, 913, 483: 913, 913, 488: 913, 913, 5364, 913, 493: 913, 913, 913, 913, 913, 500: 913, 502: 913, 913, 913, 513: 913, 913, 913, 913, 913, 519: 913, 913, 913, 913, 525: 913, 913, 672: 913, 858: 5363}, + {911, 911, 2972, 2817, 2853, 2974, 2744, 911, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 911, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 911, 474: 911, 478: 5321, 480: 911, 911, 483: 911, 911, 488: 911, 911, 493: 911, 911, 911, 911, 911, 500: 911, 502: 911, 504: 911, 513: 911, 911, 911, 911, 911, 519: 911, 911, 911, 911, 663: 5320, 2732, 2733, 2731, 913: 5319, 5318}, // 2805 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 2558, 501: 2557, 569: 2556, 579: 5308, 645: 2552, 663: 3889, 2731, 2732, 2730, 708: 5316, 736: 5311, 747: 3849, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 3851, 3850, 796: 5310, 800: 5309, 5315, 850: 5305, 888: 5314}, - {7: 5359, 47: 5360}, - {920, 920, 7: 920, 47: 920, 472: 920, 474: 920, 480: 920, 920, 483: 5326, 5327, 488: 920, 920, 493: 920, 920, 920, 920, 920, 500: 920, 502: 920, 504: 920, 513: 920, 920, 5325, 920, 5328, 519: 5324, 5329, 5330, 816: 5323, 822: 5322}, - {2: 2971, 2816, 2852, 2973, 2743, 911, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 3942, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 478: 5320, 480: 805, 483: 911, 911, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 515: 911, 517: 911, 519: 911, 911, 911, 663: 5319, 2731, 2732, 2730, 766: 3859, 3860, 913: 5318, 5317}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 2559, 501: 2558, 569: 2557, 579: 5309, 645: 2553, 663: 3890, 2732, 2733, 2731, 708: 5317, 736: 5312, 747: 3850, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 3852, 3851, 796: 5311, 800: 5310, 5316, 850: 5306, 888: 5315}, + {7: 5360, 47: 5361}, + {920, 920, 7: 920, 47: 920, 472: 920, 474: 920, 480: 920, 920, 483: 5327, 5328, 488: 920, 920, 493: 920, 920, 920, 920, 920, 500: 920, 502: 920, 504: 920, 513: 920, 920, 5326, 920, 5329, 519: 5325, 5330, 5331, 816: 5324, 822: 5323}, + {2: 2972, 2817, 2853, 2974, 2744, 911, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 3943, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 478: 5321, 480: 805, 483: 911, 911, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 515: 911, 517: 911, 519: 911, 911, 911, 663: 5320, 2732, 2733, 2731, 766: 3860, 3861, 913: 5319, 5318}, {915, 915, 7: 915, 47: 915, 472: 915, 474: 915, 480: 915, 915, 483: 915, 915, 488: 915, 915, 493: 915, 915, 915, 915, 915, 500: 915, 502: 915, 504: 915, 513: 915, 915, 915, 915, 915, 519: 915, 915, 915, 915}, // 2810 {910, 910, 7: 910, 47: 910, 472: 910, 474: 910, 480: 910, 910, 483: 910, 910, 488: 910, 910, 491: 910, 493: 910, 910, 910, 910, 910, 500: 910, 502: 910, 910, 910, 513: 910, 910, 910, 910, 910, 519: 910, 910, 910, 910, 525: 910, 910, 672: 910}, {909, 909, 7: 909, 47: 909, 472: 909, 474: 909, 480: 909, 909, 483: 909, 909, 488: 909, 909, 491: 909, 493: 909, 909, 909, 909, 909, 500: 909, 502: 909, 909, 909, 513: 909, 909, 909, 909, 909, 519: 909, 909, 909, 909, 525: 909, 909, 672: 909}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5321, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5322, 2732, 2733, 2731}, {908, 908, 7: 908, 47: 908, 472: 908, 474: 908, 480: 908, 908, 483: 908, 908, 488: 908, 908, 491: 908, 493: 908, 908, 908, 908, 908, 500: 908, 502: 908, 908, 908, 513: 908, 908, 908, 908, 908, 519: 908, 908, 908, 908, 525: 908, 908, 672: 908}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5352}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5353}, // 2815 - {517: 879, 906: 5339, 1094: 5343}, - {483: 5326, 5327, 517: 5336, 816: 5337}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5333}, + {517: 879, 906: 5340, 1094: 5344}, + {483: 5327, 5328, 517: 5337, 816: 5338}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5334}, {517: 881, 906: 881}, {517: 880, 906: 880}, // 2820 {2: 877, 877, 877, 877, 877, 8: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 48: 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 473: 877}, + {517: 5333}, {517: 5332}, - {517: 5331}, {2: 875, 875, 875, 875, 875, 8: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 48: 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 875, 473: 875}, {2: 876, 876, 876, 876, 876, 8: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 48: 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 876, 473: 876}, // 2825 - {883, 883, 7: 883, 47: 883, 472: 5334, 474: 883, 480: 883, 883, 483: 883, 883, 488: 883, 883, 493: 883, 883, 883, 883, 883, 500: 883, 502: 883, 504: 883, 513: 883, 883, 883, 883, 883, 519: 883, 883, 883, 883, 816: 5323, 822: 5322}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5335}, - {882, 882, 7: 882, 47: 882, 472: 882, 474: 882, 480: 882, 882, 483: 882, 882, 488: 882, 882, 493: 882, 882, 882, 882, 882, 500: 882, 502: 882, 504: 882, 3313, 509: 3311, 3312, 3310, 3308, 882, 882, 882, 882, 882, 519: 882, 882, 882, 882, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5342}, - {517: 879, 906: 5339, 1094: 5338}, + {883, 883, 7: 883, 47: 883, 472: 5335, 474: 883, 480: 883, 883, 483: 883, 883, 488: 883, 883, 493: 883, 883, 883, 883, 883, 500: 883, 502: 883, 504: 883, 513: 883, 883, 883, 883, 883, 519: 883, 883, 883, 883, 816: 5324, 822: 5323}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5336}, + {882, 882, 7: 882, 47: 882, 472: 882, 474: 882, 480: 882, 882, 483: 882, 882, 488: 882, 882, 493: 882, 882, 882, 882, 882, 500: 882, 502: 882, 504: 882, 3314, 509: 3312, 3313, 3311, 3309, 882, 882, 882, 882, 882, 519: 882, 882, 882, 882, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5343}, + {517: 879, 906: 5340, 1094: 5339}, // 2830 - {517: 5340}, + {517: 5341}, {517: 878}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5341}, - {884, 884, 7: 884, 47: 884, 472: 884, 474: 884, 480: 884, 884, 483: 884, 884, 488: 884, 884, 493: 884, 884, 884, 884, 884, 500: 884, 502: 884, 504: 884, 513: 884, 884, 884, 884, 884, 519: 884, 884, 884, 884, 816: 5323, 822: 5322}, - {885, 885, 7: 885, 47: 885, 472: 885, 474: 885, 480: 885, 885, 483: 885, 885, 488: 885, 885, 493: 885, 885, 885, 885, 885, 500: 885, 502: 885, 504: 885, 513: 885, 885, 885, 885, 885, 519: 885, 885, 885, 885, 816: 5323, 822: 5322}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5342}, + {884, 884, 7: 884, 47: 884, 472: 884, 474: 884, 480: 884, 884, 483: 884, 884, 488: 884, 884, 493: 884, 884, 884, 884, 884, 500: 884, 502: 884, 504: 884, 513: 884, 884, 884, 884, 884, 519: 884, 884, 884, 884, 816: 5324, 822: 5323}, + {885, 885, 7: 885, 47: 885, 472: 885, 474: 885, 480: 885, 885, 483: 885, 885, 488: 885, 885, 493: 885, 885, 885, 885, 885, 500: 885, 502: 885, 504: 885, 513: 885, 885, 885, 885, 885, 519: 885, 885, 885, 885, 816: 5324, 822: 5323}, // 2835 - {517: 5344}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5345}, - {472: 5346, 481: 5347, 483: 5326, 5327, 515: 5325, 517: 5328, 519: 5324, 5329, 5330, 816: 5323, 822: 5322}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5351}, - {473: 5348}, + {517: 5345}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5346}, + {472: 5347, 481: 5348, 483: 5327, 5328, 515: 5326, 517: 5329, 519: 5325, 5330, 5331, 816: 5324, 822: 5323}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5352}, + {473: 5349}, // 2840 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 5349}, - {7: 4114, 47: 5350}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 5350}, + {7: 4115, 47: 5351}, {886, 886, 7: 886, 47: 886, 472: 886, 474: 886, 480: 886, 886, 483: 886, 886, 488: 886, 886, 493: 886, 886, 886, 886, 886, 500: 886, 502: 886, 504: 886, 513: 886, 886, 886, 886, 886, 519: 886, 886, 886, 886}, - {887, 887, 7: 887, 47: 887, 472: 887, 474: 887, 480: 887, 887, 483: 887, 887, 488: 887, 887, 493: 887, 887, 887, 887, 887, 500: 887, 502: 887, 504: 887, 3313, 509: 3311, 3312, 3310, 3308, 887, 887, 887, 887, 887, 519: 887, 887, 887, 887, 733: 3309, 3307}, - {890, 890, 7: 890, 47: 890, 472: 5353, 474: 890, 480: 890, 5354, 483: 5326, 5327, 488: 890, 890, 493: 890, 890, 890, 890, 890, 500: 890, 502: 890, 504: 890, 513: 890, 890, 5325, 890, 5328, 519: 5324, 5329, 5330, 890, 816: 5323, 822: 5322}, + {887, 887, 7: 887, 47: 887, 472: 887, 474: 887, 480: 887, 887, 483: 887, 887, 488: 887, 887, 493: 887, 887, 887, 887, 887, 500: 887, 502: 887, 504: 887, 3314, 509: 3312, 3313, 3311, 3309, 887, 887, 887, 887, 887, 519: 887, 887, 887, 887, 733: 3310, 3308}, + {890, 890, 7: 890, 47: 890, 472: 5354, 474: 890, 480: 890, 5355, 483: 5327, 5328, 488: 890, 890, 493: 890, 890, 890, 890, 890, 500: 890, 502: 890, 504: 890, 513: 890, 890, 5326, 890, 5329, 519: 5325, 5330, 5331, 890, 816: 5324, 822: 5323}, // 2845 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5358}, - {473: 5355}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 5356}, - {7: 4114, 47: 5357}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5359}, + {473: 5356}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 5357}, + {7: 4115, 47: 5358}, {888, 888, 7: 888, 47: 888, 472: 888, 474: 888, 480: 888, 888, 483: 888, 888, 488: 888, 888, 493: 888, 888, 888, 888, 888, 500: 888, 502: 888, 504: 888, 513: 888, 888, 888, 888, 888, 519: 888, 888, 888, 888}, // 2850 - {889, 889, 7: 889, 47: 889, 472: 889, 474: 889, 480: 889, 889, 483: 889, 889, 488: 889, 889, 493: 889, 889, 889, 889, 889, 500: 889, 502: 889, 504: 889, 3313, 509: 3311, 3312, 3310, 3308, 889, 889, 889, 889, 889, 519: 889, 889, 889, 889, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 579: 5308, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5315, 850: 5361}, + {889, 889, 7: 889, 47: 889, 472: 889, 474: 889, 480: 889, 889, 483: 889, 889, 488: 889, 889, 493: 889, 889, 889, 889, 889, 500: 889, 502: 889, 504: 889, 3314, 509: 3312, 3313, 3311, 3309, 889, 889, 889, 889, 889, 519: 889, 889, 889, 889, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 579: 5309, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5316, 850: 5362}, {914, 914, 7: 914, 47: 914, 472: 914, 474: 914, 480: 914, 914, 483: 914, 914, 488: 914, 914, 493: 914, 914, 914, 914, 914, 500: 914, 502: 914, 504: 914, 513: 914, 914, 914, 914, 914, 519: 914, 914, 914, 914}, {921, 921, 7: 921, 47: 921, 472: 921, 474: 921, 480: 921, 921, 488: 921, 921, 493: 921, 921, 921, 921, 921, 500: 921, 502: 921, 504: 921, 513: 921, 921, 516: 921}, - {911, 911, 2971, 2816, 2852, 2973, 2743, 911, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 911, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 911, 474: 911, 478: 5320, 480: 911, 911, 483: 911, 911, 488: 911, 911, 491: 911, 493: 911, 911, 911, 911, 911, 500: 911, 502: 911, 911, 911, 513: 911, 911, 911, 911, 911, 519: 911, 911, 911, 911, 525: 911, 911, 663: 5319, 2731, 2732, 2730, 672: 911, 913: 5318, 5367}, + {911, 911, 2972, 2817, 2853, 2974, 2744, 911, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 911, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 911, 474: 911, 478: 5321, 480: 911, 911, 483: 911, 911, 488: 911, 911, 491: 911, 493: 911, 911, 911, 911, 911, 500: 911, 502: 911, 911, 911, 513: 911, 911, 911, 911, 911, 519: 911, 911, 911, 911, 525: 911, 911, 663: 5320, 2732, 2733, 2731, 672: 911, 913: 5319, 5368}, // 2855 - {473: 5364}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 5365}, - {7: 4713, 47: 5366}, + {473: 5365}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 5366}, + {7: 4714, 47: 5367}, {912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 478: 912, 480: 912, 912, 483: 912, 912, 488: 912, 912, 491: 912, 493: 912, 912, 912, 912, 912, 500: 912, 912, 912, 912, 912, 513: 912, 912, 912, 912, 912, 519: 912, 912, 912, 912, 525: 912, 912, 555: 912, 569: 912, 645: 912, 648: 912, 659: 912, 672: 912}, - {1853, 1853, 7: 1853, 47: 1853, 472: 1853, 474: 1853, 480: 1853, 1853, 483: 1853, 1853, 488: 1853, 1853, 491: 1853, 493: 1853, 1853, 1853, 1853, 1853, 500: 1853, 502: 1853, 1853, 1853, 513: 1853, 1853, 1853, 1853, 1853, 519: 1853, 1853, 1853, 1853, 525: 1853, 1853, 672: 5369, 922: 5368, 1171: 5370}, + {1853, 1853, 7: 1853, 47: 1853, 472: 1853, 474: 1853, 480: 1853, 1853, 483: 1853, 1853, 488: 1853, 1853, 491: 1853, 493: 1853, 1853, 1853, 1853, 1853, 500: 1853, 502: 1853, 1853, 1853, 513: 1853, 1853, 1853, 1853, 1853, 519: 1853, 1853, 1853, 1853, 525: 1853, 1853, 672: 5370, 922: 5369, 1171: 5371}, // 2860 {1852, 1852, 7: 1852, 47: 1852, 472: 1852, 474: 1852, 480: 1852, 1852, 483: 1852, 1852, 488: 1852, 1852, 491: 1852, 493: 1852, 1852, 1852, 1852, 1852, 500: 1852, 502: 1852, 1852, 1852, 513: 1852, 1852, 1852, 1852, 1852, 519: 1852, 1852, 1852, 1852, 525: 1852, 1852}, - {218: 5411}, - {892, 892, 7: 892, 47: 892, 472: 892, 474: 892, 480: 892, 892, 483: 892, 892, 488: 892, 892, 491: 5373, 493: 892, 892, 892, 892, 892, 500: 892, 502: 892, 5374, 892, 513: 892, 892, 892, 892, 892, 519: 892, 892, 892, 892, 525: 5372, 892, 938: 5376, 5375, 1060: 5377, 5371}, - {1007, 1007, 7: 1007, 47: 1007, 472: 1007, 474: 1007, 480: 1007, 1007, 483: 1007, 1007, 488: 1007, 1007, 493: 1007, 1007, 1007, 1007, 1007, 500: 1007, 502: 1007, 504: 1007, 513: 1007, 1007, 1007, 1007, 1007, 519: 1007, 1007, 1007, 1007, 526: 5392, 1315: 5393}, - {573: 4374, 648: 4375, 827: 5391}, + {218: 5412}, + {892, 892, 7: 892, 47: 892, 472: 892, 474: 892, 480: 892, 892, 483: 892, 892, 488: 892, 892, 491: 5374, 493: 892, 892, 892, 892, 892, 500: 892, 502: 892, 5375, 892, 513: 892, 892, 892, 892, 892, 519: 892, 892, 892, 892, 525: 5373, 892, 938: 5377, 5376, 1060: 5378, 5372}, + {1007, 1007, 7: 1007, 47: 1007, 472: 1007, 474: 1007, 480: 1007, 1007, 483: 1007, 1007, 488: 1007, 1007, 493: 1007, 1007, 1007, 1007, 1007, 500: 1007, 502: 1007, 504: 1007, 513: 1007, 1007, 1007, 1007, 1007, 519: 1007, 1007, 1007, 1007, 526: 5393, 1315: 5394}, + {573: 4375, 648: 4376, 827: 5392}, // 2865 - {573: 4374, 648: 4375, 827: 5390}, - {573: 4374, 648: 4375, 827: 5389}, - {473: 904, 494: 5379, 1225: 5380}, + {573: 4375, 648: 4376, 827: 5391}, + {573: 4375, 648: 4376, 827: 5390}, + {473: 904, 494: 5380, 1225: 5381}, {894, 894, 7: 894, 47: 894, 472: 894, 474: 894, 480: 894, 894, 483: 894, 894, 488: 894, 894, 491: 894, 493: 894, 894, 894, 894, 894, 500: 894, 502: 894, 894, 894, 513: 894, 894, 894, 894, 894, 519: 894, 894, 894, 894, 525: 894, 894}, - {891, 891, 7: 891, 47: 891, 472: 891, 474: 891, 480: 891, 891, 483: 891, 891, 488: 891, 891, 491: 5373, 493: 891, 891, 891, 891, 891, 500: 891, 502: 891, 5374, 891, 513: 891, 891, 891, 891, 891, 519: 891, 891, 891, 891, 525: 5372, 891, 938: 5378, 5375}, + {891, 891, 7: 891, 47: 891, 472: 891, 474: 891, 480: 891, 891, 483: 891, 891, 488: 891, 891, 491: 5374, 493: 891, 891, 891, 891, 891, 500: 891, 502: 891, 5375, 891, 513: 891, 891, 891, 891, 891, 519: 891, 891, 891, 891, 525: 5373, 891, 938: 5379, 5376}, // 2870 {893, 893, 7: 893, 47: 893, 472: 893, 474: 893, 480: 893, 893, 483: 893, 893, 488: 893, 893, 491: 893, 493: 893, 893, 893, 893, 893, 500: 893, 502: 893, 893, 893, 513: 893, 893, 893, 893, 893, 519: 893, 893, 893, 893, 525: 893, 893}, - {502: 5385, 513: 5386, 517: 5384}, - {473: 5381}, - {2: 2971, 2816, 2852, 2973, 2743, 899, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 899, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 586: 4975, 663: 4974, 2731, 2732, 2730, 855: 5382}, - {7: 4977, 47: 5383}, + {502: 5386, 513: 5387, 517: 5385}, + {473: 5382}, + {2: 2972, 2817, 2853, 2974, 2744, 899, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 899, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 586: 4976, 663: 4975, 2732, 2733, 2731, 855: 5383}, + {7: 4978, 47: 5384}, // 2875 {900, 900, 7: 900, 47: 900, 472: 900, 474: 900, 480: 900, 900, 483: 900, 900, 488: 900, 900, 491: 900, 493: 900, 900, 900, 900, 900, 500: 900, 502: 900, 900, 900, 513: 900, 900, 900, 900, 900, 519: 900, 900, 900, 900, 525: 900, 900}, {473: 903}, + {659: 5389}, {659: 5388}, - {659: 5387}, {473: 901}, // 2880 {473: 902}, {473: 905, 494: 905}, {473: 906, 494: 906}, {473: 907, 494: 907}, - {86: 5397, 309: 5396, 393: 5395, 473: 1004, 1314: 5394}, + {86: 5398, 309: 5397, 393: 5396, 473: 1004, 1314: 5395}, // 2885 {916, 916, 7: 916, 47: 916, 472: 916, 474: 916, 480: 916, 916, 483: 916, 916, 488: 916, 916, 493: 916, 916, 916, 916, 916, 500: 916, 502: 916, 504: 916, 513: 916, 916, 916, 916, 916, 519: 916, 916, 916, 916}, - {473: 5398}, + {473: 5399}, {473: 1003}, {473: 1002}, {473: 1001}, // 2890 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 5400, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5399}, - {47: 1000, 371: 5408, 505: 3313, 509: 3311, 3312, 3310, 3308, 524: 5407, 733: 3309, 3307, 1316: 5406}, - {997, 997, 7: 997, 47: 997, 212: 5402, 472: 997, 474: 997, 480: 997, 997, 483: 997, 997, 488: 997, 997, 493: 997, 997, 997, 997, 997, 500: 997, 502: 997, 504: 997, 513: 997, 997, 997, 997, 997, 519: 997, 997, 997, 997, 1112: 5401}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 5401, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5400}, + {47: 1000, 371: 5409, 505: 3314, 509: 3312, 3313, 3311, 3309, 524: 5408, 733: 3310, 3308, 1316: 5407}, + {997, 997, 7: 997, 47: 997, 212: 5403, 472: 997, 474: 997, 480: 997, 997, 483: 997, 997, 488: 997, 997, 493: 997, 997, 997, 997, 997, 500: 997, 502: 997, 504: 997, 513: 997, 997, 997, 997, 997, 519: 997, 997, 997, 997, 1112: 5402}, {1005, 1005, 7: 1005, 47: 1005, 472: 1005, 474: 1005, 480: 1005, 1005, 483: 1005, 1005, 488: 1005, 1005, 493: 1005, 1005, 1005, 1005, 1005, 500: 1005, 502: 1005, 504: 1005, 513: 1005, 1005, 1005, 1005, 1005, 519: 1005, 1005, 1005, 1005}, - {473: 5403}, + {473: 5404}, // 2895 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5404}, - {47: 5405, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5405}, + {47: 5406, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, {996, 996, 7: 996, 47: 996, 472: 996, 474: 996, 480: 996, 996, 483: 996, 996, 488: 996, 996, 493: 996, 996, 996, 996, 996, 500: 996, 502: 996, 504: 996, 513: 996, 996, 996, 996, 996, 519: 996, 996, 996, 996}, - {47: 5409}, + {47: 5410}, {47: 999}, // 2900 {47: 998}, - {997, 997, 7: 997, 47: 997, 212: 5402, 472: 997, 474: 997, 480: 997, 997, 483: 997, 997, 488: 997, 997, 493: 997, 997, 997, 997, 997, 500: 997, 502: 997, 504: 997, 513: 997, 997, 997, 997, 997, 519: 997, 997, 997, 997, 1112: 5410}, + {997, 997, 7: 997, 47: 997, 212: 5403, 472: 997, 474: 997, 480: 997, 997, 483: 997, 997, 488: 997, 997, 493: 997, 997, 997, 997, 997, 500: 997, 502: 997, 504: 997, 513: 997, 997, 997, 997, 997, 519: 997, 997, 997, 997, 1112: 5411}, {1006, 1006, 7: 1006, 47: 1006, 472: 1006, 474: 1006, 480: 1006, 1006, 483: 1006, 1006, 488: 1006, 1006, 493: 1006, 1006, 1006, 1006, 1006, 500: 1006, 502: 1006, 504: 1006, 513: 1006, 1006, 1006, 1006, 1006, 519: 1006, 1006, 1006, 1006}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5412}, - {1851, 1851, 7: 1851, 47: 1851, 472: 1851, 474: 1851, 480: 1851, 1851, 483: 1851, 1851, 488: 1851, 1851, 491: 1851, 493: 1851, 1851, 1851, 1851, 1851, 500: 1851, 502: 1851, 1851, 1851, 3313, 509: 3311, 3312, 3310, 3308, 1851, 1851, 1851, 1851, 1851, 519: 1851, 1851, 1851, 1851, 525: 1851, 1851, 733: 3309, 3307}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5413}, + {1851, 1851, 7: 1851, 47: 1851, 472: 1851, 474: 1851, 480: 1851, 1851, 483: 1851, 1851, 488: 1851, 1851, 491: 1851, 493: 1851, 1851, 1851, 1851, 1851, 500: 1851, 502: 1851, 1851, 1851, 3314, 509: 3312, 3313, 3311, 3309, 1851, 1851, 1851, 1851, 1851, 519: 1851, 1851, 1851, 1851, 525: 1851, 1851, 733: 3310, 3308}, // 2905 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5414}, - {483: 5326, 5327, 515: 5325, 517: 5328, 519: 5324, 5329, 5330, 5415, 816: 5323, 822: 5322}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5415}, + {483: 5327, 5328, 515: 5326, 517: 5329, 519: 5325, 5330, 5331, 5416, 816: 5324, 822: 5323}, {919, 919, 7: 919, 47: 919, 472: 919, 474: 919, 480: 919, 919, 488: 919, 919, 493: 919, 919, 919, 919, 919, 500: 919, 502: 919, 504: 919, 513: 919, 919, 516: 919}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 5417, 890: 5418, 923: 5419}, - {498: 5427}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 5418, 890: 5419, 923: 5420}, + {498: 5428}, // 2910 {2332, 2332, 7: 2332, 481: 2332, 493: 2332, 497: 2332, 502: 2332}, - {245, 245, 7: 5420, 481: 245, 493: 245, 497: 2691, 502: 245, 789: 2692, 5421}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 5417, 890: 5426}, - {1287, 1287, 481: 1287, 493: 1287, 502: 2694, 766: 2695, 810: 5422}, - {874, 874, 481: 874, 493: 5423, 1069: 5424}, + {245, 245, 7: 5421, 481: 245, 493: 245, 497: 2692, 502: 245, 789: 2693, 5422}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 5418, 890: 5427}, + {1287, 1287, 481: 1287, 493: 1287, 502: 2695, 766: 2696, 810: 5423}, + {874, 874, 481: 874, 493: 5424, 1069: 5425}, // 2915 - {508: 2705, 578: 2707, 732: 2704, 743: 2706, 880: 5425}, + {508: 2706, 578: 2708, 732: 2705, 743: 2707, 880: 5426}, {249, 249, 481: 249}, {873, 873, 481: 873}, {2331, 2331, 7: 2331, 481: 2331, 493: 2331, 497: 2331, 502: 2331}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5428}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5429}, // 2920 {2333, 2333, 7: 2333, 481: 2333, 493: 2333, 497: 2333, 502: 2333}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 5417, 890: 5418, 923: 5430}, - {245, 245, 7: 5420, 481: 245, 497: 2691, 789: 2692, 5431}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 5418, 890: 5419, 923: 5431}, + {245, 245, 7: 5421, 481: 245, 497: 2692, 789: 2693, 5432}, {248, 248, 481: 248}, {2: 387, 387, 387, 387, 387, 8: 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 48: 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387}, // 2925 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5434}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5435}, {386, 386}, - {20: 5447, 122: 5437, 124: 5440, 143: 570, 185: 5439, 192: 5450, 202: 5448, 216: 5441, 230: 5445, 252: 5449, 255: 5442, 543: 5446, 569: 5436, 1145: 5444, 1214: 5438, 1242: 5443}, + {20: 5448, 122: 5438, 124: 5441, 143: 570, 185: 5440, 192: 5451, 202: 5449, 216: 5442, 230: 5446, 252: 5450, 255: 5443, 543: 5447, 569: 5437, 1145: 5445, 1214: 5439, 1242: 5444}, {2039, 2039, 2039, 2039, 2039, 2039, 2039, 8: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 48: 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 474: 2039, 566: 2039}, {2038, 2038, 2038, 2038, 2038, 2038, 2038, 8: 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 48: 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 2038, 474: 2038, 566: 2038}, // 2930 {580, 580}, {577, 577}, {576, 576}, - {208: 5457}, + {208: 5458}, {574, 574}, // 2935 - {143: 5456}, - {561, 561, 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 474: 561, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 4267, 1144: 5451}, + {143: 5457}, + {561, 561, 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 474: 561, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 4268, 1144: 5452}, {571, 571}, {143: 569}, {143: 568}, @@ -9645,190 +9646,190 @@ var ( {143: 567}, {143: 566}, {143: 565}, - {557, 557, 474: 5453, 1343: 5452}, + {557, 557, 474: 5454, 1343: 5453}, {572, 572}, // 2945 - {670: 5454}, - {496: 5455}, + {670: 5455}, + {496: 5456}, {556, 556}, {573, 573}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5458, 2731, 2732, 2730, 953: 5459}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5459, 2732, 2733, 2731, 953: 5460}, // 2950 {579, 579, 7: 579}, - {575, 575, 7: 5460}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5461, 2731, 2732, 2730}, + {575, 575, 7: 5461}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5462, 2732, 2733, 2731}, {578, 578, 7: 578}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 5565, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 5566, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 5567, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5568}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 5566, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 5567, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 5568, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5569}, // 2955 - {569: 5551, 648: 5552}, - {648: 5548}, - {569: 5543, 648: 5542}, - {569: 5540}, - {326: 5534}, + {569: 5552, 648: 5553}, + {648: 5549}, + {569: 5544, 648: 5543}, + {569: 5541}, + {326: 5535}, // 2960 - {139: 5531, 214: 5533, 336: 5529, 366: 5530, 912: 5532}, - {198: 5526, 201: 5525}, - {569: 5484}, - {139: 5478, 158: 5480, 167: 589, 191: 5482, 257: 5481, 1301: 5479}, - {139: 5477}, + {139: 5532, 214: 5534, 336: 5530, 366: 5531, 912: 5533}, + {198: 5527, 201: 5526}, + {569: 5485}, + {139: 5479, 158: 5481, 167: 589, 191: 5483, 257: 5482, 1301: 5480}, + {139: 5478}, // 2965 - {139: 5476}, - {396: 5475}, + {139: 5477}, + {396: 5476}, {693, 693}, {698, 698}, {699, 699}, // 2970 {700, 700}, - {167: 5483}, + {167: 5484}, {167: 588}, {167: 587}, {167: 586}, // 2975 {692, 692}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5485}, - {673: 5486, 929: 5487}, - {158: 5490, 162: 5489, 569: 2054, 948: 5488}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5486}, + {673: 5487, 929: 5488}, + {158: 5491, 162: 5490, 569: 2054, 948: 5489}, {701, 701}, // 2980 - {569: 5492}, + {569: 5493}, {122: 2053, 569: 2053}, - {162: 5491}, + {162: 5492}, {122: 2052, 569: 2052}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 5493}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 5494}, // 2985 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5494}, - {433, 433, 4: 433, 433, 433, 13: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 472: 433, 5498, 433, 478: 433, 433, 433, 482: 433, 490: 433, 433, 501: 433, 503: 433, 506: 433, 433, 518: 5497, 569: 433, 645: 433, 433, 648: 433, 1237: 5496, 1311: 5495}, - {393, 393, 4: 4206, 4208, 397, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 472: 393, 393, 393, 478: 393, 4205, 4242, 482: 2156, 490: 393, 393, 501: 393, 503: 4934, 506: 2156, 393, 569: 393, 645: 393, 2156, 648: 4211, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4244, 917: 5513, 1016: 5512}, - {2159, 2159, 472: 5506, 1084: 5505}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5504}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5495}, + {433, 433, 4: 433, 433, 433, 13: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 472: 433, 5499, 433, 478: 433, 433, 433, 482: 433, 490: 433, 433, 501: 433, 503: 433, 506: 433, 433, 518: 5498, 569: 433, 645: 433, 433, 648: 433, 1237: 5497, 1311: 5496}, + {393, 393, 4: 4207, 4209, 397, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 472: 393, 393, 393, 478: 393, 4206, 4243, 482: 2156, 490: 393, 393, 501: 393, 503: 4935, 506: 2156, 393, 569: 393, 645: 393, 2156, 648: 4212, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4245, 917: 5514, 1016: 5513}, + {2159, 2159, 472: 5507, 1084: 5506}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5505}, // 2990 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 518: 5499, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4553, 648: 2382, 663: 4111, 2731, 2732, 2730, 674: 2382, 2382, 742: 4420, 831: 4774, 846: 4906, 901: 4907, 966: 4908, 1142: 5500}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5502}, - {7: 4910, 47: 5501}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 518: 5500, 573: 2382, 582: 2382, 586: 2382, 638: 2382, 642: 4554, 648: 2382, 663: 4112, 2732, 2733, 2731, 674: 2382, 2382, 742: 4421, 831: 4775, 846: 4907, 901: 4908, 966: 4909, 1142: 5501}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5503}, + {7: 4911, 47: 5502}, {432, 432, 4: 432, 432, 432, 13: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 472: 432, 432, 432, 478: 432, 432, 432, 482: 432, 490: 432, 432, 501: 432, 503: 432, 506: 432, 432, 569: 432, 645: 432, 432, 648: 432}, - {47: 5503}, + {47: 5504}, // 2995 {2087, 2087, 472: 2087}, {2088, 2088, 472: 2088}, {2160, 2160}, - {145: 5507}, - {373: 5509, 738: 5508}, + {145: 5508}, + {373: 5510, 738: 5509}, // 3000 + {524: 5512}, {524: 5511}, - {524: 5510}, {2157, 2157}, {2158, 2158}, - {2154, 2154, 472: 2154, 2154, 2154, 478: 2154, 490: 5515, 2154, 501: 2154, 507: 2154, 569: 2154, 645: 2154, 1097: 5514}, + {2154, 2154, 472: 2154, 2154, 2154, 478: 2154, 490: 5516, 2154, 501: 2154, 507: 2154, 569: 2154, 645: 2154, 1097: 5515}, // 3005 - {392, 392, 4: 4206, 4208, 397, 4936, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 472: 392, 392, 392, 478: 392, 4205, 4242, 482: 2156, 490: 392, 392, 501: 392, 503: 4934, 506: 2156, 392, 569: 392, 645: 392, 2156, 648: 4211, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4935}, - {2102, 2102, 472: 2102, 2102, 2102, 478: 2102, 491: 5104, 501: 2102, 507: 5105, 569: 2102, 645: 2102, 1036: 5516}, - {659: 4986}, - {2099, 2099, 472: 2099, 2099, 2099, 478: 5518, 501: 2099, 569: 2099, 645: 2099, 1172: 5517}, - {2097, 2097, 472: 2097, 2559, 2558, 501: 2557, 569: 2556, 645: 2552, 708: 5523, 747: 5521, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 5522, 5520, 1194: 5519}, + {392, 392, 4: 4207, 4209, 397, 4937, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 472: 392, 392, 392, 478: 392, 4206, 4243, 482: 2156, 490: 392, 392, 501: 392, 503: 4935, 506: 2156, 392, 569: 392, 645: 392, 2156, 648: 4212, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4936}, + {2102, 2102, 472: 2102, 2102, 2102, 478: 2102, 491: 5105, 501: 2102, 507: 5106, 569: 2102, 645: 2102, 1036: 5517}, + {659: 4987}, + {2099, 2099, 472: 2099, 2099, 2099, 478: 5519, 501: 2099, 569: 2099, 645: 2099, 1172: 5518}, + {2097, 2097, 472: 2097, 2560, 2559, 501: 2558, 569: 2557, 645: 2553, 708: 5524, 747: 5522, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 5523, 5521, 1194: 5520}, // 3010 {2098, 2098, 472: 2098, 2098, 2098, 501: 2098, 569: 2098, 645: 2098}, - {2159, 2159, 472: 5506, 1084: 5524}, + {2159, 2159, 472: 5507, 1084: 5525}, {2096, 2096, 472: 2096}, {2095, 2095, 472: 2095, 480: 806, 488: 806, 806}, {2094, 2094, 472: 2094}, // 3015 - {2093, 2093, 472: 2093, 480: 805, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {2093, 2093, 472: 2093, 480: 805, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, {2161, 2161}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5458, 2731, 2732, 2730, 953: 5528}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5458, 2731, 2732, 2730, 953: 5527}, - {703, 703, 7: 5460}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5459, 2732, 2733, 2731, 953: 5529}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5459, 2732, 2733, 2731, 953: 5528}, + {703, 703, 7: 5461}, // 3020 - {704, 704, 7: 5460}, + {704, 704, 7: 5461}, {706, 706}, {705, 705}, {697, 697}, {696, 696}, // 3025 {695, 695}, - {261: 5535}, - {508: 2705, 732: 4021, 763: 5537, 1080: 5536}, - {709, 709, 7: 5538}, + {261: 5536}, + {508: 2706, 732: 4022, 763: 5538, 1080: 5537}, + {709, 709, 7: 5539}, {684, 684, 7: 684}, // 3030 - {508: 2705, 732: 4021, 763: 5539}, + {508: 2706, 732: 4022, 763: 5540}, {683, 683, 7: 683}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 5541}, - {710, 710, 7: 3892}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5546}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 5542}, + {710, 710, 7: 3893}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5547}, // 3035 - {496: 5544}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 5545}, - {702, 702, 7: 3892}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5547, 2731, 2732, 2730}, + {496: 5545}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 5546}, + {702, 702, 7: 3893}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5548, 2732, 2733, 2731}, {712, 712}, // 3040 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5549}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5550, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5550}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5551, 2732, 2733, 2731}, {713, 713}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 5564}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5553}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 5565}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5554}, // 3045 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5554, 2731, 2732, 2730}, - {714, 714, 473: 5557, 1055: 5556, 1219: 5555}, - {711, 711, 7: 5562}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5555, 2732, 2733, 2731}, + {714, 714, 473: 5558, 1055: 5557, 1219: 5556}, + {711, 711, 7: 5563}, {687, 687, 7: 687}, - {508: 2705, 732: 4021, 763: 5558}, + {508: 2706, 732: 4022, 763: 5559}, // 3050 - {7: 5559}, - {508: 2705, 732: 4021, 763: 5560}, - {47: 5561}, + {7: 5560}, + {508: 2706, 732: 4022, 763: 5561}, + {47: 5562}, {685, 685, 7: 685}, - {473: 5557, 1055: 5563}, + {473: 5558, 1055: 5564}, // 3055 {686, 686, 7: 686}, - {715, 715, 7: 3892}, - {159: 1630, 377: 5578, 401: 5579, 651: 1630, 1163: 5577}, - {719, 719, 159: 1471, 260: 5571, 5570, 651: 1471}, + {715, 715, 7: 3893}, + {159: 1630, 377: 5579, 401: 5580, 651: 1630, 1163: 5578}, + {719, 719, 159: 1471, 260: 5572, 5571, 651: 1471}, {694, 694, 159: 1451, 651: 1451}, // 3060 - {159: 5569}, + {159: 5570}, {716, 716}, - {245, 245, 497: 2691, 508: 2705, 732: 4021, 763: 5575, 789: 2692, 5574}, - {376: 5572}, - {508: 2705, 732: 4021, 763: 5537, 1080: 5573}, + {245, 245, 497: 2692, 508: 2706, 732: 4022, 763: 5576, 789: 2693, 5575}, + {376: 5573}, + {508: 2706, 732: 4022, 763: 5538, 1080: 5574}, // 3065 - {708, 708, 7: 5538}, + {708, 708, 7: 5539}, {718, 718}, - {245, 245, 497: 2691, 789: 2692, 5576}, + {245, 245, 497: 2692, 789: 2693, 5577}, {717, 717}, {707, 707}, // 3070 - {508: 2705, 732: 5585}, - {347: 5581, 508: 2705, 650: 5582, 732: 5580}, + {508: 2706, 732: 5586}, + {347: 5582, 508: 2706, 650: 5583, 732: 5581}, {690, 690}, - {508: 2705, 732: 5584}, - {508: 2705, 732: 5583}, + {508: 2706, 732: 5585}, + {508: 2706, 732: 5584}, // 3075 {688, 688}, {689, 689}, {691, 691}, {2: 267, 267, 267, 267, 267, 8: 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 48: 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 475: 267, 479: 267, 498: 1794, 543: 267, 651: 1794, 658: 1794}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5738, 498: 1792, 651: 1792, 658: 1792, 663: 5737, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5739, 498: 1792, 651: 1792, 658: 1792, 663: 5738, 2732, 2733, 2731}, // 3080 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 5735, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 498: 1755, 651: 1755, 658: 1755, 663: 5599, 2731, 2732, 2730, 829: 5642}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 498: 1749, 651: 1749, 658: 1749, 663: 5599, 2731, 2732, 2730, 829: 5732}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 479: 5728, 498: 1747, 543: 3729, 651: 1747, 658: 1747, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 5727}, - {494: 5717, 498: 5716, 651: 1742, 658: 1742}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 5623, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 479: 5713, 498: 1733, 650: 5711, 1733, 658: 1733, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5630, 5628, 860: 5626, 1123: 5712, 1286: 5710}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 5736, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 498: 1755, 651: 1755, 658: 1755, 663: 5600, 2732, 2733, 2731, 829: 5643}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 498: 1749, 651: 1749, 658: 1749, 663: 5600, 2732, 2733, 2731, 829: 5733}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 479: 5729, 498: 1747, 543: 3730, 651: 1747, 658: 1747, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 5728}, + {494: 5718, 498: 5717, 651: 1742, 658: 1742}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 5624, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 479: 5714, 498: 1733, 650: 5712, 1733, 658: 1733, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5631, 5629, 860: 5627, 1123: 5713, 1286: 5711}, // 3085 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 5708, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 498: 1731, 651: 1731, 658: 1731, 663: 5599, 2731, 2732, 2730, 829: 5639}, - {177: 5693, 498: 1714, 651: 1714, 658: 1714, 670: 5694, 919: 5692, 969: 5691}, - {328: 5647, 330: 5646, 498: 1658, 651: 1658, 658: 1658, 1176: 5648}, - {475: 5645, 498: 1460, 651: 1460, 658: 1460}, - {798, 798, 7: 5635}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 5709, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 498: 1731, 651: 1731, 658: 1731, 663: 5600, 2732, 2733, 2731, 829: 5640}, + {177: 5694, 498: 1714, 651: 1714, 658: 1714, 670: 5695, 919: 5693, 969: 5692}, + {328: 5648, 330: 5647, 498: 1658, 651: 1658, 658: 1658, 1176: 5649}, + {475: 5646, 498: 1460, 651: 1460, 658: 1460}, + {798, 798, 7: 5636}, // 3090 - {169: 5621}, - {498: 766, 651: 5619, 658: 766}, - {498: 5608, 658: 5609, 823: 5617}, - {498: 5608, 658: 5609, 823: 5612}, - {498: 5608, 658: 5609, 823: 5610}, + {169: 5622}, + {498: 766, 651: 5620, 658: 766}, + {498: 5609, 658: 5610, 823: 5618}, + {498: 5609, 658: 5610, 823: 5613}, + {498: 5609, 658: 5610, 823: 5611}, // 3095 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 479: 5607, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 5606, 1181: 5605}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 479: 5608, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 5607, 1181: 5606}, {744, 744, 7: 744}, {751, 751, 7: 751}, {750, 750, 7: 750}, @@ -9836,57 +9837,57 @@ var ( // 3100 {2: 768, 768, 768, 768, 768, 8: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 48: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 475: 768, 768, 768, 479: 768, 483: 768, 768, 768, 768, 768, 492: 768, 501: 768, 506: 768, 768, 768, 543: 768, 566: 768, 768, 768, 570: 768, 768, 768, 574: 768, 768, 768, 768, 768, 768, 768, 768, 583: 768, 768, 587: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 639: 768, 768, 768, 647: 768}, {2: 767, 767, 767, 767, 767, 8: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 48: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 475: 767, 767, 767, 479: 767, 483: 767, 767, 767, 767, 767, 492: 767, 501: 767, 506: 767, 767, 767, 543: 767, 566: 767, 767, 767, 570: 767, 767, 767, 574: 767, 767, 767, 767, 767, 767, 767, 767, 583: 767, 767, 587: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 639: 767, 767, 767, 647: 767}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5611}, - {756, 756, 7: 756, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5616}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5612}, + {756, 756, 7: 756, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5617}, // 3105 - {770, 770, 2971, 2816, 2852, 2973, 2743, 770, 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3834, 3222, 3302, 3221, 3218}, + {770, 770, 2972, 2817, 2853, 2974, 2744, 770, 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3835, 3223, 3303, 3222, 3219}, {771, 771, 7: 771}, {769, 769, 7: 769}, {757, 757, 7: 757}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5618}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5619}, // 3110 {761, 761, 7: 761}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5620, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5621, 2732, 2733, 2731}, {498: 765, 658: 765}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 5623, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 650: 5625, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5630, 5628, 860: 5626, 1123: 5624}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 5624, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 650: 5626, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5631, 5629, 860: 5627, 1123: 5625}, {728, 728, 7: 728, 568: 1822, 649: 728, 662: 1822}, // 3115 {787, 787, 568: 1653, 649: 787, 662: 1653}, - {649: 5633}, + {649: 5634}, {649: 786}, - {785, 785, 7: 5631, 649: 785}, + {785, 785, 7: 5632, 649: 785}, {729, 729, 7: 729, 568: 256, 649: 729, 662: 256}, // 3120 {723, 723, 7: 723, 649: 723}, {722, 722, 7: 722, 649: 722}, {721, 721, 7: 721, 649: 721}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5632, 5628}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5633, 5629}, {720, 720, 7: 720, 649: 720}, // 3125 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5196, 866: 5634}, - {788, 788, 7: 5198}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 5586, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 5589, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 5636, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 5637, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 5590, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 506: 3805, 568: 5602, 590: 5601, 646: 3803, 663: 5599, 2731, 2732, 2730, 772: 5603, 829: 5600, 976: 5638}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 498: 1755, 651: 1755, 658: 1755, 663: 5599, 2731, 2732, 2730, 829: 5642}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 498: 1731, 651: 1731, 658: 1731, 663: 5599, 2731, 2732, 2730, 829: 5639}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5197, 866: 5635}, + {788, 788, 7: 5199}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 5587, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 5590, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 5637, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 5638, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 5591, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 506: 3806, 568: 5603, 590: 5602, 646: 3804, 663: 5600, 2732, 2733, 2731, 772: 5604, 829: 5601, 976: 5639}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 498: 1755, 651: 1755, 658: 1755, 663: 5600, 2732, 2733, 2731, 829: 5643}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 498: 1731, 651: 1731, 658: 1731, 663: 5600, 2732, 2733, 2731, 829: 5640}, // 3130 {743, 743, 7: 743}, - {498: 5608, 658: 5609, 823: 5640}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5641}, + {498: 5609, 658: 5610, 823: 5641}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5642}, {759, 759, 7: 759}, - {498: 5608, 658: 5609, 823: 5643}, + {498: 5609, 658: 5610, 823: 5644}, // 3135 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5644}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5645}, {760, 760, 7: 760}, {790, 790}, {494: 2196}, {494: 2195}, // 3140 - {494: 5649}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 5652, 738: 5650, 747: 5653, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 5651, 5655, 5654, 765: 5657, 771: 2659, 773: 5658, 5659, 5656, 844: 5660}, - {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 491: 844, 499: 844, 752: 844, 844, 844, 761: 5296, 865: 5297, 916: 5664}, - {473: 2559, 501: 2557, 569: 2556, 645: 2552, 653: 2660, 708: 3856, 747: 3855, 2553, 2554, 2555, 2564, 755: 2562, 3857, 3858, 771: 5663}, - {183, 183, 480: 805, 183, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {494: 5650}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 5653, 738: 5651, 747: 5654, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 5652, 5656, 5655, 765: 5658, 771: 2660, 773: 5659, 5660, 5657, 844: 5661}, + {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 48: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 491: 844, 499: 844, 752: 844, 844, 844, 761: 5297, 865: 5298, 916: 5665}, + {473: 2560, 501: 2558, 569: 2557, 645: 2553, 653: 2661, 708: 3857, 747: 3856, 2554, 2555, 2556, 2565, 755: 2563, 3858, 3859, 771: 5664}, + {183, 183, 480: 805, 183, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, // 3145 {185, 185, 480: 806, 185, 488: 806, 806}, {186, 186, 481: 186}, @@ -9896,138 +9897,138 @@ var ( // 3150 {180, 180, 481: 180}, {179, 179, 481: 179}, - {175, 175, 481: 5661}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 5652, 738: 5650, 747: 5653, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 5651, 5655, 5654, 765: 5657, 771: 2659, 773: 5658, 5659, 5656, 844: 5662}, + {175, 175, 481: 5662}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 5653, 738: 5651, 747: 5654, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 5652, 5656, 5655, 765: 5658, 771: 2660, 773: 5659, 5660, 5657, 844: 5663}, {174, 174}, // 3155 {250, 250, 481: 250}, - {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 491: 1048, 499: 1048, 752: 5301, 5300, 5299, 836: 5302, 885: 5665}, - {2: 1036, 1036, 1036, 1036, 1036, 8: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 48: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 5667, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 491: 1036, 499: 1036, 1106: 5666}, - {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 491: 4158, 499: 1846, 853: 5668}, + {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 491: 1048, 499: 1048, 752: 5302, 5301, 5300, 836: 5303, 885: 5666}, + {2: 1036, 1036, 1036, 1036, 1036, 8: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 48: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 5668, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 491: 1036, 499: 1036, 1106: 5667}, + {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 491: 4159, 499: 1846, 853: 5669}, {2: 1035, 1035, 1035, 1035, 1035, 8: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 48: 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 491: 1035, 499: 1035}, // 3160 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 499: 5669, 663: 5671, 2731, 2732, 2730, 915: 5672, 965: 5670}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5684}, - {7: 5680, 499: 5679}, - {7: 1038, 481: 1038, 499: 1038, 651: 5674, 905: 5673}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 499: 5670, 663: 5672, 2732, 2733, 2731, 915: 5673, 965: 5671}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5685}, + {7: 5681, 499: 5680}, + {7: 1038, 481: 1038, 499: 1038, 651: 5675, 905: 5674}, {7: 1040, 481: 1040, 499: 1040}, // 3165 {7: 1042, 481: 1042, 499: 1042}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5676, 663: 5675, 2731, 2732, 2730}, - {7: 1038, 481: 1038, 499: 1038, 651: 5678, 905: 5677}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5677, 663: 5676, 2732, 2733, 2731}, + {7: 1038, 481: 1038, 499: 1038, 651: 5679, 905: 5678}, {7: 1037, 481: 1037, 499: 1037}, {7: 1041, 481: 1041, 499: 1041}, // 3170 - {523: 5676}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 579: 5308, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5315, 850: 5305, 888: 5682}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5671, 2731, 2732, 2730, 915: 5681}, + {523: 5677}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 579: 5309, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5316, 850: 5306, 888: 5683}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5672, 2732, 2733, 2731, 915: 5682}, {7: 1039, 481: 1039, 499: 1039}, - {245, 245, 7: 5359, 481: 245, 497: 2691, 789: 2692, 5683}, + {245, 245, 7: 5360, 481: 245, 497: 2692, 789: 2693, 5684}, // 3175 {2064, 2064, 481: 2064}, - {913, 913, 913, 913, 913, 913, 913, 8: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 48: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 478: 913, 481: 913, 490: 5363, 913, 493: 913, 497: 913, 502: 913, 913, 525: 913, 858: 5685}, - {911, 911, 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 478: 5320, 481: 911, 491: 911, 493: 911, 497: 911, 502: 911, 911, 525: 911, 663: 5319, 2731, 2732, 2730, 913: 5318, 5686}, - {892, 892, 481: 892, 491: 5373, 493: 892, 497: 892, 502: 892, 5374, 525: 5372, 938: 5376, 5375, 1060: 5377, 5687}, - {245, 245, 481: 245, 493: 245, 497: 2691, 502: 245, 789: 2692, 5688}, + {913, 913, 913, 913, 913, 913, 913, 8: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 48: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 478: 913, 481: 913, 490: 5364, 913, 493: 913, 497: 913, 502: 913, 913, 525: 913, 858: 5686}, + {911, 911, 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 478: 5321, 481: 911, 491: 911, 493: 911, 497: 911, 502: 911, 911, 525: 911, 663: 5320, 2732, 2733, 2731, 913: 5319, 5687}, + {892, 892, 481: 892, 491: 5374, 493: 892, 497: 892, 502: 892, 5375, 525: 5373, 938: 5377, 5376, 1060: 5378, 5688}, + {245, 245, 481: 245, 493: 245, 497: 2692, 502: 245, 789: 2693, 5689}, // 3180 - {1287, 1287, 481: 1287, 493: 1287, 502: 2694, 766: 2695, 810: 5689}, - {874, 874, 481: 874, 493: 5423, 1069: 5690}, + {1287, 1287, 481: 1287, 493: 1287, 502: 2695, 766: 2696, 810: 5690}, + {874, 874, 481: 874, 493: 5424, 1069: 5691}, {2065, 2065, 481: 2065}, - {793, 793, 7: 5706}, + {793, 793, 7: 5707}, {781, 781, 7: 781}, // 3185 - {353: 5698}, - {151: 5696, 686: 5695}, + {353: 5699}, + {151: 5697, 686: 5696}, {778, 778, 7: 778}, - {777, 777, 7: 777, 672: 5369, 922: 5697}, + {777, 777, 7: 777, 672: 5370, 922: 5698}, {776, 776, 7: 776}, // 3190 - {212: 5700, 384: 5702, 670: 5701, 1232: 5699}, + {212: 5701, 384: 5703, 670: 5702, 1232: 5700}, {779, 779, 7: 779}, - {670: 5705}, - {322: 5703, 404: 5704}, + {670: 5706}, + {322: 5704, 404: 5705}, {772, 772, 7: 772}, // 3195 {774, 774, 7: 774}, {773, 773, 7: 773}, {775, 775, 7: 775}, - {177: 5693, 670: 5694, 919: 5707}, + {177: 5694, 670: 5695, 919: 5708}, {780, 780, 7: 780}, // 3200 - {177: 5693, 498: 1714, 651: 1714, 658: 1714, 670: 5694, 919: 5692, 969: 5709}, - {794, 794, 7: 5706}, + {177: 5694, 498: 1714, 651: 1714, 658: 1714, 670: 5695, 919: 5693, 969: 5710}, + {794, 794, 7: 5707}, {789, 789}, - {786, 786, 488: 5714}, + {786, 786, 488: 5715}, {783, 783}, // 3205 {782, 782}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5630, 5628, 860: 5715}, - {784, 784, 7: 5631}, - {13: 5722, 475: 5721, 1098: 5726}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5718}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5631, 5629, 860: 5716}, + {784, 784, 7: 5632}, + {13: 5723, 475: 5722, 1098: 5727}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5719}, // 3210 - {498: 5719}, - {13: 5722, 475: 5721, 1098: 5720}, + {498: 5720}, + {13: 5723, 475: 5722, 1098: 5721}, {796, 796}, {732, 732}, - {473: 5723}, + {473: 5724}, // 3215 - {475: 5228, 891: 5724}, - {47: 5725}, + {475: 5229, 891: 5725}, + {47: 5726}, {731, 731}, {797, 797}, - {755, 755, 7: 755, 482: 5729}, + {755, 755, 7: 755, 482: 5730}, // 3220 {752, 752, 7: 752}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 479: 5730, 663: 3459, 2731, 2732, 2730, 737: 5731}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 479: 5731, 663: 3460, 2732, 2733, 2731, 737: 5732}, {754, 754, 7: 754}, {753, 753, 7: 753}, - {498: 5608, 658: 5609, 823: 5733}, + {498: 5609, 658: 5610, 823: 5734}, // 3225 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5734}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5735}, {758, 758, 7: 758}, - {177: 5693, 498: 1714, 651: 1714, 658: 1714, 670: 5694, 919: 5692, 969: 5736}, - {795, 795, 7: 5706}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5740, 2731, 2732, 2730, 900: 5747}, + {177: 5694, 498: 1714, 651: 1714, 658: 1714, 670: 5695, 919: 5693, 969: 5737}, + {795, 795, 7: 5707}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5741, 2732, 2733, 2731, 900: 5748}, // 3230 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5740, 2731, 2732, 2730, 900: 5739}, - {498: 5608, 658: 5609, 823: 5745}, - {486: 5742, 498: 764, 651: 5741, 658: 764}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5740, 2731, 2732, 2730, 900: 5744}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5740, 2731, 2732, 2730, 900: 5743}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5741, 2732, 2733, 2731, 900: 5740}, + {498: 5609, 658: 5610, 823: 5746}, + {486: 5743, 498: 764, 651: 5742, 658: 764}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5741, 2732, 2733, 2731, 900: 5745}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5741, 2732, 2733, 2731, 900: 5744}, // 3235 {498: 762, 658: 762}, {498: 763, 658: 763}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5746}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5747}, {791, 791}, - {498: 5608, 658: 5609, 823: 5748}, + {498: 5609, 658: 5610, 823: 5749}, // 3240 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 5614, 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 5613, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5615, 839: 5749}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 5615, 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 5614, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5616, 839: 5750}, {792, 792}, - {649: 5759}, - {649: 5752}, - {267: 5753}, + {649: 5760}, + {649: 5753}, + {267: 5754}, // 3245 - {498: 5754}, - {475: 5755}, - {494: 5756}, - {266: 5757}, - {475: 5758}, + {498: 5755}, + {475: 5756}, + {494: 5757}, + {266: 5758}, + {475: 5759}, // 3250 {799, 799}, - {267: 5760}, - {498: 5761}, - {475: 5762}, - {494: 5763}, + {267: 5761}, + {498: 5762}, + {475: 5763}, + {494: 5764}, // 3255 - {266: 5764}, - {475: 5765}, + {266: 5765}, + {475: 5766}, {800, 800}, - {473: 2559, 501: 2557, 569: 2556, 645: 2552, 708: 5777, 747: 5776, 2553, 2554, 2555, 5778}, - {473: 1229, 501: 1229, 569: 1229, 645: 1229, 650: 3514, 744: 3512, 3513, 783: 5770, 786: 5771, 931: 5773, 964: 5775}, + {473: 2560, 501: 2558, 569: 2557, 645: 2553, 708: 5778, 747: 5777, 2554, 2555, 2556, 5779}, + {473: 1229, 501: 1229, 569: 1229, 645: 1229, 650: 3515, 744: 3513, 3514, 783: 5771, 786: 5772, 931: 5774, 964: 5776}, // 3260 - {473: 1229, 501: 1229, 569: 1229, 645: 1229, 650: 3514, 744: 3512, 3513, 783: 5770, 786: 5771, 931: 5773, 964: 5774}, - {473: 1229, 501: 1229, 569: 1229, 645: 1229, 650: 3514, 744: 3512, 3513, 783: 5770, 786: 5771, 931: 5773, 964: 5772}, + {473: 1229, 501: 1229, 569: 1229, 645: 1229, 650: 3515, 744: 3513, 3514, 783: 5771, 786: 5772, 931: 5774, 964: 5775}, + {473: 1229, 501: 1229, 569: 1229, 645: 1229, 650: 3515, 744: 3513, 3514, 783: 5771, 786: 5772, 931: 5774, 964: 5773}, {2: 1232, 1232, 1232, 1232, 1232, 8: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 48: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 473: 1232, 475: 1232, 1232, 1232, 479: 1232, 483: 1232, 1232, 1232, 1232, 1232, 492: 1232, 501: 1232, 506: 1232, 1232, 1232, 515: 1232, 523: 1232, 543: 1232, 566: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 574: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 583: 1232, 1232, 587: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 639: 1232, 1232, 1232, 645: 1232, 647: 1232, 650: 1232, 744: 1232, 1232, 752: 1232, 1232, 1232, 761: 1232, 768: 1232, 1232, 1232}, {473: 1228, 501: 1228, 569: 1228, 645: 1228}, {473: 802, 501: 802, 569: 802, 645: 802}, @@ -10036,87 +10037,87 @@ var ( {473: 803, 501: 803, 569: 803, 645: 803}, {473: 804, 501: 804, 569: 804, 645: 804}, {816, 816, 47: 816, 472: 816, 474: 816, 480: 806, 816, 488: 806, 806}, - {815, 815, 47: 815, 472: 815, 474: 815, 480: 805, 815, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 5779, 5780}, + {815, 815, 47: 815, 472: 815, 474: 815, 480: 805, 815, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 5780, 5781}, // 3270 {480: 807, 488: 807, 807}, - {814, 814, 47: 814, 472: 814, 474: 814, 481: 814, 493: 2697, 500: 2698, 767: 5781}, + {814, 814, 47: 814, 472: 814, 474: 814, 481: 814, 493: 2698, 500: 2699, 767: 5782}, {813, 813, 47: 813, 472: 813, 474: 813, 481: 813}, {812, 812, 47: 812, 472: 812, 474: 812, 481: 812}, - {47: 3942, 480: 805, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {47: 3943, 480: 805, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, // 3275 - {7: 5797, 473: 988, 501: 988, 569: 988, 645: 988, 653: 988, 738: 988}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5786, 2731, 2732, 2730, 928: 5785, 1161: 5796}, + {7: 5798, 473: 988, 501: 988, 569: 988, 645: 988, 653: 988, 738: 988}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5787, 2732, 2733, 2731, 928: 5786, 1161: 5797}, {7: 985, 473: 985, 501: 985, 569: 985, 645: 985, 653: 985, 738: 985}, - {473: 5787, 478: 2307, 1220: 5788}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5792, 2731, 2732, 2730, 875: 5791}, + {473: 5788, 478: 2307, 1220: 5789}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5793, 2732, 2733, 2731, 875: 5792}, // 3280 - {478: 5789}, - {473: 2559, 708: 5790}, + {478: 5790}, + {473: 2560, 708: 5791}, {7: 984, 473: 984, 501: 984, 569: 984, 645: 984, 653: 984, 738: 984}, - {7: 5794, 47: 5793}, + {7: 5795, 47: 5794}, {2305, 2305, 7: 2305, 47: 2305, 474: 2305}, // 3285 {478: 2306}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5795, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5796, 2732, 2733, 2731}, {2304, 2304, 7: 2304, 47: 2304, 474: 2304}, - {7: 5797, 473: 987, 501: 987, 569: 987, 645: 987, 653: 987, 738: 987}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5786, 2731, 2732, 2730, 928: 5798}, + {7: 5798, 473: 987, 501: 987, 569: 987, 645: 987, 653: 987, 738: 987}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5787, 2732, 2733, 2731, 928: 5799}, // 3290 {7: 986, 473: 986, 501: 986, 569: 986, 645: 986, 653: 986, 738: 986}, - {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2694, 766: 2695, 810: 5800}, - {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2697, 860, 860, 860, 500: 2698, 767: 2699, 828: 5801}, - {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3880, 831, 3881, 886: 5802}, - {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3906, 887: 5803}, + {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2695, 766: 2696, 810: 5801}, + {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2698, 860, 860, 860, 500: 2699, 767: 2700, 828: 5802}, + {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3881, 831, 3882, 886: 5803}, + {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3907, 887: 5804}, // 3295 {992, 992, 47: 992, 472: 992, 474: 992, 480: 992, 992, 488: 992, 992}, - {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2697, 860, 860, 860, 500: 2698, 767: 2699, 828: 5805}, - {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3880, 831, 3881, 886: 5806}, - {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3906, 887: 5807}, + {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2698, 860, 860, 860, 500: 2699, 767: 2700, 828: 5806}, + {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3881, 831, 3882, 886: 5807}, + {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3907, 887: 5808}, {993, 993, 47: 993, 472: 993, 474: 993, 480: 993, 993, 488: 993, 993}, // 3300 - {659: 5815}, - {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2694, 766: 2695, 810: 5811}, + {659: 5816}, + {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2695, 766: 2696, 810: 5812}, {838, 838, 47: 838, 472: 838, 474: 838, 480: 838, 838, 488: 838, 838, 493: 838, 838, 838, 838, 500: 838, 502: 838, 514: 838, 516: 838}, - {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2697, 860, 860, 860, 500: 2698, 767: 2699, 828: 5812}, - {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3880, 831, 3881, 886: 5813}, + {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2698, 860, 860, 860, 500: 2699, 767: 2700, 828: 5813}, + {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3881, 831, 3882, 886: 5814}, // 3305 - {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3906, 887: 5814}, + {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3907, 887: 5815}, {994, 994, 47: 994, 472: 994, 474: 994, 480: 994, 994, 488: 994, 994}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 2723, 869: 3210, 898: 5816}, - {1856, 1856, 7: 3380, 47: 1856, 472: 1856, 474: 1856, 480: 1856, 1856, 488: 1856, 1856, 493: 1856, 1856, 1856, 1856, 500: 1856, 502: 1856, 514: 1856, 516: 1856}, - {245, 245, 47: 245, 472: 245, 474: 245, 480: 245, 245, 488: 245, 245, 493: 245, 245, 245, 245, 2691, 500: 245, 502: 245, 513: 245, 789: 2692, 5842}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 2724, 869: 3211, 898: 5817}, + {1856, 1856, 7: 3381, 47: 1856, 472: 1856, 474: 1856, 480: 1856, 1856, 488: 1856, 1856, 493: 1856, 1856, 1856, 1856, 500: 1856, 502: 1856, 514: 1856, 516: 1856}, + {245, 245, 47: 245, 472: 245, 474: 245, 480: 245, 245, 488: 245, 245, 493: 245, 245, 245, 245, 2692, 500: 245, 502: 245, 513: 245, 789: 2693, 5843}, // 3310 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 579: 5308, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5315, 850: 5305, 888: 5827, 1201: 5826, 1313: 5825}, - {839, 839, 47: 839, 472: 839, 474: 839, 480: 839, 839, 488: 839, 839, 493: 839, 839, 839, 839, 500: 839, 502: 839, 513: 5808, 937: 5810, 963: 5820}, - {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2694, 766: 2695, 810: 5821}, - {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2697, 860, 860, 860, 500: 2698, 767: 2699, 828: 5822}, - {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3880, 831, 3881, 886: 5823}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 579: 5309, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5316, 850: 5306, 888: 5828, 1201: 5827, 1313: 5826}, + {839, 839, 47: 839, 472: 839, 474: 839, 480: 839, 839, 488: 839, 839, 493: 839, 839, 839, 839, 500: 839, 502: 839, 513: 5809, 937: 5811, 963: 5821}, + {1287, 1287, 47: 1287, 472: 1287, 474: 1287, 480: 1287, 1287, 488: 1287, 1287, 493: 1287, 1287, 1287, 1287, 500: 1287, 502: 2695, 766: 2696, 810: 5822}, + {860, 860, 47: 860, 472: 860, 474: 860, 480: 860, 860, 488: 860, 860, 493: 2698, 860, 860, 860, 500: 2699, 767: 2700, 828: 5823}, + {831, 831, 47: 831, 472: 831, 474: 831, 480: 831, 831, 488: 831, 831, 494: 3881, 831, 3882, 886: 5824}, // 3315 - {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3906, 887: 5824}, + {837, 837, 47: 837, 472: 837, 474: 837, 480: 837, 837, 488: 837, 837, 495: 3907, 887: 5825}, {995, 995, 47: 995, 472: 995, 474: 995, 480: 995, 995, 488: 995, 995}, - {245, 245, 47: 245, 472: 245, 474: 245, 480: 245, 245, 488: 245, 245, 493: 245, 245, 245, 245, 2691, 500: 245, 502: 245, 513: 245, 245, 516: 245, 789: 2692, 5828}, + {245, 245, 47: 245, 472: 245, 474: 245, 480: 245, 245, 488: 245, 245, 493: 245, 245, 245, 245, 2692, 500: 245, 502: 245, 513: 245, 245, 516: 245, 789: 2693, 5829}, {983, 983, 47: 983, 472: 983, 474: 983, 480: 983, 983, 488: 983, 983, 493: 983, 983, 983, 983, 983, 500: 983, 502: 983, 513: 983}, - {923, 923, 7: 5359, 47: 923, 472: 923, 474: 923, 480: 923, 923, 488: 923, 923, 493: 923, 923, 923, 923, 923, 500: 923, 502: 923, 513: 923, 923, 516: 923}, + {923, 923, 7: 5360, 47: 923, 472: 923, 474: 923, 480: 923, 923, 488: 923, 923, 493: 923, 923, 923, 923, 923, 500: 923, 502: 923, 513: 923, 923, 516: 923}, // 3320 - {839, 839, 47: 839, 472: 839, 474: 839, 480: 839, 839, 488: 839, 839, 493: 839, 839, 839, 839, 500: 839, 502: 839, 513: 5808, 839, 516: 839, 937: 5810, 963: 5829}, - {1855, 1855, 47: 1855, 472: 1855, 474: 1855, 480: 1855, 1855, 488: 1855, 1855, 493: 1855, 1855, 1855, 1855, 500: 1855, 502: 1855, 514: 5830, 516: 1855, 1057: 5831}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5841}, - {982, 982, 47: 982, 472: 982, 474: 982, 480: 982, 982, 488: 982, 982, 493: 982, 982, 982, 982, 500: 982, 502: 982, 516: 5833, 1336: 5832}, + {839, 839, 47: 839, 472: 839, 474: 839, 480: 839, 839, 488: 839, 839, 493: 839, 839, 839, 839, 500: 839, 502: 839, 513: 5809, 839, 516: 839, 937: 5811, 963: 5830}, + {1855, 1855, 47: 1855, 472: 1855, 474: 1855, 480: 1855, 1855, 488: 1855, 1855, 493: 1855, 1855, 1855, 1855, 500: 1855, 502: 1855, 514: 5831, 516: 1855, 1057: 5832}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5842}, + {982, 982, 47: 982, 472: 982, 474: 982, 480: 982, 982, 488: 982, 982, 493: 982, 982, 982, 982, 500: 982, 502: 982, 516: 5834, 1336: 5833}, {1008, 1008, 47: 1008, 472: 1008, 474: 1008, 480: 1008, 1008, 488: 1008, 1008, 493: 1008, 1008, 1008, 1008, 500: 1008, 502: 1008}, // 3325 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3368, 2731, 2732, 2730, 921: 5836, 1157: 5835, 1337: 5834}, - {981, 981, 7: 5839, 47: 981, 472: 981, 474: 981, 480: 981, 981, 488: 981, 981, 493: 981, 981, 981, 981, 500: 981, 502: 981}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3369, 2732, 2733, 2731, 921: 5837, 1157: 5836, 1337: 5835}, + {981, 981, 7: 5840, 47: 981, 472: 981, 474: 981, 480: 981, 981, 488: 981, 981, 493: 981, 981, 981, 981, 500: 981, 502: 981}, {980, 980, 7: 980, 47: 980, 472: 980, 474: 980, 480: 980, 980, 488: 980, 980, 493: 980, 980, 980, 980, 500: 980, 502: 980}, - {478: 5837}, - {473: 3369, 1159: 5838}, + {478: 5838}, + {473: 3370, 1159: 5839}, // 3330 {978, 978, 7: 978, 47: 978, 472: 978, 474: 978, 480: 978, 978, 488: 978, 978, 493: 978, 978, 978, 978, 500: 978, 502: 978}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3368, 2731, 2732, 2730, 921: 5836, 1157: 5840}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3369, 2732, 2733, 2731, 921: 5837, 1157: 5841}, {979, 979, 7: 979, 47: 979, 472: 979, 474: 979, 480: 979, 979, 488: 979, 979, 493: 979, 979, 979, 979, 500: 979, 502: 979}, - {1854, 1854, 47: 1854, 472: 1854, 474: 1854, 480: 1854, 1854, 488: 1854, 1854, 493: 1854, 1854, 1854, 1854, 1854, 499: 1854, 1854, 502: 1854, 505: 3313, 509: 3311, 3312, 3310, 3308, 1854, 516: 1854, 733: 3309, 3307}, + {1854, 1854, 47: 1854, 472: 1854, 474: 1854, 480: 1854, 1854, 488: 1854, 1854, 493: 1854, 1854, 1854, 1854, 1854, 499: 1854, 1854, 502: 1854, 505: 3314, 509: 3312, 3313, 3311, 3309, 1854, 516: 1854, 733: 3310, 3308}, {1009, 1009, 47: 1009, 472: 1009, 474: 1009, 480: 1009, 1009, 488: 1009, 1009, 493: 1009, 1009, 1009, 1009, 500: 1009, 502: 1009, 513: 1009}, // 3335 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 523: 5859, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 5860, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5858, 1045: 5861, 1209: 5862, 1281: 5863}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 523: 5860, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 5861, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5859, 1045: 5862, 1209: 5863, 1281: 5864}, {2: 858, 858, 858, 858, 858, 8: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 48: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 473: 858, 475: 858, 858, 858, 479: 858, 483: 858, 858, 858, 858, 858, 492: 858, 501: 858, 506: 858, 858, 858, 515: 858, 523: 858, 543: 858, 566: 858, 858, 858, 570: 858, 858, 858, 574: 858, 858, 858, 858, 858, 858, 858, 858, 583: 858, 858, 587: 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, 639: 858, 858, 858, 647: 858, 650: 858, 744: 858, 858, 752: 858, 858, 858, 761: 858, 768: 858, 858, 858}, {2: 857, 857, 857, 857, 857, 8: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 48: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 473: 857, 475: 857, 857, 857, 479: 857, 483: 857, 857, 857, 857, 857, 492: 857, 501: 857, 506: 857, 857, 857, 515: 857, 523: 857, 543: 857, 566: 857, 857, 857, 570: 857, 857, 857, 574: 857, 857, 857, 857, 857, 857, 857, 857, 583: 857, 857, 587: 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, 639: 857, 857, 857, 647: 857, 650: 857, 744: 857, 857, 752: 857, 857, 857, 761: 857, 768: 857, 857, 857}, {2: 856, 856, 856, 856, 856, 8: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 48: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 473: 856, 475: 856, 856, 856, 479: 856, 483: 856, 856, 856, 856, 856, 492: 856, 501: 856, 506: 856, 856, 856, 515: 856, 523: 856, 543: 856, 566: 856, 856, 856, 570: 856, 856, 856, 574: 856, 856, 856, 856, 856, 856, 856, 856, 583: 856, 856, 587: 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 639: 856, 856, 856, 647: 856, 650: 856, 744: 856, 856, 752: 856, 856, 856, 761: 856, 768: 856, 856, 856}, @@ -10128,158 +10129,158 @@ var ( {2: 851, 851, 851, 851, 851, 8: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 48: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 473: 851, 475: 851, 851, 851, 479: 851, 483: 851, 851, 851, 851, 851, 492: 851, 501: 851, 506: 851, 851, 851, 515: 851, 523: 851, 543: 851, 566: 851, 851, 851, 570: 851, 851, 851, 574: 851, 851, 851, 851, 851, 851, 851, 851, 583: 851, 851, 587: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 639: 851, 851, 851, 647: 851, 650: 851, 744: 851, 851, 752: 851, 851, 851, 761: 851, 768: 851, 851, 851}, {2: 850, 850, 850, 850, 850, 8: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 48: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 473: 850, 475: 850, 850, 850, 479: 850, 483: 850, 850, 850, 850, 850, 492: 850, 501: 850, 506: 850, 850, 850, 515: 850, 523: 850, 543: 850, 566: 850, 850, 850, 570: 850, 850, 850, 574: 850, 850, 850, 850, 850, 850, 850, 850, 583: 850, 850, 587: 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 850, 639: 850, 850, 850, 647: 850, 650: 850, 744: 850, 850, 752: 850, 850, 850, 761: 850, 768: 850, 850, 850}, // 3345 - {2: 848, 848, 848, 848, 848, 8: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 48: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 5849, 5855, 5856, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 473: 848, 475: 848, 848, 848, 479: 848, 483: 848, 848, 848, 848, 848, 492: 848, 501: 848, 506: 848, 848, 848, 515: 5852, 523: 848, 543: 848, 566: 848, 848, 848, 570: 848, 848, 848, 574: 848, 848, 848, 848, 848, 848, 848, 848, 583: 848, 848, 587: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 639: 848, 848, 848, 647: 848, 650: 3514, 744: 3512, 3513, 752: 5301, 5300, 5299, 761: 5296, 768: 5848, 5851, 5847, 783: 5770, 786: 5845, 836: 5846, 865: 5844, 1120: 5857, 5850}, + {2: 848, 848, 848, 848, 848, 8: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 48: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 5850, 5856, 5857, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 473: 848, 475: 848, 848, 848, 479: 848, 483: 848, 848, 848, 848, 848, 492: 848, 501: 848, 506: 848, 848, 848, 515: 5853, 523: 848, 543: 848, 566: 848, 848, 848, 570: 848, 848, 848, 574: 848, 848, 848, 848, 848, 848, 848, 848, 583: 848, 848, 587: 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 848, 639: 848, 848, 848, 647: 848, 650: 3515, 744: 3513, 3514, 752: 5302, 5301, 5300, 761: 5297, 768: 5849, 5852, 5848, 783: 5771, 786: 5846, 836: 5847, 865: 5845, 1120: 5858, 5851}, {2: 846, 846, 846, 846, 846, 8: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 48: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 473: 846, 475: 846, 846, 846, 479: 846, 483: 846, 846, 846, 846, 846, 492: 846, 501: 846, 506: 846, 846, 846, 515: 846, 523: 846, 543: 846, 566: 846, 846, 846, 570: 846, 846, 846, 574: 846, 846, 846, 846, 846, 846, 846, 846, 583: 846, 846, 587: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 639: 846, 846, 846, 647: 846, 650: 846, 744: 846, 846, 752: 846, 846, 846, 761: 846, 768: 846, 846, 846}, {2: 842, 842, 842, 842, 842, 8: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 48: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 473: 842, 475: 842, 842, 842, 479: 842, 483: 842, 842, 842, 842, 842, 492: 842, 501: 842, 506: 842, 842, 842, 515: 842, 523: 842, 543: 842, 566: 842, 842, 842, 570: 842, 842, 842, 574: 842, 842, 842, 842, 842, 842, 842, 842, 583: 842, 842, 587: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 639: 842, 842, 842, 647: 842, 650: 842, 744: 842, 842, 752: 842, 842, 842, 761: 842, 768: 842, 842, 842}, {2: 841, 841, 841, 841, 841, 8: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 48: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 473: 841, 475: 841, 841, 841, 479: 841, 483: 841, 841, 841, 841, 841, 492: 841, 501: 841, 506: 841, 841, 841, 515: 841, 523: 841, 543: 841, 566: 841, 841, 841, 570: 841, 841, 841, 574: 841, 841, 841, 841, 841, 841, 841, 841, 583: 841, 841, 587: 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 841, 639: 841, 841, 841, 647: 841, 650: 841, 744: 841, 841, 752: 841, 841, 841, 761: 841, 768: 841, 841, 841}, {2: 847, 847, 847, 847, 847, 8: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 48: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 473: 847, 475: 847, 847, 847, 479: 847, 483: 847, 847, 847, 847, 847, 492: 847, 501: 847, 506: 847, 847, 847, 515: 847, 523: 847, 543: 847, 566: 847, 847, 847, 570: 847, 847, 847, 574: 847, 847, 847, 847, 847, 847, 847, 847, 583: 847, 847, 587: 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, 639: 847, 847, 847, 647: 847, 650: 847, 744: 847, 847, 752: 847, 847, 847, 761: 847, 768: 847, 847, 847}, // 3350 - {1864, 1864, 2971, 2816, 2852, 2973, 2743, 1864, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1864, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 1864, 474: 1864, 5876, 478: 5875, 480: 1864, 1864, 488: 1864, 1864, 493: 1864, 1864, 1864, 1864, 1864, 499: 1864, 1864, 502: 1864, 505: 3313, 509: 3311, 3312, 3310, 3308, 1864, 1864, 663: 5874, 2731, 2732, 2730, 733: 3309, 3307, 1206: 5873, 5872}, + {1864, 1864, 2972, 2817, 2853, 2974, 2744, 1864, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1864, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 1864, 474: 1864, 5877, 478: 5876, 480: 1864, 1864, 488: 1864, 1864, 493: 1864, 1864, 1864, 1864, 1864, 499: 1864, 1864, 502: 1864, 505: 3314, 509: 3312, 3313, 3311, 3309, 1864, 1864, 663: 5875, 2732, 2733, 2731, 733: 3310, 3308, 1206: 5874, 5873}, {1868, 1868, 7: 1868, 47: 1868, 472: 1868, 474: 1868, 480: 1868, 1868, 488: 1868, 1868, 493: 1868, 1868, 1868, 1868, 1868, 499: 1868, 1868, 502: 1868, 513: 1868, 1868}, - {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 474: 1269, 1269, 1269, 1269, 1269, 480: 1269, 1269, 1269, 485: 1269, 1269, 1269, 1269, 1269, 493: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 502: 1269, 505: 1269, 509: 1269, 1269, 1269, 1269, 1269, 1269, 518: 1269, 523: 1269, 544: 1269, 547: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 585: 1269, 651: 5867, 654: 1269, 1269}, + {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 474: 1269, 1269, 1269, 1269, 1269, 480: 1269, 1269, 1269, 485: 1269, 1269, 1269, 1269, 1269, 493: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 502: 1269, 505: 1269, 509: 1269, 1269, 1269, 1269, 1269, 1269, 518: 1269, 523: 1269, 544: 1269, 547: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 585: 1269, 651: 5868, 654: 1269, 1269}, {1858, 1858, 7: 1858, 47: 1858, 472: 1858, 474: 1858, 480: 1858, 1858, 488: 1858, 1858, 493: 1858, 1858, 1858, 1858, 1858, 499: 1858, 1858, 502: 1858, 513: 1858, 1858}, - {840, 840, 7: 5865, 47: 840, 472: 840, 474: 840, 480: 840, 840, 488: 840, 840, 493: 840, 840, 840, 840, 840, 499: 840, 840, 502: 840, 513: 840, 840}, + {840, 840, 7: 5866, 47: 840, 472: 840, 474: 840, 480: 840, 840, 488: 840, 840, 493: 840, 840, 840, 840, 840, 499: 840, 840, 502: 840, 513: 840, 840}, // 3355 - {1855, 1855, 47: 1855, 472: 1855, 474: 1855, 480: 1855, 1855, 488: 1855, 1855, 493: 1855, 1855, 1855, 1855, 1855, 499: 1855, 1855, 502: 1855, 513: 1855, 5830, 1057: 5864}, + {1855, 1855, 47: 1855, 472: 1855, 474: 1855, 480: 1855, 1855, 488: 1855, 1855, 493: 1855, 1855, 1855, 1855, 1855, 499: 1855, 1855, 502: 1855, 513: 1855, 5831, 1057: 5865}, {1010, 1010, 47: 1010, 472: 1010, 474: 1010, 480: 1010, 1010, 488: 1010, 1010, 493: 1010, 1010, 1010, 1010, 1010, 499: 1010, 1010, 502: 1010, 513: 1010}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 523: 5859, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 5860, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 5858, 1045: 5866}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 523: 5860, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 5861, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 5859, 1045: 5867}, {1857, 1857, 7: 1857, 47: 1857, 472: 1857, 474: 1857, 480: 1857, 1857, 488: 1857, 1857, 493: 1857, 1857, 1857, 1857, 1857, 499: 1857, 1857, 502: 1857, 513: 1857, 1857}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5868, 663: 5869, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5869, 663: 5870, 2732, 2733, 2731}, // 3360 {1867, 1867, 7: 1867, 47: 1867, 472: 1867, 474: 1867, 480: 1867, 1867, 488: 1867, 1867, 493: 1867, 1867, 1867, 1867, 1867, 499: 1867, 1867, 502: 1867, 513: 1867, 1867}, - {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 3958, 1268, 1268, 1268, 1268, 1268, 480: 1268, 1268, 1268, 485: 1268, 1268, 1268, 1268, 1268, 493: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 502: 1268, 505: 1268, 509: 1268, 1268, 1268, 1268, 1268, 1268, 518: 1268, 523: 1268, 544: 1268, 547: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 585: 1268, 651: 5870, 654: 1268, 1268}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5871, 663: 3754, 2731, 2732, 2730}, + {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 3959, 1268, 1268, 1268, 1268, 1268, 480: 1268, 1268, 1268, 485: 1268, 1268, 1268, 1268, 1268, 493: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 502: 1268, 505: 1268, 509: 1268, 1268, 1268, 1268, 1268, 1268, 518: 1268, 523: 1268, 544: 1268, 547: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 585: 1268, 651: 5871, 654: 1268, 1268}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5872, 663: 3755, 2732, 2733, 2731}, {1866, 1866, 7: 1866, 47: 1866, 472: 1866, 474: 1866, 480: 1866, 1866, 488: 1866, 1866, 493: 1866, 1866, 1866, 1866, 1866, 499: 1866, 1866, 502: 1866, 513: 1866, 1866}, {1865, 1865, 7: 1865, 47: 1865, 472: 1865, 474: 1865, 480: 1865, 1865, 488: 1865, 1865, 493: 1865, 1865, 1865, 1865, 1865, 499: 1865, 1865, 502: 1865, 513: 1865, 1865}, // 3365 {1863, 1863, 7: 1863, 47: 1863, 472: 1863, 474: 1863, 480: 1863, 1863, 488: 1863, 1863, 493: 1863, 1863, 1863, 1863, 1863, 499: 1863, 1863, 502: 1863, 513: 1863, 1863}, {1862, 1862, 7: 1862, 47: 1862, 472: 1862, 474: 1862, 480: 1862, 1862, 488: 1862, 1862, 493: 1862, 1862, 1862, 1862, 1862, 499: 1862, 1862, 502: 1862, 513: 1862, 1862}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5878, 663: 5877, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5879, 663: 5878, 2732, 2733, 2731}, {1860, 1860, 7: 1860, 47: 1860, 472: 1860, 474: 1860, 480: 1860, 1860, 488: 1860, 1860, 493: 1860, 1860, 1860, 1860, 1860, 499: 1860, 1860, 502: 1860, 513: 1860, 1860}, {1861, 1861, 7: 1861, 47: 1861, 472: 1861, 474: 1861, 480: 1861, 1861, 488: 1861, 1861, 493: 1861, 1861, 1861, 1861, 1861, 499: 1861, 1861, 502: 1861, 513: 1861, 1861}, // 3370 {1859, 1859, 7: 1859, 47: 1859, 472: 1859, 474: 1859, 480: 1859, 1859, 488: 1859, 1859, 493: 1859, 1859, 1859, 1859, 1859, 499: 1859, 1859, 502: 1859, 513: 1859, 1859}, {1011, 1011}, {1023, 1023}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 5894, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5895, 2731, 2732, 2730}, - {70: 5887, 229: 5886}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 5895, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5896, 2732, 2733, 2731}, + {70: 5888, 229: 5887}, // 3375 {1015, 1015}, - {798: 5885}, + {798: 5886}, {1014, 1014}, - {1017, 1017, 70: 5892}, - {229: 5888}, + {1017, 1017, 70: 5893}, + {229: 5889}, // 3380 - {1016, 1016, 70: 5890, 798: 5889}, + {1016, 1016, 70: 5891, 798: 5890}, {1019, 1019}, - {798: 5891}, + {798: 5892}, {1018, 1018}, - {798: 5893}, + {798: 5894}, // 3385 {1020, 1020}, - {1635, 1635, 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5896, 2731, 2732, 2730}, + {1635, 1635, 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5897, 2732, 2733, 2731}, {1022, 1022}, {1021, 1021}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5898, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5899, 2732, 2733, 2731}, // 3390 {1027, 1027}, - {1031, 1031, 481: 5900}, - {568: 3317, 709: 5902, 1323: 5901}, - {1030, 1030, 7: 5903}, + {1031, 1031, 481: 5901}, + {568: 3318, 709: 5903, 1323: 5902}, + {1030, 1030, 7: 5904}, {1029, 1029, 7: 1029}, // 3395 - {568: 3317, 709: 5904}, + {568: 3318, 709: 5905}, {1028, 1028, 7: 1028}, - {499: 5906}, - {475: 5908, 568: 3317, 709: 5909, 1273: 5907}, + {499: 5907}, + {475: 5909, 568: 3318, 709: 5910, 1273: 5908}, {1034, 1034}, // 3400 {1033, 1033}, {1032, 1032}, - {2: 1345, 1345, 1345, 1345, 1345, 8: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 48: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 495: 5911, 1064: 5912}, + {2: 1345, 1345, 1345, 1345, 1345, 8: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 48: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 495: 5912, 1064: 5913}, {2: 1344, 1344, 1344, 1344, 1344, 8: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 48: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5913}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5914}, // 3405 - {154: 913, 473: 913, 913, 490: 5363, 501: 913, 504: 913, 569: 913, 645: 913, 858: 5914}, - {154: 5922, 473: 5915, 2558, 501: 5923, 504: 5921, 569: 2556, 645: 2552, 708: 5920, 747: 5918, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 5919, 5917, 975: 5916, 1063: 5924}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 2309, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 2559, 2558, 501: 2557, 569: 2556, 645: 2552, 663: 4111, 2731, 2732, 2730, 708: 5782, 742: 4112, 747: 3849, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 3851, 3850, 807: 5023, 1000: 5936}, - {473: 3865, 838: 5933, 973: 5932}, + {154: 913, 473: 913, 913, 490: 5364, 501: 913, 504: 913, 569: 913, 645: 913, 858: 5915}, + {154: 5923, 473: 5916, 2559, 501: 5924, 504: 5922, 569: 2557, 645: 2553, 708: 5921, 747: 5919, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 5920, 5918, 975: 5917, 1063: 5925}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 2309, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 2560, 2559, 501: 2558, 569: 2557, 645: 2553, 663: 4112, 2732, 2733, 2731, 708: 5783, 742: 4113, 747: 3850, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 3852, 3851, 807: 5024, 1000: 5937}, + {473: 3866, 838: 5934, 973: 5933}, {1337, 1337, 472: 1337, 481: 1337}, // 3410 {1336, 1336, 472: 1336, 480: 806, 1336, 488: 806, 806}, {1335, 1335, 472: 1335, 481: 1335}, - {1334, 1334, 472: 1334, 480: 805, 1334, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, - {1320, 1320, 2971, 2816, 2852, 2973, 2743, 1320, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 1320, 481: 1320, 663: 4111, 2731, 2732, 2730, 742: 5926, 1004: 5927, 1189: 5925}, + {1334, 1334, 472: 1334, 480: 805, 1334, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, + {1320, 1320, 2972, 2817, 2853, 2974, 2744, 1320, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 1320, 481: 1320, 663: 4112, 2732, 2733, 2731, 742: 5927, 1004: 5928, 1189: 5926}, {473: 1332}, // 3415 - {473: 1331, 576: 3864, 910: 3863, 974: 3862}, + {473: 1331, 576: 3865, 910: 3864, 974: 3863}, {1315, 1315, 481: 1315}, - {1333, 1333, 7: 5930, 472: 1333, 481: 1333}, - {498: 5928}, + {1333, 1333, 7: 5931, 472: 1333, 481: 1333}, + {498: 5929}, {1319, 1319, 7: 1319, 472: 1319, 481: 1319}, // 3420 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3871, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3867, 795: 5929}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3872, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3868, 795: 5930}, {1321, 1321, 7: 1321, 472: 1321, 481: 1321}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 5926, 1004: 5931}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 5927, 1004: 5932}, {1318, 1318, 7: 1318, 472: 1318, 481: 1318}, - {1338, 1338, 7: 5934, 472: 1338, 481: 1338}, + {1338, 1338, 7: 5935, 472: 1338, 481: 1338}, // 3425 {1330, 1330, 7: 1330, 472: 1330, 481: 1330}, - {473: 3865, 838: 5935}, + {473: 3866, 838: 5936}, {1329, 1329, 7: 1329, 472: 1329, 481: 1329}, - {47: 5937}, - {154: 5922, 473: 2559, 2558, 501: 5923, 569: 2556, 645: 2552, 708: 5942, 747: 5940, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 5941, 5939, 975: 5938}, + {47: 5938}, + {154: 5923, 473: 2560, 2559, 501: 5924, 569: 2557, 645: 2553, 708: 5943, 747: 5941, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 5942, 5940, 975: 5939}, // 3430 - {473: 3865, 838: 5933, 973: 5943}, + {473: 3866, 838: 5934, 973: 5944}, {1342, 1342, 472: 1342, 481: 1342}, {1341, 1341, 472: 1341, 480: 806, 1341, 488: 806, 806}, {1340, 1340, 472: 1340, 481: 1340}, - {1339, 1339, 472: 1339, 480: 805, 1339, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {1339, 1339, 472: 1339, 480: 805, 1339, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, // 3435 - {1343, 1343, 7: 5934, 472: 1343, 481: 1343}, - {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 491: 1048, 495: 1048, 752: 5301, 5300, 5299, 836: 5302, 885: 5945}, - {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 491: 4158, 495: 1846, 853: 5946}, - {2: 1345, 1345, 1345, 1345, 1345, 8: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 48: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 495: 5911, 1064: 5947}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 5948}, + {1343, 1343, 7: 5935, 472: 1343, 481: 1343}, + {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 491: 1048, 495: 1048, 752: 5302, 5301, 5300, 836: 5303, 885: 5946}, + {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 491: 4159, 495: 1846, 853: 5947}, + {2: 1345, 1345, 1345, 1345, 1345, 8: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 48: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 495: 5912, 1064: 5948}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 5949}, // 3440 - {154: 913, 473: 913, 913, 490: 5363, 501: 913, 504: 913, 569: 913, 645: 913, 858: 5949}, - {154: 5922, 473: 5915, 2558, 501: 5923, 504: 5921, 569: 2556, 645: 2552, 708: 5920, 747: 5918, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 5919, 5917, 975: 5916, 1063: 5950}, - {1317, 1317, 472: 5952, 481: 1317, 1251: 5951}, + {154: 913, 473: 913, 913, 490: 5364, 501: 913, 504: 913, 569: 913, 645: 913, 858: 5950}, + {154: 5923, 473: 5916, 2559, 501: 5924, 504: 5922, 569: 2557, 645: 2553, 708: 5921, 747: 5919, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 5920, 5918, 975: 5917, 1063: 5951}, + {1317, 1317, 472: 5953, 481: 1317, 1251: 5952}, {1346, 1346, 481: 1346}, - {199: 5953}, + {199: 5954}, // 3445 - {573: 5954}, - {653: 5955}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 5417, 890: 5418, 923: 5956}, - {1316, 1316, 7: 5420, 481: 1316}, - {1350, 1350, 473: 5965, 651: 1822}, + {573: 5955}, + {653: 5956}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 5418, 890: 5419, 923: 5957}, + {1316, 1316, 7: 5421, 481: 1316}, + {1350, 1350, 473: 5966, 651: 1822}, // 3450 {1351, 1351}, - {651: 5960}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5961, 2731, 2732, 2730}, - {1349, 1349, 473: 5962}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 5963}, + {651: 5961}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5962, 2732, 2733, 2731}, + {1349, 1349, 473: 5963}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 5964}, // 3455 - {47: 5964}, + {47: 5965}, {1347, 1347}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 1909, 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 3556, 777: 3720, 825: 5966}, - {47: 5967}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 1909, 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 3557, 777: 3721, 825: 5967}, + {47: 5968}, {1348, 1348}, // 3460 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6128, 2731, 2732, 2730}, - {595, 595, 497: 6125, 518: 6124, 1288: 6123}, - {16: 6111, 99: 6108, 132: 6113, 164: 6112, 190: 6110, 569: 6107, 583: 6109}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 6096, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6097}, - {671, 671, 494: 6091}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6129, 2732, 2733, 2731}, + {595, 595, 497: 6126, 518: 6125, 1288: 6124}, + {16: 6112, 99: 6109, 132: 6114, 164: 6113, 190: 6111, 569: 6108, 583: 6110}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 6097, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6098}, + {671, 671, 494: 6092}, // 3465 - {124: 6090}, - {98: 3912, 107: 3911, 122: 6085, 209: 6084, 832: 6086}, + {124: 6091}, + {98: 3913, 107: 3912, 122: 6086, 209: 6085, 832: 6087}, {667, 667}, - {659, 659, 180: 6066, 224: 6067, 234: 6068, 237: 6065, 259: 6070, 269: 6069, 283: 6072, 288: 6071, 493: 659, 659, 500: 659, 650: 6073, 1127: 6064, 1291: 6063, 6062}, + {659, 659, 180: 6067, 224: 6068, 234: 6069, 237: 6066, 259: 6071, 269: 6070, 283: 6073, 288: 6072, 493: 659, 659, 500: 659, 650: 6074, 1127: 6065, 1291: 6064, 6063}, {665, 665}, // 3470 {664, 664}, - {597, 597, 262: 6053, 494: 6052, 497: 597, 518: 597}, + {597, 597, 262: 6054, 494: 6053, 497: 597, 518: 597}, {499: 642, 544: 642}, {499: 641, 544: 641}, {499: 640, 544: 640}, @@ -10288,24 +10289,24 @@ var ( {636, 636, 497: 636, 518: 636}, {635, 635, 497: 635, 518: 635}, {634, 634, 497: 634, 518: 634}, - {122: 6050}, + {122: 6051}, // 3480 - {499: 6020, 544: 6021, 804: 6045}, - {98: 585, 107: 585, 204: 6018, 1088: 6039}, - {473: 6034}, + {499: 6021, 544: 6022, 804: 6046}, + {98: 585, 107: 585, 204: 6019, 1088: 6040}, + {473: 6035}, {625, 625, 497: 625, 518: 625}, {623, 623, 497: 623, 518: 623}, // 3485 - {124: 6032, 139: 6033, 195: 6031}, + {124: 6033, 139: 6034, 195: 6032}, {619, 619, 497: 619, 518: 619}, - {583, 583, 497: 583, 499: 6020, 518: 583, 544: 6021, 804: 6023, 840: 6030}, + {583, 583, 497: 583, 499: 6021, 518: 583, 544: 6022, 804: 6024, 840: 6031}, + {124: 6030}, {124: 6029}, - {124: 6028}, // 3490 + {124: 6028}, {124: 6027}, {124: 6026}, - {124: 6025}, - {583, 583, 497: 583, 499: 6020, 518: 583, 544: 6021, 804: 6023, 840: 6022}, + {583, 583, 497: 583, 499: 6021, 518: 583, 544: 6022, 804: 6024, 840: 6023}, {611, 611, 497: 611, 518: 611}, // 3495 {610, 610, 497: 610, 518: 610}, @@ -10318,7 +10319,7 @@ var ( {604, 604, 497: 604, 518: 604}, {603, 603, 497: 603, 518: 603}, {602, 602, 497: 602, 518: 602}, - {124: 6019}, + {124: 6020}, // 3505 {600, 600, 497: 600, 518: 600}, {599, 599, 497: 599, 518: 599}, @@ -10332,7 +10333,7 @@ var ( {2: 638, 638, 638, 638, 638, 8: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 48: 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638}, {612, 612, 497: 612, 518: 612}, // 3515 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 6024}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 6025}, {582, 582, 497: 582, 518: 582}, {613, 613, 497: 613, 518: 613}, {614, 614, 497: 614, 518: 614}, @@ -10345,49 +10346,49 @@ var ( {621, 621, 497: 621, 518: 621}, // 3525 {620, 620, 497: 620, 518: 620}, - {523: 6035}, - {47: 6036}, - {176: 6038, 302: 6037}, + {523: 6036}, + {47: 6037}, + {176: 6039, 302: 6038}, {626, 626, 497: 626, 518: 626}, // 3530 {624, 624, 497: 624, 518: 624}, - {98: 3912, 107: 3911, 832: 6040}, - {499: 6020, 544: 6021, 804: 6042, 1129: 6041}, - {583, 583, 497: 583, 499: 6020, 518: 583, 544: 6021, 804: 6023, 840: 6044}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6043}, + {98: 3913, 107: 3912, 832: 6041}, + {499: 6021, 544: 6022, 804: 6043, 1129: 6042}, + {583, 583, 497: 583, 499: 6021, 518: 583, 544: 6022, 804: 6024, 840: 6045}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6044}, // 3535 {581, 581, 497: 581, 499: 581, 518: 581, 544: 581}, {627, 627, 497: 627, 518: 627}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6046, 2731, 2732, 2730, 736: 6047}, - {1046, 1046, 497: 1046, 499: 6020, 518: 1046, 544: 6021, 651: 3894, 804: 6048}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6047, 2732, 2733, 2731, 736: 6048}, + {1046, 1046, 497: 1046, 499: 6021, 518: 1046, 544: 6022, 651: 3895, 804: 6049}, {630, 630, 497: 630, 518: 630}, // 3540 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6049, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6050, 2732, 2733, 2731}, {629, 629, 497: 629, 518: 629}, - {583, 583, 497: 583, 499: 6020, 518: 583, 544: 6021, 804: 6023, 840: 6051}, + {583, 583, 497: 583, 499: 6021, 518: 583, 544: 6022, 804: 6024, 840: 6052}, {632, 632, 497: 632, 518: 632}, - {569: 6057, 583: 6054, 849: 6056, 1289: 6055}, + {569: 6058, 583: 6055, 849: 6057, 1289: 6056}, // 3545 {596, 596, 497: 596, 518: 596}, {2: 2058, 2058, 2058, 2058, 2058, 8: 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 48: 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 479: 2058, 482: 2058, 504: 2058, 506: 2058, 523: 2058, 566: 2058, 646: 2058}, {663, 663}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 6061}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6058}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 6062}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6059}, // 3550 - {661, 661, 490: 6059}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6060, 2731, 2732, 2730}, + {661, 661, 490: 6060}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6061, 2732, 2733, 2731}, {660, 660}, {662, 662}, - {646, 646, 493: 646, 6080, 500: 646, 1290: 6079}, + {646, 646, 493: 646, 6081, 500: 646, 1290: 6080}, // 3555 - {658, 658, 7: 6077, 493: 658, 658, 500: 658}, + {658, 658, 7: 6078, 493: 658, 658, 500: 658}, {657, 657, 7: 657, 493: 657, 657, 500: 657}, {655, 655, 7: 655, 493: 655, 655, 500: 655}, {654, 654, 7: 654, 493: 654, 654, 500: 654}, - {349: 6076}, + {349: 6077}, // 3560 - {392: 6075}, - {339: 6074}, + {392: 6076}, + {339: 6075}, {650, 650, 7: 650, 493: 650, 650, 500: 650}, {649, 649, 7: 649, 493: 649, 649, 500: 649}, {648, 648, 7: 648, 493: 648, 648, 500: 648}, @@ -10396,105 +10397,105 @@ var ( {651, 651, 7: 651, 493: 651, 651, 500: 651}, {652, 652, 7: 652, 493: 652, 652, 500: 652}, {653, 653, 7: 653, 493: 653, 653, 500: 653}, - {180: 6066, 224: 6067, 234: 6068, 237: 6065, 259: 6070, 269: 6069, 283: 6072, 288: 6071, 650: 6073, 1127: 6078}, + {180: 6067, 224: 6068, 234: 6069, 237: 6066, 259: 6071, 269: 6070, 283: 6073, 288: 6072, 650: 6074, 1127: 6079}, // 3570 {656, 656, 7: 656, 493: 656, 656, 500: 656}, - {860, 860, 493: 2697, 500: 2698, 767: 2699, 828: 6083}, - {137: 6081}, - {508: 2705, 732: 4021, 763: 6082}, + {860, 860, 493: 2698, 500: 2699, 767: 2700, 828: 6084}, + {137: 6082}, + {508: 2706, 732: 4022, 763: 6083}, {645, 645, 493: 645, 500: 645}, // 3575 {666, 666}, {668, 668}, - {583, 583, 497: 583, 499: 6020, 518: 583, 544: 6021, 804: 6023, 840: 6089}, - {499: 6020, 544: 6021, 804: 6042, 1129: 6087}, - {583, 583, 497: 583, 499: 6020, 518: 583, 544: 6021, 804: 6023, 840: 6088}, + {583, 583, 497: 583, 499: 6021, 518: 583, 544: 6022, 804: 6024, 840: 6090}, + {499: 6021, 544: 6022, 804: 6043, 1129: 6088}, + {583, 583, 497: 583, 499: 6021, 518: 583, 544: 6022, 804: 6024, 840: 6089}, // 3580 {628, 628, 497: 628, 518: 628}, {633, 633, 497: 633, 518: 633}, {669, 669}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 6092}, - {644, 644, 481: 6094, 1324: 6093}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 6093}, + {644, 644, 481: 6095, 1324: 6094}, // 3585 {670, 670}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5630, 5628, 860: 6095}, - {643, 643, 7: 5631}, - {583, 583, 86: 1725, 159: 1725, 490: 1725, 497: 583, 499: 6020, 518: 583, 544: 6021, 648: 1725, 651: 1725, 804: 6023, 840: 6106}, - {86: 913, 159: 6099, 490: 5363, 648: 913, 858: 6098}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5631, 5629, 860: 6096}, + {643, 643, 7: 5632}, + {583, 583, 86: 1725, 159: 1725, 490: 1725, 497: 583, 499: 6021, 518: 583, 544: 6022, 648: 1725, 651: 1725, 804: 6024, 840: 6107}, + {86: 913, 159: 6100, 490: 5364, 648: 913, 858: 6099}, // 3590 - {86: 6100, 648: 6101}, + {86: 6101, 648: 6102}, {673, 673}, - {245, 245, 497: 2691, 789: 2692, 6105}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6102, 2731, 2732, 2730}, - {86: 6103}, + {245, 245, 497: 2692, 789: 2693, 6106}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6103, 2732, 2733, 2731}, + {86: 6104}, // 3595 - {245, 245, 497: 2691, 789: 2692, 6104}, + {245, 245, 497: 2692, 789: 2693, 6105}, {672, 672}, {674, 674}, {631, 631, 497: 631, 518: 631}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6122}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6123}, // 3600 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6121}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6119}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6118}, - {160: 6116}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 6115}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6122}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6120}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6119}, + {160: 6117}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 6116}, // 3605 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6114, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6115, 2732, 2733, 2731}, {675, 675}, {676, 676}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4951, 2731, 2732, 2730, 884: 6117}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4952, 2732, 2733, 2731, 884: 6118}, {677, 677}, // 3610 {678, 678}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 6120}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 6121}, {679, 679}, {680, 680}, {681, 681}, // 3615 {682, 682}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 3317, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3316, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 6127, 3222, 3302, 3221, 3218}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 2809, 2757, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 2838, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 2843, 2735, 2752, 2770, 2897, 2989, 2787, 2917, 3000, 2799, 2910, 2911, 2906, 2864, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 2845, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 2729, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 2849, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 2768, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 2834, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 2835, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 2905, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 2793, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 2720, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 2851, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 2721, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3112, 2847, 3113, 3114, 2746, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3127, 3128, 3178, 3177, 3026, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 2887, 2904, 3027, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3145, 3146, 3147, 2900, 3098, 3157, 3158, 3168, 3153, 3154, 3155, 3187, 2846, 473: 3229, 475: 3208, 3227, 2724, 479: 3237, 483: 3241, 3245, 3226, 3225, 3263, 492: 3199, 501: 3238, 506: 3261, 3244, 3203, 543: 3233, 566: 3240, 3262, 2722, 570: 3246, 3198, 3200, 574: 3202, 3201, 3230, 3206, 3220, 3232, 3207, 3211, 583: 3239, 3231, 587: 3236, 3242, 3251, 3304, 3252, 3253, 3205, 3282, 3223, 3224, 3277, 3278, 3279, 3280, 3281, 3234, 3259, 3264, 3274, 3275, 3268, 3283, 3284, 3285, 3269, 3287, 3288, 3270, 3286, 3265, 3273, 3271, 3257, 3289, 3290, 3235, 3294, 3247, 3248, 3250, 3293, 3299, 3298, 3300, 3297, 3301, 3296, 3295, 3292, 3243, 3291, 639: 3249, 3254, 3255, 647: 2725, 663: 3213, 2731, 2732, 2730, 708: 3228, 3303, 3214, 3219, 3204, 3276, 3217, 3215, 3216, 3256, 3267, 3266, 3260, 3258, 3272, 3212, 3222, 3302, 3221, 3218, 2728, 2727, 2726, 6126}, - {593, 593, 505: 3313, 509: 3311, 3312, 3310, 3308, 733: 3309, 3307}, - {594, 594, 482: 3318, 585: 3319}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 3318, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3317, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 6128, 3223, 3303, 3222, 3219}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 2810, 2758, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 2839, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 2844, 2736, 2753, 2771, 2898, 2990, 2788, 2918, 3001, 2800, 2911, 2912, 2907, 2865, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 2846, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 2730, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 2850, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 2769, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 2835, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 2836, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 2906, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 2794, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 2721, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 2852, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 2722, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3113, 2848, 3114, 3115, 2747, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3128, 3129, 3179, 3178, 3027, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 2888, 2905, 3028, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3146, 3147, 3148, 2901, 3099, 3158, 3159, 3169, 3154, 3155, 3156, 3188, 2847, 473: 3230, 475: 3209, 3228, 2725, 479: 3238, 483: 3242, 3246, 3227, 3226, 3264, 492: 3200, 501: 3239, 506: 3262, 3245, 3204, 543: 3234, 566: 3241, 3263, 2723, 570: 3247, 3199, 3201, 574: 3203, 3202, 3231, 3207, 3221, 3233, 3208, 3212, 583: 3240, 3232, 587: 3237, 3243, 3252, 3305, 3253, 3254, 3206, 3283, 3224, 3225, 3278, 3279, 3280, 3281, 3282, 3235, 3260, 3265, 3275, 3276, 3269, 3284, 3285, 3286, 3270, 3288, 3289, 3271, 3287, 3266, 3274, 3272, 3258, 3290, 3291, 3236, 3295, 3248, 3249, 3251, 3294, 3300, 3299, 3301, 3298, 3302, 3297, 3296, 3293, 3244, 3292, 639: 3250, 3255, 3256, 647: 2726, 663: 3214, 2732, 2733, 2731, 708: 3229, 3304, 3215, 3220, 3205, 3277, 3218, 3216, 3217, 3257, 3268, 3267, 3261, 3259, 3273, 3213, 3223, 3303, 3222, 3219, 2729, 2728, 2727, 6127}, + {593, 593, 505: 3314, 509: 3312, 3313, 3311, 3309, 733: 3310, 3308}, + {594, 594, 482: 3319, 585: 3320}, // 3620 - {1945, 1945, 176: 6130, 569: 1945, 1254: 6129}, - {559, 559, 569: 6132, 967: 6131}, + {1945, 1945, 176: 6131, 569: 1945, 1254: 6130}, + {559, 559, 569: 6133, 967: 6132}, {1944, 1944, 569: 1944}, {1950, 1950}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 6133}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 6134}, // 3625 - {558, 558, 7: 3892}, - {2: 1947, 1947, 1947, 1947, 1947, 8: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 48: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 566: 6136, 1221: 6135}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6139, 2731, 2732, 2730}, - {476: 4057, 4056, 809: 6137}, - {188: 6138}, + {558, 558, 7: 3893}, + {2: 1947, 1947, 1947, 1947, 1947, 8: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 48: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 566: 6137, 1221: 6136}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6140, 2732, 2733, 2731}, + {476: 4058, 4057, 809: 6138}, + {188: 6139}, // 3630 {2: 1946, 1946, 1946, 1946, 1946, 8: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 48: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946}, {1953, 1953}, - {2: 1949, 1949, 1949, 1949, 1949, 8: 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 48: 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 566: 6142, 1222: 6141}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6144, 2731, 2732, 2730}, - {188: 6143}, + {2: 1949, 1949, 1949, 1949, 1949, 8: 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 48: 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 566: 6143, 1222: 6142}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6145, 2732, 2733, 2731}, + {188: 6144}, // 3635 {2: 1948, 1948, 1948, 1948, 1948, 8: 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 48: 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948, 1948}, {1954, 1954}, - {508: 2705, 732: 6146}, + {508: 2706, 732: 6147}, {1956, 1956}, - {499: 6156}, + {499: 6157}, // 3640 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 6151, 663: 5294, 2731, 2732, 2730, 814: 6153, 1198: 6152}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 6150}, - {7: 3892, 499: 2003, 649: 2003}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 6152, 663: 5295, 2732, 2733, 2731, 814: 6154, 1198: 6153}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 6151}, + {7: 3893, 499: 2003, 649: 2003}, {499: 2005, 649: 2005}, - {7: 6154, 499: 2004, 649: 2004}, + {7: 6155, 499: 2004, 649: 2004}, // 3645 {7: 2002, 499: 2002, 649: 2002}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 6155}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 6156}, {7: 2001, 499: 2001, 649: 2001}, - {475: 6157}, - {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6158}, + {475: 6158}, + {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6159}, // 3650 - {2006, 2006, 15: 6185, 48: 6161, 50: 6181, 6174, 6164, 6160, 6168, 6172, 6184, 6167, 6173, 6171, 6169, 6182, 6175, 6163, 6183, 6162, 6165, 6166, 6170, 472: 6176, 652: 6186, 892: 6178, 6177, 6180, 6159, 897: 6179}, + {2006, 2006, 15: 6186, 48: 6162, 50: 6182, 6175, 6165, 6161, 6169, 6173, 6185, 6168, 6174, 6172, 6170, 6183, 6176, 6164, 6184, 6163, 6166, 6167, 6171, 472: 6177, 652: 6187, 892: 6179, 6178, 6181, 6160, 897: 6180}, {1999, 1999, 15: 1999, 48: 1999, 50: 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 472: 1999, 652: 1999}, {498: 1998, 508: 1998}, {498: 1997, 508: 1997}, @@ -10515,20 +10516,20 @@ var ( {475: 1985, 498: 1985}, {2: 1984, 1984, 1984, 1984, 1984, 8: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 48: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 475: 1984, 491: 1984, 498: 1984, 507: 1984}, {2: 1983, 1983, 1983, 1983, 1983, 8: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 48: 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 1983, 475: 1983, 491: 1983, 498: 1983, 507: 1983}, - {199: 6226}, - {498: 4246, 508: 2037, 735: 6224}, + {199: 6227}, + {498: 4247, 508: 2037, 735: 6225}, // 3670 - {498: 4246, 508: 2037, 571: 2037, 2037, 735: 6222}, - {475: 2037, 498: 4246, 735: 6220}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 491: 2037, 498: 4246, 507: 2037, 735: 6215}, - {475: 2037, 498: 4246, 508: 2037, 735: 6210}, - {475: 2037, 498: 4246, 508: 2037, 735: 6207}, + {498: 4247, 508: 2037, 571: 2037, 2037, 735: 6223}, + {475: 2037, 498: 4247, 735: 6221}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 491: 2037, 498: 4247, 507: 2037, 735: 6216}, + {475: 2037, 498: 4247, 508: 2037, 735: 6211}, + {475: 2037, 498: 4247, 508: 2037, 735: 6208}, // 3675 - {498: 4246, 508: 2037, 735: 6202}, - {98: 2037, 107: 2037, 498: 4246, 508: 2037, 735: 6199}, - {182: 2037, 2037, 186: 2037, 498: 4246, 508: 2037, 571: 2037, 2037, 735: 6196}, - {182: 2037, 2037, 186: 2037, 498: 4246, 508: 2037, 571: 2037, 2037, 735: 6187}, - {182: 6193, 6194, 186: 6195, 508: 2705, 571: 6191, 6192, 732: 6190, 925: 6188, 1091: 6189}, + {498: 4247, 508: 2037, 735: 6203}, + {98: 2037, 107: 2037, 498: 4247, 508: 2037, 735: 6200}, + {182: 2037, 2037, 186: 2037, 498: 4247, 508: 2037, 571: 2037, 2037, 735: 6197}, + {182: 2037, 2037, 186: 2037, 498: 4247, 508: 2037, 571: 2037, 2037, 735: 6188}, + {182: 6194, 6195, 186: 6196, 508: 2706, 571: 6192, 6193, 732: 6191, 925: 6189, 1091: 6190}, // 3680 {1967, 1967, 15: 1967, 48: 1967, 50: 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 1967, 472: 1967, 652: 1967}, {1966, 1966, 15: 1966, 48: 1966, 50: 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 1966, 472: 1966, 652: 1966}, @@ -10539,64 +10540,64 @@ var ( {1959, 1959, 15: 1959, 48: 1959, 50: 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 472: 1959, 652: 1959}, {1958, 1958, 15: 1958, 48: 1958, 50: 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 1958, 472: 1958, 652: 1958}, {1957, 1957, 15: 1957, 48: 1957, 50: 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 1957, 472: 1957, 652: 1957}, - {182: 6193, 6194, 186: 6195, 508: 2705, 571: 6191, 6192, 732: 6190, 925: 6197, 1091: 6198}, + {182: 6194, 6195, 186: 6196, 508: 2706, 571: 6192, 6193, 732: 6191, 925: 6198, 1091: 6199}, {1969, 1969, 15: 1969, 48: 1969, 50: 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969, 472: 1969, 652: 1969}, // 3690 {1968, 1968, 15: 1968, 48: 1968, 50: 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 1968, 472: 1968, 652: 1968}, - {98: 3912, 107: 3911, 508: 2705, 732: 2704, 743: 6201, 832: 6200}, + {98: 3913, 107: 3912, 508: 2706, 732: 2705, 743: 6202, 832: 6201}, {1971, 1971, 15: 1971, 48: 1971, 50: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 472: 1971, 652: 1971}, {1970, 1970, 15: 1970, 48: 1970, 50: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 472: 1970, 652: 1970}, - {508: 2705, 732: 2704, 743: 6203}, + {508: 2706, 732: 2705, 743: 6204}, // 3695 - {205: 6204}, - {556: 6205}, - {108: 6206}, + {205: 6205}, + {556: 6206}, + {108: 6207}, {1972, 1972, 15: 1972, 48: 1972, 50: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 472: 1972, 652: 1972}, - {475: 6208, 508: 2705, 732: 2704, 743: 6209}, + {475: 6209, 508: 2706, 732: 2705, 743: 6210}, // 3700 {1974, 1974, 15: 1974, 48: 1974, 50: 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974, 472: 1974, 652: 1974}, {1973, 1973, 15: 1973, 48: 1973, 50: 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 472: 1973, 652: 1973}, - {475: 6212, 508: 2705, 732: 2704, 743: 6211}, - {1975, 1975, 15: 1975, 48: 1975, 50: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 101: 3432, 104: 3428, 108: 3425, 3440, 3427, 3424, 3426, 3430, 3431, 3436, 3435, 3434, 3438, 3439, 3433, 3437, 123: 3429, 472: 1975, 652: 1975, 802: 6213}, + {475: 6213, 508: 2706, 732: 2705, 743: 6212}, + {1975, 1975, 15: 1975, 48: 1975, 50: 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 1975, 101: 3433, 104: 3429, 108: 3426, 3441, 3428, 3425, 3427, 3431, 3432, 3437, 3436, 3435, 3439, 3440, 3434, 3438, 123: 3430, 472: 1975, 652: 1975, 802: 6214}, {1976, 1976, 15: 1976, 48: 1976, 50: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 472: 1976, 652: 1976}, // 3705 - {306: 6214}, + {306: 6215}, {1977, 1977, 15: 1977, 48: 1977, 50: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 472: 1977, 652: 1977}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 491: 6218, 507: 6219, 663: 3459, 2731, 2732, 2730, 737: 6217, 1305: 6216}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 491: 6219, 507: 6220, 663: 3460, 2732, 2733, 2731, 737: 6218, 1305: 6217}, {1978, 1978, 15: 1978, 48: 1978, 50: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 472: 1978, 652: 1978}, {254, 254, 15: 254, 48: 254, 50: 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 472: 254, 652: 254}, // 3710 {253, 253, 15: 253, 48: 253, 50: 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 472: 253, 652: 253}, {252, 252, 15: 252, 48: 252, 50: 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 472: 252, 652: 252}, - {475: 6221}, + {475: 6222}, {1979, 1979, 15: 1979, 48: 1979, 50: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 472: 1979, 652: 1979}, - {508: 2705, 571: 6191, 6192, 732: 6190, 925: 6223}, + {508: 2706, 571: 6192, 6193, 732: 6191, 925: 6224}, // 3715 {1980, 1980, 15: 1980, 48: 1980, 50: 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 1980, 472: 1980, 652: 1980}, - {508: 2705, 732: 2704, 743: 6225}, + {508: 2706, 732: 2705, 743: 6226}, {1981, 1981, 15: 1981, 48: 1981, 50: 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 1981, 472: 1981, 652: 1981}, {2: 1982, 1982, 1982, 1982, 1982, 8: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 48: 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 1982, 475: 1982, 491: 1982, 498: 1982, 507: 1982}, - {649: 6228}, + {649: 6229}, // 3720 - {475: 6229}, - {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6230}, - {2007, 2007, 15: 6185, 48: 6161, 50: 6181, 6174, 6164, 6160, 6168, 6172, 6184, 6167, 6173, 6171, 6169, 6182, 6175, 6163, 6183, 6162, 6165, 6166, 6170, 472: 6176, 652: 6186, 892: 6178, 6177, 6180, 6159, 897: 6179}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6232, 2731, 2732, 2730}, + {475: 6230}, + {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6231}, + {2007, 2007, 15: 6186, 48: 6162, 50: 6182, 6175, 6165, 6161, 6169, 6173, 6185, 6168, 6174, 6172, 6170, 6183, 6176, 6164, 6184, 6163, 6166, 6167, 6171, 472: 6177, 652: 6187, 892: 6179, 6178, 6181, 6160, 897: 6180}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6233, 2732, 2733, 2731}, {2008, 2008}, // 3725 {2009, 2009}, - {2027, 2027, 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 6266}, + {2027, 2027, 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 6267}, {2025, 2025}, - {26: 6264}, - {1758, 1758, 1758, 1758, 1758, 1758, 1758, 8: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 48: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 498: 6253, 651: 1758}, + {26: 6265}, + {1758, 1758, 1758, 1758, 1758, 1758, 1758, 8: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 48: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 498: 6254, 651: 1758}, // 3730 - {251: 6240, 473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 6239}, + {251: 6241, 473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 6240}, {2019, 2019}, - {498: 6241}, - {165: 6245, 226: 6248, 244: 6247, 299: 6244, 6250, 6249, 475: 6243, 576: 6246, 1042: 6242}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 6252}, + {498: 6242}, + {165: 6246, 226: 6249, 244: 6248, 299: 6245, 6251, 6250, 475: 6244, 576: 6247, 1042: 6243}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 6253}, // 3735 - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 6251}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 6252}, {473: 2016, 2016, 494: 2016, 501: 2016, 507: 2016, 567: 2016, 569: 2016, 645: 2016, 653: 2016, 660: 2016, 738: 2016}, {473: 2015, 2015, 494: 2015, 501: 2015, 507: 2015, 567: 2015, 569: 2015, 645: 2015, 653: 2015, 660: 2015, 738: 2015}, {473: 2014, 2014, 494: 2014, 501: 2014, 507: 2014, 567: 2014, 569: 2014, 645: 2014, 653: 2014, 660: 2014, 738: 2014}, @@ -10608,29 +10609,29 @@ var ( {2017, 2017}, {2018, 2018}, // 3745 - {165: 6245, 226: 6248, 244: 6247, 299: 6244, 6250, 6249, 475: 6254, 576: 6246, 1042: 6255}, - {473: 2559, 2558, 494: 6260, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 6261}, - {473: 2559, 2558, 494: 6256, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 660: 2677, 708: 2678, 738: 2524, 747: 2679, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2685, 2684, 765: 2525, 771: 2659, 773: 2682, 2683, 2681, 778: 2526, 782: 2680, 805: 2686, 824: 6257}, - {26: 6258}, + {165: 6246, 226: 6249, 244: 6248, 299: 6245, 6251, 6250, 475: 6255, 576: 6247, 1042: 6256}, + {473: 2560, 2559, 494: 6261, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 6262}, + {473: 2560, 2559, 494: 6257, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 660: 2678, 708: 2679, 738: 2525, 747: 2680, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2686, 2685, 765: 2526, 771: 2660, 773: 2683, 2684, 2682, 778: 2527, 782: 2681, 805: 2687, 824: 6258}, + {26: 6259}, {2020, 2020}, // 3750 - {508: 2705, 732: 6259}, + {508: 2706, 732: 6260}, {2021, 2021}, - {26: 6262}, + {26: 6263}, {2022, 2022}, - {508: 2705, 732: 6263}, + {508: 2706, 732: 6264}, // 3755 {2023, 2023}, - {508: 2705, 732: 6265}, + {508: 2706, 732: 6266}, {2024, 2024}, {2026, 2026}, {2034, 2034}, // 3760 - {498: 6292}, - {71: 2518, 145: 2520, 152: 2548, 2533, 155: 2517, 395: 6288, 473: 2559, 2558, 501: 2557, 504: 6272, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 6270, 738: 2524, 747: 6271, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 6278, 6277, 765: 2525, 771: 2659, 773: 6275, 6276, 6274, 778: 2526, 782: 6273, 798: 2534, 808: 6286, 843: 6280, 847: 6281, 857: 6279, 859: 6283, 861: 6284, 6282, 6285, 918: 6287}, - {459, 459, 480: 805, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, + {498: 6293}, + {71: 2519, 145: 2521, 152: 2549, 2534, 155: 2518, 395: 6289, 473: 2560, 2559, 501: 2558, 504: 6273, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 6271, 738: 2525, 747: 6272, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 6279, 6278, 765: 2526, 771: 2660, 773: 6276, 6277, 6275, 778: 2527, 782: 6274, 798: 2535, 808: 6287, 843: 6281, 847: 6282, 857: 6280, 859: 6284, 861: 6285, 6283, 6286, 918: 6288}, + {459, 459, 480: 805, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, {461, 461, 480: 806, 488: 806, 806}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 5591, 5586, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 5589, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 5588, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 5593, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 5587, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 5596, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 5594, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 5590, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 506: 3805, 568: 5602, 590: 5601, 646: 3803, 663: 5599, 2731, 2732, 2730, 772: 5603, 829: 5600, 976: 5604, 1155: 5597}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 5592, 5587, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 5590, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 5589, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 5594, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 5588, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 5597, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 5595, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 5591, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 506: 3806, 568: 5603, 590: 5602, 646: 3804, 663: 5600, 2732, 2733, 2731, 772: 5604, 829: 5601, 976: 5605, 1155: 5598}, // 3765 {466, 466}, {465, 465}, @@ -10647,188 +10648,188 @@ var ( {454, 454}, {453, 453}, {452, 452}, - {21: 5098}, + {21: 5099}, {2032, 2032}, // 3780 - {498: 6289}, - {475: 6290}, - {71: 2518, 145: 2520, 152: 2548, 2533, 155: 2517, 473: 2559, 2558, 501: 2557, 504: 6272, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 6270, 738: 2524, 747: 6271, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 6278, 6277, 765: 2525, 771: 2659, 773: 6275, 6276, 6274, 778: 2526, 782: 6273, 798: 2534, 808: 6286, 843: 6280, 847: 6281, 857: 6279, 859: 6283, 861: 6284, 6282, 6285, 918: 6291}, + {498: 6290}, + {475: 6291}, + {71: 2519, 145: 2521, 152: 2549, 2534, 155: 2518, 473: 2560, 2559, 501: 2558, 504: 6273, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 6271, 738: 2525, 747: 6272, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 6279, 6278, 765: 2526, 771: 2660, 773: 6276, 6277, 6275, 778: 2527, 782: 6274, 798: 2535, 808: 6287, 843: 6281, 847: 6282, 857: 6280, 859: 6284, 861: 6285, 6283, 6286, 918: 6292}, {2031, 2031}, - {475: 6293}, + {475: 6294}, // 3785 - {71: 2518, 145: 2520, 152: 2548, 2533, 155: 2517, 473: 2559, 2558, 501: 2557, 504: 6272, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 6270, 738: 2524, 747: 6271, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 6278, 6277, 765: 2525, 771: 2659, 773: 6275, 6276, 6274, 778: 2526, 782: 6273, 798: 2534, 808: 6286, 843: 6280, 847: 6281, 857: 6279, 859: 6283, 861: 6284, 6282, 6285, 918: 6294}, + {71: 2519, 145: 2521, 152: 2549, 2534, 155: 2518, 473: 2560, 2559, 501: 2558, 504: 6273, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 6271, 738: 2525, 747: 6272, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 6279, 6278, 765: 2526, 771: 2660, 773: 6276, 6277, 6275, 778: 2527, 782: 6274, 798: 2535, 808: 6287, 843: 6281, 847: 6282, 857: 6280, 859: 6284, 861: 6285, 6283, 6286, 918: 6295}, {2033, 2033}, - {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 491: 1048, 499: 1048, 752: 5301, 5300, 5299, 836: 5302, 885: 6296}, - {2: 1036, 1036, 1036, 1036, 1036, 8: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 48: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 5667, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 491: 1036, 499: 1036, 1106: 6297}, - {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 491: 4158, 499: 1846, 853: 6298}, + {2: 1048, 1048, 1048, 1048, 1048, 8: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 48: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 491: 1048, 499: 1048, 752: 5302, 5301, 5300, 836: 5303, 885: 6297}, + {2: 1036, 1036, 1036, 1036, 1036, 8: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 48: 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 5668, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 491: 1036, 499: 1036, 1106: 6298}, + {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 48: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 491: 4159, 499: 1846, 853: 6299}, // 3790 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 499: 6299, 663: 5671, 2731, 2732, 2730, 915: 5672, 965: 5670}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6301, 2731, 2732, 2730, 736: 5684, 915: 5672, 965: 6300}, - {7: 5680, 481: 6304}, - {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1038, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 48: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 478: 1046, 481: 1038, 490: 1046, 1046, 493: 1046, 497: 1046, 502: 1046, 1046, 525: 1046, 651: 6302, 905: 5673}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 523: 5676, 663: 6303, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 499: 6300, 663: 5672, 2732, 2733, 2731, 915: 5673, 965: 5671}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6302, 2732, 2733, 2731, 736: 5685, 915: 5673, 965: 6301}, + {7: 5681, 481: 6305}, + {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1038, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 48: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 478: 1046, 481: 1038, 490: 1046, 1046, 493: 1046, 497: 1046, 502: 1046, 1046, 525: 1046, 651: 6303, 905: 5674}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 523: 5677, 663: 6304, 2732, 2733, 2731}, // 3795 - {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1038, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 48: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 478: 1045, 481: 1038, 490: 1045, 1045, 493: 1045, 497: 1045, 502: 1045, 1045, 525: 1045, 651: 5678, 905: 5677}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 5313, 579: 5308, 663: 3889, 2731, 2732, 2730, 708: 5312, 736: 5311, 796: 5310, 800: 5309, 5315, 850: 5305, 888: 6305}, - {245, 245, 7: 5359, 497: 2691, 789: 2692, 6306}, + {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1038, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 48: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 478: 1045, 481: 1038, 490: 1045, 1045, 493: 1045, 497: 1045, 502: 1045, 1045, 525: 1045, 651: 5679, 905: 5678}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 5314, 579: 5309, 663: 3890, 2732, 2733, 2731, 708: 5313, 736: 5312, 796: 5311, 800: 5310, 5316, 850: 5306, 888: 6306}, + {245, 245, 7: 5360, 497: 2692, 789: 2693, 6307}, {2063, 2063}, - {2066, 2066, 7: 3558}, + {2066, 2066, 7: 3559}, // 3800 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6366, 2731, 2732, 2730}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6364}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6355}, - {122: 5437, 569: 5436, 1145: 6351}, - {156: 591, 162: 5491}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6367, 2732, 2733, 2731}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6365}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6356}, + {122: 5438, 569: 5437, 1145: 6352}, + {156: 591, 162: 5492}, // 3805 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 566: 6346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 6345}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 566: 6342, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5196, 866: 6341}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 566: 6338, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5630, 5628, 860: 6337}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6333}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6331}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 566: 6347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 6346}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 566: 6343, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5197, 866: 6342}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 566: 6339, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5631, 5629, 860: 6338}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6334}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6332}, // 3810 - {156: 6326}, - {160: 6323}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6321}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 6322}, - {26, 26, 7: 3892}, + {156: 6327}, + {160: 6324}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6322}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 6323}, + {26, 26, 7: 3893}, // 3815 - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6324}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4951, 2731, 2732, 2730, 884: 6325}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6325}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4952, 2732, 2733, 2731, 884: 6326}, {53, 53}, - {494: 6327}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 5652, 738: 5650, 747: 5653, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 5651, 5655, 5654, 765: 5657, 771: 2659, 773: 5658, 5659, 5656, 844: 6328}, + {494: 6328}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 5653, 738: 5651, 747: 5654, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 5652, 5656, 5655, 765: 5658, 771: 2660, 773: 5659, 5660, 5657, 844: 6329}, // 3820 - {177, 177, 481: 6329}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 5652, 738: 5650, 747: 5653, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 5651, 5655, 5654, 765: 5657, 771: 2659, 773: 5658, 5659, 5656, 844: 6330}, + {177, 177, 481: 6330}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 5653, 738: 5651, 747: 5654, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 5652, 5656, 5655, 765: 5658, 771: 2660, 773: 5659, 5660, 5657, 844: 6331}, {176, 176}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6332, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6333, 2732, 2733, 2731}, {1951, 1951}, // 3825 - {2045, 2045, 158: 6335, 490: 6334}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 6336}, + {2045, 2045, 158: 6336, 490: 6335}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 6337}, {2043, 2043}, - {2044, 2044, 7: 4713}, - {2047, 2047, 7: 5631}, + {2044, 2044, 7: 4714}, + {2047, 2047, 7: 5632}, // 3830 - {584: 6339}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 5630, 5628, 860: 6340}, - {2046, 2046, 7: 5631}, - {2049, 2049, 7: 5198}, - {584: 6343}, + {584: 6340}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 5631, 5629, 860: 6341}, + {2046, 2046, 7: 5632}, + {2049, 2049, 7: 5199}, + {584: 6344}, // 3835 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5196, 866: 6344}, - {2048, 2048, 7: 5198}, - {2042, 2042, 7: 3892, 669: 4764, 671: 4763, 909: 6350}, - {584: 6347}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 6348}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5197, 866: 6345}, + {2048, 2048, 7: 5199}, + {2042, 2042, 7: 3893, 669: 4765, 671: 4764, 909: 6351}, + {584: 6348}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 6349}, // 3840 - {2042, 2042, 7: 3892, 669: 4764, 671: 4763, 909: 6349}, + {2042, 2042, 7: 3893, 669: 4765, 671: 4764, 909: 6350}, {2050, 2050}, {2051, 2051}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6352}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 3890, 794: 6353}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6353}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 3891, 794: 6354}, // 3845 - {2042, 2042, 7: 3892, 669: 4764, 671: 4763, 909: 6354}, + {2042, 2042, 7: 3893, 669: 4765, 671: 4764, 909: 6355}, {2055, 2055}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6356, 2731, 2732, 2730}, - {472: 6357}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6358}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6357, 2732, 2733, 2731}, + {472: 6358}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6359}, // 3850 - {2185, 2185, 81: 4200, 496: 4201, 868: 6360, 881: 6359, 1062: 6361}, - {2184, 2184, 81: 4200, 868: 6363}, - {2183, 2183, 496: 4201, 881: 6362}, + {2185, 2185, 81: 4201, 496: 4202, 868: 6361, 881: 6360, 1062: 6362}, + {2184, 2184, 81: 4201, 868: 6364}, + {2183, 2183, 496: 4202, 881: 6363}, {2056, 2056}, {2181, 2181}, // 3855 {2182, 2182}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 6365}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 6366}, {2057, 2057}, {2193, 2193}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6588}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6589}, // 3860 - {648: 6576}, + {648: 6577}, {648: 2179}, {648: 2178}, {648: 2177}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6553}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6554}, // 3865 - {16: 6474, 81: 6473, 99: 2083, 140: 2083, 667: 2083, 1327: 6472}, - {507: 6471}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6459}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 475: 1848, 566: 4788, 570: 1848, 784: 6427}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 475: 1848, 566: 4788, 784: 6421}, + {16: 6475, 81: 6474, 99: 2083, 140: 2083, 667: 2083, 1327: 6473}, + {507: 6472}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6460}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 475: 1848, 566: 4789, 570: 1848, 784: 6428}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 475: 1848, 566: 4789, 784: 6422}, // 3870 - {156: 6416}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6380}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6381}, - {49, 49, 4: 49, 49, 49, 13: 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, 70: 6389, 6386, 6392, 6393, 6394, 6387, 6385, 6395, 6391, 6388, 479: 49, 49, 482: 49, 503: 49, 506: 49, 646: 49, 648: 49, 656: 6390, 911: 6384, 1193: 6382, 1284: 6383}, - {393, 393, 4: 4206, 4208, 397, 13: 4225, 2156, 4223, 4164, 4227, 4214, 4243, 4207, 4210, 4209, 4212, 4213, 4215, 4222, 397, 4233, 4234, 4220, 4221, 4226, 4228, 4240, 4239, 4245, 4241, 4238, 4231, 4236, 4237, 4230, 4232, 4235, 4224, 479: 4205, 4242, 482: 2156, 503: 4934, 506: 2156, 646: 2156, 648: 4211, 779: 4216, 791: 4218, 811: 4217, 833: 4219, 837: 4229, 841: 4244, 917: 5513, 1016: 6415}, + {156: 6417}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6381}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6382}, + {49, 49, 4: 49, 49, 49, 13: 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, 70: 6390, 6387, 6393, 6394, 6395, 6388, 6386, 6396, 6392, 6389, 479: 49, 49, 482: 49, 503: 49, 506: 49, 646: 49, 648: 49, 656: 6391, 911: 6385, 1193: 6383, 1284: 6384}, + {393, 393, 4: 4207, 4209, 397, 13: 4226, 2156, 4224, 4165, 4228, 4215, 4244, 4208, 4211, 4210, 4213, 4214, 4216, 4223, 397, 4234, 4235, 4221, 4222, 4227, 4229, 4241, 4240, 4246, 4242, 4239, 4232, 4237, 4238, 4231, 4233, 4236, 4225, 479: 4206, 4243, 482: 2156, 503: 4935, 506: 2156, 646: 2156, 648: 4212, 779: 4217, 791: 4219, 811: 4218, 833: 4220, 837: 4230, 841: 4245, 917: 5514, 1016: 6416}, // 3875 - {48, 48, 4: 48, 48, 48, 13: 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, 70: 6389, 6386, 6392, 6393, 6394, 6387, 6385, 6395, 6391, 6388, 479: 48, 48, 482: 48, 503: 48, 506: 48, 646: 48, 648: 48, 656: 6390, 911: 6414}, + {48, 48, 4: 48, 48, 48, 13: 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, 70: 6390, 6387, 6393, 6394, 6395, 6388, 6386, 6396, 6392, 6389, 479: 48, 48, 482: 48, 503: 48, 506: 48, 646: 48, 648: 48, 656: 6391, 911: 6415}, {47, 47, 4: 47, 47, 47, 13: 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, 70: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 479: 47, 47, 482: 47, 503: 47, 506: 47, 646: 47, 648: 47, 656: 47}, - {485: 2037, 2037, 498: 4246, 508: 2037, 659: 6411, 735: 6410}, - {474: 6407, 485: 2037, 2037, 498: 4246, 508: 2037, 735: 6406}, - {485: 2037, 2037, 498: 4246, 508: 2037, 735: 6404}, + {485: 2037, 2037, 498: 4247, 508: 2037, 659: 6412, 735: 6411}, + {474: 6408, 485: 2037, 2037, 498: 4247, 508: 2037, 735: 6407}, + {485: 2037, 2037, 498: 4247, 508: 2037, 735: 6405}, // 3880 {40, 40, 4: 40, 40, 40, 13: 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, 70: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 479: 40, 40, 482: 40, 503: 40, 506: 40, 646: 40, 648: 40, 656: 40}, - {72: 6402, 74: 6403, 6400, 656: 6401}, - {485: 2037, 2037, 498: 4246, 508: 2037, 735: 6398}, + {72: 6403, 74: 6404, 6401, 656: 6402}, + {485: 2037, 2037, 498: 4247, 508: 2037, 735: 6399}, {37, 37, 4: 37, 37, 37, 13: 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, 70: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 479: 37, 37, 482: 37, 503: 37, 506: 37, 646: 37, 648: 37, 656: 37}, - {485: 2037, 2037, 498: 4246, 508: 2037, 735: 6396}, + {485: 2037, 2037, 498: 4247, 508: 2037, 735: 6397}, // 3885 {34, 34, 4: 34, 34, 34, 13: 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, 70: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 479: 34, 34, 482: 34, 503: 34, 506: 34, 646: 34, 648: 34, 656: 34}, {32, 32, 4: 32, 32, 32, 13: 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, 70: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 479: 32, 32, 482: 32, 503: 32, 506: 32, 646: 32, 648: 32, 656: 32}, {31, 31, 4: 31, 31, 31, 13: 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, 70: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 479: 31, 31, 482: 31, 503: 31, 506: 31, 646: 31, 648: 31, 656: 31}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6397}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6398}, {35, 35, 4: 35, 35, 35, 13: 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, 70: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 479: 35, 35, 482: 35, 503: 35, 506: 35, 646: 35, 648: 35, 656: 35}, // 3890 - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6399}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6400}, {38, 38, 4: 38, 38, 38, 13: 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, 70: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 479: 38, 38, 482: 38, 503: 38, 506: 38, 646: 38, 648: 38, 656: 38}, {39, 39, 4: 39, 39, 39, 13: 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, 70: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 479: 39, 39, 482: 39, 503: 39, 506: 39, 646: 39, 648: 39, 656: 39}, {36, 36, 4: 36, 36, 36, 13: 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, 70: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 479: 36, 36, 482: 36, 503: 36, 506: 36, 646: 36, 648: 36, 656: 36}, {33, 33, 4: 33, 33, 33, 13: 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, 70: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 479: 33, 33, 482: 33, 503: 33, 506: 33, 646: 33, 648: 33, 656: 33}, // 3895 {30, 30, 4: 30, 30, 30, 13: 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, 70: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 479: 30, 30, 482: 30, 503: 30, 506: 30, 646: 30, 648: 30, 656: 30}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6405}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6406}, {41, 41, 4: 41, 41, 41, 13: 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, 70: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 479: 41, 41, 482: 41, 503: 41, 506: 41, 646: 41, 648: 41, 656: 41}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6409}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6408}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6410}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6409}, // 3900 {42, 42, 4: 42, 42, 42, 13: 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, 70: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 479: 42, 42, 482: 42, 503: 42, 506: 42, 646: 42, 648: 42, 656: 42}, {43, 43, 4: 43, 43, 43, 13: 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, 70: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 479: 43, 43, 482: 43, 503: 43, 506: 43, 646: 43, 648: 43, 656: 43}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6413}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6412}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6414}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6413}, {44, 44, 4: 44, 44, 44, 13: 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, 70: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 479: 44, 44, 482: 44, 503: 44, 506: 44, 646: 44, 648: 44, 656: 44}, // 3905 {45, 45, 4: 45, 45, 45, 13: 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, 70: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 479: 45, 45, 482: 45, 503: 45, 506: 45, 646: 45, 648: 45, 656: 45}, {46, 46, 4: 46, 46, 46, 13: 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, 70: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 479: 46, 46, 482: 46, 503: 46, 506: 46, 646: 46, 648: 46, 656: 46}, {50, 50}, - {494: 6417}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 5652, 738: 5650, 747: 5653, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 5651, 5655, 5654, 765: 5657, 771: 2659, 773: 5658, 5659, 5656, 844: 6418}, + {494: 6418}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 5653, 738: 5651, 747: 5654, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 5652, 5656, 5655, 765: 5658, 771: 2660, 773: 5659, 5660, 5657, 844: 6419}, // 3910 - {481: 6419}, - {473: 2559, 2558, 501: 2557, 507: 2543, 567: 2542, 569: 2556, 645: 2552, 653: 2660, 708: 5652, 738: 5650, 747: 5653, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 5651, 5655, 5654, 765: 5657, 771: 2659, 773: 5658, 5659, 5656, 844: 6420}, + {481: 6420}, + {473: 2560, 2559, 501: 2558, 507: 2544, 567: 2543, 569: 2557, 645: 2553, 653: 2661, 708: 5653, 738: 5651, 747: 5654, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 5652, 5656, 5655, 765: 5658, 771: 2660, 773: 5659, 5660, 5657, 844: 6421}, {178, 178}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 6423, 5628, 1119: 6424, 1279: 6422}, - {240, 240, 7: 6425}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 6424, 5629, 1119: 6425, 1279: 6423}, + {240, 240, 7: 6426}, // 3915 {189, 189, 7: 189}, {188, 188, 7: 188}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 5622, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 5627, 663: 3459, 2731, 2732, 2730, 737: 5149, 799: 5629, 819: 6423, 5628, 1119: 6426}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 5623, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 5628, 663: 3460, 2732, 2733, 2731, 737: 5150, 799: 5630, 819: 6424, 5629, 1119: 6427}, {187, 187, 7: 187}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5212, 889: 5213, 920: 6428}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5213, 889: 5214, 920: 6429}, // 3920 - {223, 223, 7: 5215, 13: 223, 46: 223, 474: 223, 661: 5259, 958: 5258, 6429}, - {231, 231, 13: 231, 46: 231, 474: 6431, 1007: 6430}, - {210, 210, 13: 6448, 46: 6446, 951: 6447, 6445, 1099: 6444, 6443}, - {126: 6436, 6434, 6435, 6437, 1006: 6433, 1191: 6432}, - {230, 230, 13: 230, 46: 230, 126: 6436, 6434, 6435, 6437, 1006: 6442}, + {223, 223, 7: 5216, 13: 223, 46: 223, 474: 223, 661: 5260, 958: 5259, 6430}, + {231, 231, 13: 231, 46: 231, 474: 6432, 1007: 6431}, + {210, 210, 13: 6449, 46: 6447, 951: 6448, 6446, 1099: 6445, 6444}, + {126: 6437, 6435, 6436, 6438, 1006: 6434, 1191: 6433}, + {230, 230, 13: 230, 46: 230, 126: 6437, 6435, 6436, 6438, 1006: 6443}, // 3925 {229, 229, 13: 229, 46: 229, 126: 229, 229, 229, 229}, - {508: 2705, 732: 4021, 763: 6441}, - {508: 2705, 732: 4021, 763: 6440}, - {508: 2705, 732: 4021, 763: 6439}, - {508: 2705, 732: 4021, 763: 6438}, + {508: 2706, 732: 4022, 763: 6442}, + {508: 2706, 732: 4022, 763: 6441}, + {508: 2706, 732: 4022, 763: 6440}, + {508: 2706, 732: 4022, 763: 6439}, // 3930 {224, 224, 13: 224, 46: 224, 126: 224, 224, 224, 224}, {225, 225, 13: 225, 46: 225, 126: 225, 225, 225, 225}, @@ -10837,382 +10838,382 @@ var ( {228, 228, 13: 228, 46: 228, 126: 228, 228, 228, 228}, // 3935 {241, 241}, - {209, 209, 13: 6448, 46: 6446, 951: 6447, 6458}, + {209, 209, 13: 6449, 46: 6447, 951: 6448, 6459}, {208, 208, 13: 208, 46: 208}, - {496: 6457, 971: 6456}, - {204, 204, 13: 204, 46: 204, 206: 6452, 479: 6453, 581: 6451}, + {496: 6458, 971: 6457}, + {204, 204, 13: 204, 46: 204, 206: 6453, 479: 6454, 581: 6452}, // 3940 - {335: 6449}, - {199, 199, 13: 199, 46: 199, 206: 199, 479: 199, 581: 199, 1183: 6450}, + {335: 6450}, + {199, 199, 13: 199, 46: 199, 206: 199, 479: 199, 581: 199, 1183: 6451}, {200, 200, 13: 200, 46: 200, 206: 200, 479: 200, 581: 200}, - {508: 2705, 732: 4021, 763: 6454}, + {508: 2706, 732: 4022, 763: 6455}, {202, 202, 13: 202, 46: 202}, // 3945 {201, 201, 13: 201, 46: 201}, - {104: 6455}, + {104: 6456}, {203, 203, 13: 203, 46: 203}, {206, 206, 13: 206, 46: 206}, {205, 205, 13: 205, 46: 205}, // 3950 {207, 207, 13: 207, 46: 207}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6460, 2731, 2732, 2730}, - {499: 6461}, - {475: 6462}, - {1943, 1943, 15: 1943, 48: 1943, 50: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 138: 6465, 472: 1943, 507: 6464, 652: 1943, 1040: 6463}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6461, 2732, 2733, 2731}, + {499: 6462}, + {475: 6463}, + {1943, 1943, 15: 1943, 48: 1943, 50: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 138: 6466, 472: 1943, 507: 6465, 652: 1943, 1040: 6464}, // 3955 - {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6470}, + {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6471}, {1942, 1942, 15: 1942, 48: 1942, 50: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 472: 1942, 652: 1942}, - {199: 6468, 391: 6469, 642: 6467, 650: 6466}, + {199: 6469, 391: 6470, 642: 6468, 650: 6467}, {1941, 1941, 15: 1941, 48: 1941, 50: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 472: 1941, 652: 1941}, {1940, 1940, 15: 1940, 48: 1940, 50: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 472: 1940, 652: 1940}, // 3960 {1939, 1939, 15: 1939, 48: 1939, 50: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 472: 1939, 652: 1939}, {1938, 1938, 15: 1938, 48: 1938, 50: 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 472: 1938, 652: 1938}, - {1955, 1955, 15: 6185, 48: 6161, 50: 6181, 6174, 6164, 6160, 6168, 6172, 6184, 6167, 6173, 6171, 6169, 6182, 6175, 6163, 6183, 6162, 6165, 6166, 6170, 472: 6176, 652: 6186, 892: 6178, 6177, 6180, 6159, 897: 6179}, + {1955, 1955, 15: 6186, 48: 6162, 50: 6182, 6175, 6165, 6161, 6169, 6173, 6185, 6168, 6174, 6172, 6170, 6183, 6176, 6164, 6184, 6163, 6166, 6167, 6171, 472: 6177, 652: 6187, 892: 6179, 6178, 6181, 6160, 897: 6180}, {16: 2084, 81: 2084, 99: 2084, 140: 2084, 667: 2084}, - {99: 2079, 140: 6521, 667: 2079, 1329: 6520}, + {99: 2079, 140: 6522, 667: 2079, 1329: 6521}, // 3965 - {498: 6516}, - {160: 6475}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6476}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4951, 2731, 2732, 2730, 884: 6477}, - {86: 6481, 88: 6486, 6488, 6482, 6487, 6490, 6484, 6480, 6485, 6489, 6483, 872: 6478, 1101: 6479}, + {498: 6517}, + {160: 6476}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6477}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4952, 2732, 2733, 2731, 884: 6478}, + {86: 6482, 88: 6487, 6489, 6483, 6488, 6491, 6485, 6481, 6486, 6490, 6484, 872: 6479, 1101: 6480}, // 3970 {2502, 2502, 7: 2502, 86: 2502, 88: 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502, 2502}, - {52, 52, 7: 6514, 86: 6481, 88: 6486, 6488, 6482, 6487, 6490, 6484, 6480, 6485, 6489, 6483, 872: 6513}, - {475: 2037, 498: 4246, 735: 6511}, - {475: 2037, 498: 4246, 735: 6509}, - {498: 4246, 508: 2037, 735: 6507}, + {52, 52, 7: 6515, 86: 6482, 88: 6487, 6489, 6483, 6488, 6491, 6485, 6481, 6486, 6490, 6484, 872: 6514}, + {475: 2037, 498: 4247, 735: 6512}, + {475: 2037, 498: 4247, 735: 6510}, + {498: 4247, 508: 2037, 735: 6508}, // 3975 - {498: 4246, 508: 2037, 735: 6505}, - {498: 4246, 508: 2037, 735: 6503}, - {475: 2037, 498: 4246, 735: 6501}, - {475: 2037, 498: 4246, 735: 6499}, - {475: 2037, 498: 4246, 735: 6497}, + {498: 4247, 508: 2037, 735: 6506}, + {498: 4247, 508: 2037, 735: 6504}, + {475: 2037, 498: 4247, 735: 6502}, + {475: 2037, 498: 4247, 735: 6500}, + {475: 2037, 498: 4247, 735: 6498}, // 3980 - {475: 2037, 498: 4246, 735: 6495}, - {475: 2037, 498: 4246, 735: 6493}, - {475: 2037, 498: 4246, 735: 6491}, - {475: 6492}, + {475: 2037, 498: 4247, 735: 6496}, + {475: 2037, 498: 4247, 735: 6494}, + {475: 2037, 498: 4247, 735: 6492}, + {475: 6493}, {2489, 2489, 7: 2489, 86: 2489, 88: 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489}, // 3985 - {475: 6494}, + {475: 6495}, {2490, 2490, 7: 2490, 86: 2490, 88: 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490}, - {475: 6496}, + {475: 6497}, {2491, 2491, 7: 2491, 86: 2491, 88: 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491, 2491}, - {475: 6498}, + {475: 6499}, // 3990 {2492, 2492, 7: 2492, 86: 2492, 88: 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492, 2492}, - {475: 6500}, + {475: 6501}, {2493, 2493, 7: 2493, 86: 2493, 88: 2493, 2493, 2493, 2493, 2493, 2493, 2493, 2493, 2493, 2493}, - {475: 6502}, + {475: 6503}, {2494, 2494, 7: 2494, 86: 2494, 88: 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494}, // 3995 - {508: 2705, 732: 2704, 743: 6504}, + {508: 2706, 732: 2705, 743: 6505}, {2495, 2495, 7: 2495, 86: 2495, 88: 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495, 2495}, - {508: 2705, 732: 2704, 743: 6506}, + {508: 2706, 732: 2705, 743: 6507}, {2496, 2496, 7: 2496, 86: 2496, 88: 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496, 2496}, - {508: 2705, 732: 2704, 743: 6508}, + {508: 2706, 732: 2705, 743: 6509}, // 4000 {2497, 2497, 7: 2497, 86: 2497, 88: 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497}, - {475: 6510}, + {475: 6511}, {2498, 2498, 7: 2498, 86: 2498, 88: 2498, 2498, 2498, 2498, 2498, 2498, 2498, 2498, 2498, 2498}, - {475: 6512}, + {475: 6513}, {2499, 2499, 7: 2499, 86: 2499, 88: 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499, 2499}, // 4005 {2501, 2501, 7: 2501, 86: 2501, 88: 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501}, - {86: 6481, 88: 6486, 6488, 6482, 6487, 6490, 6484, 6480, 6485, 6489, 6483, 872: 6515}, + {86: 6482, 88: 6487, 6489, 6483, 6488, 6491, 6485, 6481, 6486, 6490, 6484, 872: 6516}, {2500, 2500, 7: 2500, 86: 2500, 88: 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500}, - {357: 6518, 397: 6519, 405: 6517}, + {357: 6519, 397: 6520, 405: 6518}, {99: 2082, 140: 2082, 667: 2082}, // 4010 {99: 2081, 140: 2081, 667: 2081}, {99: 2080, 140: 2080, 667: 2080}, - {99: 2077, 667: 6525, 1332: 6524}, - {498: 6522}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 6523}, + {99: 2077, 667: 6526, 1332: 6525}, + {498: 6523}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 6524}, // 4015 {99: 2078, 667: 2078}, - {99: 6529}, - {383: 6526}, - {140: 6527, 348: 6528}, + {99: 6530}, + {383: 6527}, + {140: 6528, 348: 6529}, {99: 2076}, // 4020 {99: 2075}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6531, 1331: 6530}, - {473: 6533, 478: 2073, 1330: 6532}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6532, 1331: 6531}, + {473: 6534, 478: 2073, 1330: 6533}, {473: 2074, 478: 2074}, - {478: 6539}, + {478: 6540}, // 4025 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6535, 2731, 2732, 2730, 1185: 6534}, - {7: 6537, 47: 6536}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6536, 2732, 2733, 2731, 1185: 6535}, + {7: 6538, 47: 6537}, {7: 2071, 47: 2071}, {478: 2072}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6538, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6539, 2732, 2733, 2731}, // 4030 {7: 2070, 47: 2070}, - {473: 2559, 2558, 501: 2557, 569: 2556, 645: 2552, 708: 6543, 747: 6541, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 3848, 6542, 6540, 1195: 6544}, + {473: 2560, 2559, 501: 2558, 569: 2557, 645: 2553, 708: 6544, 747: 6542, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 3849, 6543, 6541, 1195: 6545}, {2092, 2092, 474: 2092}, {2091, 2091, 474: 2091, 480: 806, 488: 806, 806}, {2090, 2090, 474: 2090}, // 4035 - {2089, 2089, 474: 2089, 480: 805, 488: 805, 805, 493: 2697, 500: 2698, 502: 2694, 766: 3859, 3860}, - {2069, 2069, 474: 6546, 1328: 6545}, + {2089, 2089, 474: 2089, 480: 805, 488: 805, 805, 493: 2698, 500: 2699, 502: 2695, 766: 3860, 3861}, + {2069, 2069, 474: 6547, 1328: 6546}, {2086, 2086}, - {136: 6548, 316: 6547}, - {582: 6551}, + {136: 6549, 316: 6548}, + {582: 6552}, // 4040 - {582: 6549}, - {904: 6550}, + {582: 6550}, + {904: 6551}, {2067, 2067}, - {904: 6552}, + {904: 6553}, {2068, 2068}, // 4045 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5294, 2731, 2732, 2730, 814: 6554}, - {2165, 2165, 14: 2156, 16: 2156, 19: 2156, 479: 4205, 482: 2156, 504: 6558, 506: 2156, 646: 2156, 779: 6557, 791: 6556, 848: 6560, 930: 6559, 1196: 6555}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5295, 2732, 2733, 2731, 814: 6555}, + {2165, 2165, 14: 2156, 16: 2156, 19: 2156, 479: 4206, 482: 2156, 504: 6559, 506: 2156, 646: 2156, 779: 6558, 791: 6557, 848: 6561, 930: 6560, 1196: 6556}, {2174, 2174}, - {14: 3804, 16: 4164, 19: 6568, 482: 6567, 506: 3805, 646: 3803, 772: 6566, 779: 6569}, + {14: 3805, 16: 4165, 19: 6569, 482: 6568, 506: 3806, 646: 3804, 772: 6567, 779: 6570}, {2167, 2167, 14: 2167, 16: 2167, 19: 2167, 479: 2167, 482: 2167, 504: 2167, 506: 2167, 646: 2167}, // 4050 - {217: 6562}, - {2164, 2164, 14: 2156, 16: 2156, 19: 2156, 479: 4205, 482: 2156, 504: 6558, 506: 2156, 646: 2156, 779: 6557, 791: 6556, 848: 6561}, + {217: 6563}, + {2164, 2164, 14: 2156, 16: 2156, 19: 2156, 479: 4206, 482: 2156, 504: 6559, 506: 2156, 646: 2156, 779: 6558, 791: 6557, 848: 6562}, {2163, 2163, 14: 2163, 16: 2163, 19: 2163, 479: 2163, 482: 2163, 504: 2163, 506: 2163, 646: 2163}, {2162, 2162, 14: 2162, 16: 2162, 19: 2162, 479: 2162, 482: 2162, 504: 2162, 506: 2162, 646: 2162}, - {213: 6563}, + {213: 6564}, // 4055 - {508: 2705, 732: 2704, 743: 6564}, - {2475, 2475, 14: 2475, 16: 2475, 19: 2475, 178: 4927, 479: 2475, 482: 2475, 504: 2475, 506: 2475, 646: 2475, 1075: 6565}, + {508: 2706, 732: 2705, 743: 6565}, + {2475, 2475, 14: 2475, 16: 2475, 19: 2475, 178: 4928, 479: 2475, 482: 2475, 504: 2475, 506: 2475, 646: 2475, 1075: 6566}, {2166, 2166, 14: 2166, 16: 2166, 19: 2166, 479: 2166, 482: 2166, 504: 2166, 506: 2166, 646: 2166}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 543: 2037, 735: 6574}, - {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4246, 543: 2037, 735: 6572}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 543: 2037, 735: 6575}, + {2: 2037, 2037, 2037, 2037, 2037, 8: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 48: 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 2037, 475: 2037, 498: 4247, 543: 2037, 735: 6573}, // 4060 - {475: 2037, 498: 4246, 735: 6570}, + {475: 2037, 498: 4247, 735: 6571}, {2168, 2168, 14: 2168, 16: 2168, 19: 2168, 479: 2168, 482: 2168, 504: 2168, 506: 2168, 646: 2168}, - {475: 4264, 1038: 6571}, + {475: 4265, 1038: 6572}, {2169, 2169, 14: 2169, 16: 2169, 19: 2169, 479: 2169, 482: 2169, 504: 2169, 506: 2169, 646: 2169}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3457, 663: 3459, 2731, 2732, 2730, 737: 3456, 870: 6573}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3458, 663: 3460, 2732, 2733, 2731, 737: 3457, 870: 6574}, // 4065 {2170, 2170, 14: 2170, 16: 2170, 19: 2170, 479: 2170, 482: 2170, 504: 2170, 506: 2170, 646: 2170}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 543: 3729, 663: 3459, 2731, 2732, 2730, 737: 3728, 806: 6575}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 543: 3730, 663: 3460, 2732, 2733, 2731, 737: 3729, 806: 6576}, {2171, 2171, 14: 2171, 16: 2171, 19: 2171, 479: 2171, 482: 2171, 504: 2171, 506: 2171, 646: 2171}, - {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4788, 784: 6577}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6578, 2731, 2732, 2730}, + {2: 1848, 1848, 1848, 1848, 1848, 8: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 48: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 566: 4789, 784: 6578}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6579, 2732, 2733, 2731}, // 4070 - {82: 4821, 472: 1831, 481: 4820, 856: 6580, 1228: 6579}, - {472: 6581}, + {82: 4822, 472: 1831, 481: 4821, 856: 6581, 1228: 6580}, + {472: 6582}, {472: 1830}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6582}, - {473: 6583}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6583}, + {473: 6584}, // 4075 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 473: 4582, 663: 4111, 2731, 2732, 2730, 742: 4581, 826: 4580, 834: 6584}, - {7: 4591, 47: 6585}, - {1842, 1842, 4: 1842, 17: 1842, 81: 1842, 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 496: 1842, 878: 6586}, - {2185, 2185, 4: 4817, 17: 4814, 81: 4200, 4821, 4681, 4394, 4682, 87: 4393, 474: 4816, 481: 4820, 496: 4201, 854: 4818, 856: 4815, 867: 4819, 6360, 877: 4813, 881: 6359, 1062: 6587}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 473: 4583, 663: 4112, 2732, 2733, 2731, 742: 4582, 826: 4581, 834: 6585}, + {7: 4592, 47: 6586}, + {1842, 1842, 4: 1842, 17: 1842, 81: 1842, 1842, 1842, 1842, 1842, 87: 1842, 474: 1842, 481: 1842, 496: 1842, 878: 6587}, + {2185, 2185, 4: 4818, 17: 4815, 81: 4201, 4822, 4682, 4395, 4683, 87: 4394, 474: 4817, 481: 4821, 496: 4202, 854: 4819, 856: 4816, 867: 4820, 6361, 877: 4814, 881: 6360, 1062: 6588}, {2192, 2192}, // 4080 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6589, 2731, 2732, 2730}, - {473: 6590}, - {228: 4850, 236: 4852, 239: 4851, 1137: 6591}, - {47: 6592}, - {472: 6593}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6590, 2732, 2733, 2731}, + {473: 6591}, + {228: 4851, 236: 4853, 239: 4852, 1137: 6592}, + {47: 6593}, + {472: 6594}, // 4085 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6594}, - {473: 6595}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4111, 2731, 2732, 2730, 742: 4112, 807: 6596}, - {7: 4114, 47: 6597}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6595}, + {473: 6596}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4112, 2732, 2733, 2731, 742: 4113, 807: 6597}, + {7: 4115, 47: 6598}, {2194, 2194}, // 4090 {2294, 2294}, {2319, 2319}, - {2325, 2325, 474: 6602, 670: 6601}, - {151: 6609, 686: 6608}, - {317: 6604, 325: 6603}, + {2325, 2325, 474: 6603, 670: 6602}, + {151: 6610, 686: 6609}, + {317: 6605, 325: 6604}, // 4095 - {50: 6607}, - {324: 6605}, - {151: 6606}, + {50: 6608}, + {324: 6606}, + {151: 6607}, {2322, 2322}, {2323, 2323}, // 4100 {2324, 2324}, - {2321, 2321, 672: 5369, 922: 6610}, + {2321, 2321, 672: 5370, 922: 6611}, {2320, 2320}, {2327, 2327}, {2326, 2326}, // 4105 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6626, 794: 6625}, - {569: 6615}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6616}, - {490: 6618, 648: 6617}, - {899, 899, 2971, 2816, 2852, 2973, 2743, 899, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 474: 899, 586: 4975, 663: 4974, 2731, 2732, 2730, 855: 6623}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6627, 794: 6626}, + {569: 6616}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6617}, + {490: 6619, 648: 6618}, + {899, 899, 2972, 2817, 2853, 2974, 2744, 899, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 474: 899, 586: 4976, 663: 4975, 2732, 2733, 2731, 855: 6624}, // 4110 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 6619}, - {7: 4713, 648: 6620}, - {899, 899, 2971, 2816, 2852, 2973, 2743, 899, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 474: 899, 586: 4975, 663: 4974, 2731, 2732, 2730, 855: 6621}, - {2343, 2343, 7: 4977, 474: 4958, 803: 6622}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 6620}, + {7: 4714, 648: 6621}, + {899, 899, 2972, 2817, 2853, 2974, 2744, 899, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 474: 899, 586: 4976, 663: 4975, 2732, 2733, 2731, 855: 6622}, + {2343, 2343, 7: 4978, 474: 4959, 803: 6623}, {2351, 2351}, // 4115 - {2343, 2343, 7: 4977, 474: 4958, 803: 6624}, + {2343, 2343, 7: 4978, 474: 4959, 803: 6625}, {2354, 2354}, - {2346, 2346, 7: 3892, 161: 6646, 474: 2346, 650: 6645, 979: 6656}, - {1044, 1044, 7: 1044, 98: 6631, 161: 1044, 474: 1044, 490: 6628, 648: 6627, 650: 1044, 653: 6629, 668: 6630}, - {899, 899, 2971, 2816, 2852, 2973, 2743, 899, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 474: 899, 586: 4975, 663: 4974, 2731, 2732, 2730, 855: 6654}, + {2346, 2346, 7: 3893, 161: 6647, 474: 2346, 650: 6646, 979: 6657}, + {1044, 1044, 7: 1044, 98: 6632, 161: 1044, 474: 1044, 490: 6629, 648: 6628, 650: 1044, 653: 6630, 668: 6631}, + {899, 899, 2972, 2817, 2853, 2974, 2744, 899, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 474: 899, 586: 4976, 663: 4975, 2732, 2733, 2731, 855: 6655}, // 4120 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4712, 2731, 2732, 2730, 788: 6641}, - {254: 6637}, - {254: 6634}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5792, 2731, 2732, 2730, 875: 6632}, - {2343, 2343, 7: 5794, 474: 4958, 803: 6633}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4713, 2732, 2733, 2731, 788: 6642}, + {254: 6638}, + {254: 6635}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5793, 2732, 2733, 2731, 875: 6633}, + {2343, 2343, 7: 5795, 474: 4959, 803: 6634}, // 4125 {2348, 2348}, - {472: 6635}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5792, 2731, 2732, 2730, 875: 6636}, - {2349, 2349, 7: 5794}, - {472: 6638}, + {472: 6636}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5793, 2732, 2733, 2731, 875: 6637}, + {2349, 2349, 7: 5795}, + {472: 6639}, // 4130 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5792, 2731, 2732, 2730, 875: 6639}, - {2343, 2343, 7: 5794, 474: 4958, 803: 6640}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5793, 2732, 2733, 2731, 875: 6640}, + {2343, 2343, 7: 5795, 474: 4959, 803: 6641}, {2350, 2350}, - {2346, 2346, 7: 4713, 98: 6644, 161: 6646, 474: 2346, 648: 6643, 650: 6645, 979: 6642}, - {2343, 2343, 474: 4958, 803: 6653}, + {2346, 2346, 7: 4714, 98: 6645, 161: 6647, 474: 2346, 648: 6644, 650: 6646, 979: 6643}, + {2343, 2343, 474: 4959, 803: 6654}, // 4135 - {899, 899, 2971, 2816, 2852, 2973, 2743, 899, 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 474: 899, 586: 4975, 663: 4974, 2731, 2732, 2730, 855: 6651}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 5792, 2731, 2732, 2730, 875: 6649}, + {899, 899, 2972, 2817, 2853, 2974, 2744, 899, 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 474: 899, 586: 4976, 663: 4975, 2732, 2733, 2731, 855: 6652}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 5793, 2732, 2733, 2731, 875: 6650}, + {98: 6649}, {98: 6648}, - {98: 6647}, {2344, 2344, 474: 2344}, // 4140 {2345, 2345, 474: 2345}, - {2343, 2343, 7: 5794, 474: 4958, 803: 6650}, + {2343, 2343, 7: 5795, 474: 4959, 803: 6651}, {2347, 2347}, - {2343, 2343, 7: 4977, 474: 4958, 803: 6652}, + {2343, 2343, 7: 4978, 474: 4959, 803: 6653}, {2352, 2352}, // 4145 {2353, 2353}, - {2343, 2343, 7: 4977, 474: 4958, 803: 6655}, + {2343, 2343, 7: 4978, 474: 4959, 803: 6656}, {2355, 2355}, - {2343, 2343, 474: 4958, 803: 6657}, + {2343, 2343, 474: 4959, 803: 6658}, {2356, 2356}, // 4150 - {569: 6663}, - {494: 6661}, + {569: 6664}, + {494: 6662}, {569: 2358}, - {490: 6662, 569: 2359}, + {490: 6663, 569: 2359}, {569: 2357}, // 4155 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6664}, - {490: 5363, 555: 913, 648: 913, 659: 913, 858: 6665}, - {555: 6668, 648: 6667, 659: 6669, 1132: 6666}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6665}, + {490: 5364, 555: 913, 648: 913, 659: 913, 858: 6666}, + {555: 6669, 648: 6668, 659: 6670, 1132: 6667}, {2364, 2364}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6676, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6677, 2732, 2733, 2731}, // 4160 - {473: 3865, 838: 6671}, - {473: 3865, 838: 5933, 973: 6670}, - {2361, 2361, 7: 5934}, - {505: 6672}, - {473: 3865, 838: 6673}, + {473: 3866, 838: 6672}, + {473: 3866, 838: 5934, 973: 6671}, + {2361, 2361, 7: 5935}, + {505: 6673}, + {473: 3866, 838: 6674}, // 4165 - {86: 6674}, - {508: 2705, 732: 4021, 763: 6675}, + {86: 6675}, + {508: 2706, 732: 4022, 763: 6676}, {2362, 2362}, - {555: 6668, 659: 6669, 1132: 6677}, + {555: 6669, 659: 6670, 1132: 6678}, {2363, 2363}, // 4170 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6679}, - {2366, 2366, 649: 6681, 1212: 6680}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6680}, + {2366, 2366, 649: 6682, 1212: 6681}, {2367, 2367}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6682, 2731, 2732, 2730}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6683, 2732, 2733, 2731}, {2365, 2365}, // 4175 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 659: 6684, 663: 3889, 2731, 2732, 2730, 736: 6685}, - {260: 6687}, - {2369, 2369, 508: 2705, 732: 4021, 763: 6686}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 659: 6685, 663: 3890, 2732, 2733, 2731, 736: 6686}, + {260: 6688}, + {2369, 2369, 508: 2706, 732: 4022, 763: 6687}, {2368, 2368}, - {508: 2705, 732: 4021, 763: 6688}, + {508: 2706, 732: 4022, 763: 6689}, // 4180 {2370, 2370}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6700, 1147: 6699, 1317: 6698}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 6693, 1152: 6692, 1322: 6691}, - {2374, 2374, 7: 6696}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6701, 1147: 6700, 1317: 6699}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 6694, 1152: 6693, 1322: 6692}, + {2374, 2374, 7: 6697}, {2373, 2373, 7: 2373}, // 4185 - {649: 6694}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 6695}, + {649: 6695}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 6696}, {2371, 2371, 7: 2371}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 6693, 1152: 6697}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 6694, 1152: 6698}, {2372, 2372, 7: 2372}, // 4190 - {2378, 2378, 7: 6703}, + {2378, 2378, 7: 6704}, {2377, 2377, 7: 2377}, - {649: 6701}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6702}, + {649: 6702}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6703}, {2375, 2375, 7: 2375}, // 4195 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6700, 1147: 6704}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6701, 1147: 6705}, {2376, 2376, 7: 2376}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 2156, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 479: 4205, 482: 2156, 504: 6558, 506: 2156, 646: 2156, 663: 5294, 2731, 2732, 2730, 779: 6557, 791: 6556, 814: 6754, 848: 6560, 930: 6755}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 6744, 2731, 2732, 2730}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 475: 1850, 566: 4416, 570: 1850, 780: 6733}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 2156, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 479: 4206, 482: 2156, 504: 6559, 506: 2156, 646: 2156, 663: 5295, 2732, 2733, 2731, 779: 6558, 791: 6557, 814: 6755, 848: 6561, 930: 6756}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 6745, 2732, 2733, 2731}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 475: 1850, 566: 4417, 570: 1850, 780: 6734}, // 4200 - {274: 6727, 1230: 6726}, - {160: 6722}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6711}, - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 3889, 2731, 2732, 2730, 736: 6712}, - {70: 6389, 6386, 6392, 6393, 6394, 6387, 6385, 6395, 6391, 6388, 6716, 656: 6390, 911: 6715, 985: 6714, 1165: 6713}, + {274: 6728, 1230: 6727}, + {160: 6723}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6712}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 3890, 2732, 2733, 2731, 736: 6713}, + {70: 6390, 6387, 6393, 6394, 6395, 6388, 6386, 6396, 6392, 6389, 6717, 656: 6391, 911: 6716, 985: 6715, 1165: 6714}, // 4205 - {25, 25, 70: 6389, 6386, 6392, 6393, 6394, 6387, 6385, 6395, 6391, 6388, 6716, 656: 6390, 911: 6715, 985: 6721}, + {25, 25, 70: 6390, 6387, 6393, 6394, 6395, 6388, 6386, 6396, 6392, 6389, 6717, 656: 6391, 911: 6716, 985: 6722}, {24, 24, 70: 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 656: 24}, {22, 22, 70: 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 656: 22}, - {21, 21, 70: 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 474: 6718, 485: 2037, 2037, 498: 4246, 508: 2037, 656: 21, 735: 6717}, - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6720}, + {21, 21, 70: 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 474: 6719, 485: 2037, 2037, 498: 4247, 508: 2037, 656: 21, 735: 6718}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6721}, // 4210 - {485: 4024, 4025, 508: 2705, 732: 4021, 763: 4023, 812: 6719}, + {485: 4025, 4026, 508: 2706, 732: 4022, 763: 4024, 812: 6720}, {19, 19, 70: 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 656: 19}, {20, 20, 70: 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 656: 20}, {23, 23, 70: 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 656: 23}, - {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4416, 780: 6723}, + {2: 1850, 1850, 1850, 1850, 1850, 8: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 48: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 566: 4417, 780: 6724}, // 4215 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 3347, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 663: 4951, 2731, 2732, 2730, 884: 6724}, - {86: 6481, 88: 6486, 6488, 6482, 6487, 6490, 6484, 6480, 6485, 6489, 6483, 872: 6478, 1101: 6725}, - {51, 51, 7: 6514, 86: 6481, 88: 6486, 6488, 6482, 6487, 6490, 6484, 6480, 6485, 6489, 6483, 872: 6513}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 3348, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 663: 4952, 2732, 2733, 2731, 884: 6725}, + {86: 6482, 88: 6487, 6489, 6483, 6488, 6491, 6485, 6481, 6486, 6490, 6484, 872: 6479, 1101: 6726}, + {51, 51, 7: 6515, 86: 6482, 88: 6487, 6489, 6483, 6488, 6491, 6485, 6481, 6486, 6490, 6484, 872: 6514}, {237, 237}, - {400: 6728}, + {400: 6729}, // 4220 - {236, 236, 70: 6729}, - {152: 6730}, - {472: 6731}, - {202: 6732}, + {236, 236, 70: 6730}, + {152: 6731}, + {472: 6732}, + {202: 6733}, {235, 235}, // 4225 - {2: 2971, 2816, 2852, 2973, 2743, 8: 2789, 2744, 2875, 2990, 2983, 3340, 3335, 2855, 3138, 2857, 2831, 2775, 2778, 2767, 2800, 2859, 2860, 2967, 2854, 2991, 3095, 3094, 2742, 2853, 2856, 2867, 2807, 2811, 2863, 2976, 2822, 2903, 2740, 2741, 2902, 2975, 2739, 2988, 2948, 48: 3059, 2821, 2824, 3042, 3039, 3031, 3043, 3046, 3047, 3044, 3048, 3049, 3045, 3038, 3050, 3033, 3034, 3037, 3040, 3041, 3051, 3343, 2889, 2825, 3018, 3017, 3019, 3014, 3013, 3020, 3015, 3016, 2817, 2933, 3003, 3066, 3001, 3067, 3107, 3002, 3189, 3193, 3181, 3192, 3194, 3184, 3190, 3191, 3195, 3188, 2758, 2892, 2829, 3344, 3333, 2752, 3337, 2897, 2989, 2787, 3356, 3000, 3339, 3354, 3355, 3353, 3349, 2992, 2993, 2994, 2995, 2996, 2997, 2999, 2830, 3345, 2826, 2918, 2922, 2923, 2924, 2925, 2913, 2942, 2985, 2944, 2760, 2943, 2802, 2914, 3064, 2894, 2934, 2797, 2850, 3009, 2871, 2761, 2766, 2777, 2792, 3332, 3004, 2874, 2819, 2916, 2841, 2747, 2893, 2776, 2796, 3169, 3053, 3142, 2930, 2839, 6734, 2869, 2806, 3140, 2810, 2818, 2840, 3054, 2751, 2769, 3336, 2790, 2782, 2868, 3007, 3023, 2951, 2844, 3060, 3061, 3025, 2888, 3062, 2981, 3137, 3088, 3021, 2820, 2921, 3341, 2979, 2878, 2736, 2762, 2883, 2773, 2774, 2885, 2781, 2791, 2794, 3032, 2946, 3139, 2912, 2881, 2941, 2984, 2870, 3006, 3090, 2828, 3100, 3101, 3342, 2980, 3069, 3029, 3070, 2890, 2952, 2750, 3118, 3071, 3074, 2756, 3055, 3075, 3352, 2763, 2954, 3120, 3077, 2950, 2771, 3079, 2963, 2987, 2974, 2772, 3124, 3081, 3110, 2982, 2785, 3012, 3176, 3338, 2795, 2798, 2964, 3010, 3129, 3005, 3130, 2958, 3083, 3082, 3008, 3065, 2895, 3357, 3084, 3085, 2899, 2956, 3086, 3063, 2814, 2815, 2929, 3035, 2931, 3143, 3087, 2977, 2978, 2919, 2823, 2960, 3103, 3091, 2738, 3152, 2959, 3159, 3160, 3161, 3162, 3164, 3163, 3165, 3166, 3102, 2836, 2961, 3186, 3185, 2842, 2733, 2734, 3011, 3028, 2745, 3030, 3056, 2737, 2748, 2749, 3072, 3073, 2753, 2940, 2754, 2755, 2927, 3348, 3076, 2872, 2759, 2764, 2765, 3078, 3080, 2884, 3125, 2886, 2779, 2780, 2896, 2784, 2947, 3170, 2786, 3197, 2957, 2891, 2865, 3097, 2965, 2986, 2949, 2880, 3131, 2935, 2953, 2998, 2803, 2801, 2877, 2966, 2858, 3022, 2936, 2861, 2862, 3358, 2898, 3196, 2805, 2827, 3104, 3171, 2808, 2969, 2972, 3024, 3058, 3105, 3068, 2908, 2909, 2915, 3135, 3108, 3136, 3109, 3036, 3111, 2939, 2876, 3089, 2970, 2928, 3096, 3093, 3092, 3144, 2955, 3057, 2968, 3156, 3099, 2937, 2832, 2833, 3179, 3167, 2837, 2866, 2873, 2938, 3106, 2945, 3361, 2847, 3113, 3114, 3334, 3115, 3116, 3117, 3172, 3119, 3121, 3122, 3123, 2783, 2932, 3173, 2901, 3126, 2788, 3180, 3362, 3128, 3367, 3366, 3359, 3182, 3183, 3133, 3132, 2804, 3134, 3141, 2907, 2812, 2813, 3052, 2926, 3350, 3351, 3360, 2920, 2848, 2962, 2879, 2882, 3174, 3148, 3149, 3150, 3151, 3175, 3363, 3146, 3147, 2900, 3098, 3364, 3365, 3168, 3153, 3154, 3155, 3187, 3346, 475: 3458, 570: 5195, 663: 3459, 2731, 2732, 2730, 737: 5194, 776: 5212, 889: 5213, 920: 6735}, - {1702, 1702, 7: 1702, 13: 1702, 46: 1702, 142: 1702, 473: 6739, 1702, 568: 1702, 661: 1702, 1702}, - {223, 223, 7: 5215, 13: 223, 46: 223, 474: 223, 661: 5259, 958: 5258, 6736}, - {231, 231, 13: 231, 46: 231, 474: 6431, 1007: 6737}, - {210, 210, 13: 6448, 46: 6446, 951: 6447, 6445, 1099: 6444, 6738}, + {2: 2972, 2817, 2853, 2974, 2744, 8: 2790, 2745, 2876, 2991, 2984, 3341, 3336, 2856, 3139, 2858, 2832, 2776, 2779, 2768, 2801, 2860, 2861, 2968, 2855, 2992, 3096, 3095, 2743, 2854, 2857, 2868, 2808, 2812, 2864, 2977, 2823, 2904, 2741, 2742, 2903, 2976, 2740, 2989, 2949, 48: 3060, 2822, 2825, 3043, 3040, 3032, 3044, 3047, 3048, 3045, 3049, 3050, 3046, 3039, 3051, 3034, 3035, 3038, 3041, 3042, 3052, 3344, 2890, 2826, 3019, 3018, 3020, 3015, 3014, 3021, 3016, 3017, 2818, 2934, 3004, 3067, 3002, 3068, 3108, 3003, 3190, 3194, 3182, 3193, 3195, 3185, 3191, 3192, 3196, 3189, 2759, 2893, 2830, 3345, 3334, 2753, 3338, 2898, 2990, 2788, 3357, 3001, 3340, 3355, 3356, 3354, 3350, 2993, 2994, 2995, 2996, 2997, 2998, 3000, 2831, 3346, 2827, 2919, 2923, 2924, 2925, 2926, 2914, 2943, 2986, 2945, 2761, 2944, 2803, 2915, 3065, 2895, 2935, 2798, 2851, 3010, 2872, 2762, 2767, 2778, 2793, 3333, 3005, 2875, 2820, 2917, 2842, 2748, 2894, 2777, 2797, 3170, 3054, 3143, 2931, 2840, 6735, 2870, 2807, 3141, 2811, 2819, 2841, 3055, 2752, 2770, 3337, 2791, 2783, 2869, 3008, 3024, 2952, 2845, 3061, 3062, 3026, 2889, 3063, 2982, 3138, 3089, 3022, 2821, 2922, 3342, 2980, 2879, 2737, 2763, 2884, 2774, 2775, 2886, 2782, 2792, 2795, 3033, 2947, 3140, 2913, 2882, 2942, 2985, 2871, 3007, 3091, 2829, 3101, 3102, 3343, 2981, 3070, 3030, 3071, 2891, 2953, 2751, 3119, 3072, 3075, 2757, 3056, 3076, 3353, 2764, 2955, 3121, 3078, 2951, 2772, 3080, 2964, 2988, 2975, 2773, 3125, 3082, 3111, 2983, 2786, 3013, 3177, 3339, 2796, 2799, 2965, 3011, 3130, 3006, 3131, 2959, 3084, 3083, 3009, 3066, 2896, 3358, 3085, 3086, 2900, 2957, 3087, 3064, 2815, 2816, 2930, 3036, 2932, 3144, 3088, 2978, 2979, 2920, 2824, 2961, 3104, 3092, 2739, 3153, 2960, 3160, 3161, 3162, 3163, 3165, 3164, 3166, 3167, 3103, 2837, 2962, 3187, 3186, 2843, 2734, 2735, 3012, 3029, 2746, 3031, 3057, 2738, 2749, 2750, 3073, 3074, 2754, 2941, 2755, 2756, 2928, 3349, 3077, 2873, 2760, 2765, 2766, 3079, 3081, 2885, 3126, 2887, 2780, 2781, 2897, 2785, 2948, 3171, 2787, 3198, 2958, 2892, 2866, 3098, 2966, 2987, 2950, 2881, 3132, 2936, 2954, 2999, 2804, 2802, 2878, 2967, 2859, 3023, 2937, 2862, 2863, 3359, 2899, 3197, 2806, 2828, 3105, 3172, 2809, 2970, 2973, 3025, 3059, 3106, 3069, 2909, 2910, 2916, 3136, 3109, 3137, 3110, 3037, 3112, 2940, 2877, 3090, 2971, 2929, 3097, 3094, 3093, 3145, 2956, 3058, 2969, 3157, 3100, 2938, 2833, 2834, 3180, 3168, 2838, 2867, 2874, 2939, 3107, 2946, 3362, 2848, 3114, 3115, 3335, 3116, 3117, 3118, 3173, 3120, 3122, 3123, 3124, 2784, 2933, 3174, 2902, 3127, 2789, 3181, 3363, 3129, 3368, 3367, 3360, 3183, 3184, 3134, 3133, 2805, 3135, 3142, 2908, 2813, 2814, 3053, 2927, 3351, 3352, 3361, 2921, 2849, 2963, 2880, 2883, 3175, 3149, 3150, 3151, 3152, 3176, 3364, 3147, 3148, 2901, 3099, 3365, 3366, 3169, 3154, 3155, 3156, 3188, 3347, 475: 3459, 570: 5196, 663: 3460, 2732, 2733, 2731, 737: 5195, 776: 5213, 889: 5214, 920: 6736}, + {1702, 1702, 7: 1702, 13: 1702, 46: 1702, 142: 1702, 473: 6740, 1702, 568: 1702, 661: 1702, 1702}, + {223, 223, 7: 5216, 13: 223, 46: 223, 474: 223, 661: 5260, 958: 5259, 6737}, + {231, 231, 13: 231, 46: 231, 474: 6432, 1007: 6738}, + {210, 210, 13: 6449, 46: 6447, 951: 6448, 6446, 1099: 6445, 6739}, // 4230 {239, 239}, - {47: 6740}, - {142: 6741}, - {659: 6742}, - {475: 5228, 891: 6743}, + {47: 6741}, + {142: 6742}, + {659: 6743}, + {475: 5229, 891: 6744}, // 4235 {238, 238}, - {1943, 1943, 15: 1943, 48: 1943, 50: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 138: 6465, 472: 1943, 507: 6464, 652: 1943, 1040: 6745}, - {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6746}, - {1937, 1937, 15: 6185, 48: 6161, 50: 6181, 6174, 6164, 6160, 6168, 6172, 6184, 6167, 6173, 6171, 6169, 6182, 6175, 6163, 6183, 6162, 6165, 6166, 6170, 6748, 472: 6176, 652: 6186, 892: 6178, 6177, 6180, 6159, 897: 6179, 1224: 6747}, + {1943, 1943, 15: 1943, 48: 1943, 50: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 138: 6466, 472: 1943, 507: 6465, 652: 1943, 1040: 6746}, + {2000, 2000, 15: 2000, 48: 2000, 50: 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 472: 2000, 652: 2000, 896: 6747}, + {1937, 1937, 15: 6186, 48: 6162, 50: 6182, 6175, 6165, 6161, 6169, 6173, 6185, 6168, 6174, 6172, 6170, 6183, 6176, 6164, 6184, 6163, 6166, 6167, 6171, 6749, 472: 6177, 652: 6187, 892: 6179, 6178, 6181, 6160, 897: 6180, 1224: 6748}, {1952, 1952}, // 4240 - {176: 6750, 650: 6749}, - {559, 559, 569: 6132, 967: 6752}, - {559, 559, 569: 6132, 967: 6751}, + {176: 6751, 650: 6750}, + {559, 559, 569: 6133, 967: 6753}, + {559, 559, 569: 6133, 967: 6752}, {1935, 1935}, {1936, 1936}, // 4245 - {14: 1411, 16: 1411, 19: 1411, 160: 4944, 479: 1411, 482: 1411, 504: 1411, 506: 1411, 646: 1411}, - {14: 2156, 16: 2156, 19: 2156, 479: 4205, 482: 2156, 504: 6558, 506: 2156, 646: 2156, 779: 6557, 791: 6556, 848: 6560, 930: 6756}, - {2175, 2175, 14: 2156, 16: 2156, 19: 2156, 479: 4205, 482: 2156, 504: 6558, 506: 2156, 646: 2156, 779: 6557, 791: 6556, 848: 6561}, - {2176, 2176, 14: 2156, 16: 2156, 19: 2156, 479: 4205, 482: 2156, 504: 6558, 506: 2156, 646: 2156, 779: 6557, 791: 6556, 848: 6561}, - {2035, 2035, 48: 2539, 69: 2658, 71: 2518, 80: 2550, 145: 2520, 152: 2548, 2533, 155: 2517, 168: 2544, 203: 2569, 207: 2671, 210: 2513, 220: 2568, 2535, 2667, 2519, 238: 2547, 243: 2523, 248: 2545, 250: 2514, 253: 2551, 271: 2537, 275: 2536, 282: 2549, 284: 2515, 287: 2538, 298: 2528, 473: 2559, 2558, 496: 2666, 501: 2557, 504: 2567, 507: 2543, 525: 2661, 529: 2531, 567: 2542, 569: 2556, 645: 2552, 648: 2670, 652: 2516, 2660, 660: 2511, 668: 2522, 673: 2521, 678: 2566, 685: 2512, 708: 2563, 738: 2524, 747: 2565, 2553, 2554, 2555, 2564, 755: 2562, 2561, 2560, 2527, 2638, 2637, 765: 2525, 771: 2659, 773: 2619, 2630, 2649, 778: 2526, 782: 2585, 798: 2534, 805: 2573, 808: 2664, 843: 2580, 847: 2583, 852: 2662, 857: 2622, 859: 2632, 861: 2627, 2636, 2639, 2540, 929: 2592, 933: 2529, 971: 2665, 978: 2571, 980: 2572, 2575, 2576, 984: 2578, 986: 2577, 988: 2574, 990: 2579, 2581, 2582, 995: 2541, 2618, 998: 2588, 1008: 2596, 2589, 2590, 2591, 2597, 2595, 2598, 2599, 1017: 2594, 2593, 1020: 2584, 2546, 2530, 2600, 2612, 2601, 2602, 2603, 2605, 2609, 2606, 2610, 2611, 2604, 2608, 2607, 1037: 2570, 1041: 2586, 1043: 2587, 2532, 1048: 2614, 2613, 1052: 2616, 2617, 2615, 1058: 2655, 2620, 1066: 2669, 2668, 2621, 1073: 2623, 1076: 2652, 1078: 2656, 1102: 2624, 2625, 1105: 2626, 1107: 2631, 1110: 2628, 2629, 1113: 2654, 2633, 2663, 2635, 2634, 1122: 2640, 1124: 2642, 2641, 2645, 1128: 2646, 1130: 2653, 1133: 2643, 6758, 1138: 2644, 1149: 2647, 2648, 2651, 1153: 2650}, + {14: 1411, 16: 1411, 19: 1411, 160: 4945, 479: 1411, 482: 1411, 504: 1411, 506: 1411, 646: 1411}, + {14: 2156, 16: 2156, 19: 2156, 479: 4206, 482: 2156, 504: 6559, 506: 2156, 646: 2156, 779: 6558, 791: 6557, 848: 6561, 930: 6757}, + {2175, 2175, 14: 2156, 16: 2156, 19: 2156, 479: 4206, 482: 2156, 504: 6559, 506: 2156, 646: 2156, 779: 6558, 791: 6557, 848: 6562}, + {2176, 2176, 14: 2156, 16: 2156, 19: 2156, 479: 4206, 482: 2156, 504: 6559, 506: 2156, 646: 2156, 779: 6558, 791: 6557, 848: 6562}, + {2035, 2035, 48: 2540, 69: 2659, 71: 2519, 80: 2551, 145: 2521, 152: 2549, 2534, 155: 2518, 168: 2545, 203: 2570, 207: 2672, 210: 2514, 220: 2569, 2536, 2668, 2520, 238: 2548, 243: 2524, 248: 2546, 250: 2515, 253: 2552, 271: 2538, 275: 2537, 282: 2550, 284: 2516, 287: 2539, 298: 2529, 473: 2560, 2559, 496: 2667, 501: 2558, 504: 2568, 507: 2544, 525: 2662, 529: 2532, 567: 2543, 569: 2557, 645: 2553, 648: 2671, 652: 2517, 2661, 660: 2512, 668: 2523, 673: 2522, 678: 2567, 685: 2513, 708: 2564, 738: 2525, 747: 2566, 2554, 2555, 2556, 2565, 755: 2563, 2562, 2561, 2528, 2639, 2638, 765: 2526, 771: 2660, 773: 2620, 2631, 2650, 778: 2527, 782: 2586, 798: 2535, 805: 2574, 808: 2665, 843: 2581, 847: 2584, 852: 2663, 857: 2623, 859: 2633, 861: 2628, 2637, 2640, 2541, 929: 2593, 933: 2530, 971: 2666, 978: 2572, 980: 2573, 2576, 2577, 984: 2579, 986: 2578, 988: 2575, 990: 2580, 2582, 2583, 995: 2542, 2619, 998: 2589, 1008: 2597, 2590, 2591, 2592, 2598, 2596, 2599, 2600, 1017: 2595, 2594, 1020: 2585, 2547, 2531, 2601, 2613, 2602, 2603, 2604, 2606, 2610, 2607, 2611, 2612, 2605, 2609, 2608, 1037: 2571, 1041: 2587, 1043: 2588, 2533, 1048: 2615, 2614, 1052: 2617, 2618, 2616, 1058: 2656, 2621, 1066: 2670, 2669, 2622, 1073: 2624, 1076: 2653, 1078: 2657, 1102: 2625, 2626, 1105: 2627, 1107: 2632, 1110: 2629, 2630, 1113: 2655, 2634, 2664, 2636, 2635, 1122: 2641, 1124: 2643, 2642, 2646, 1128: 2647, 1130: 2654, 1133: 2644, 6759, 1138: 2645, 1149: 2648, 2649, 2652, 1153: 2651}, // 4250 {441, 441}, } @@ -11455,33 +11456,40 @@ yynewstate: } } case 5: + { + parser.yyVAL.statement = &ast.CompactTableStmt{ + Table: yyS[yypt-1].item.(*ast.TableName), + ReplicaKind: ast.CompactReplicaKindAll, + } + } + case 6: { parser.yyVAL.statement = &ast.CompactTableStmt{ Table: yyS[yypt-3].item.(*ast.TableName), ReplicaKind: ast.CompactReplicaKindTiFlash, } } - case 6: + case 7: { parser.yyVAL.item = []*ast.PlacementOption{yyS[yypt-0].item.(*ast.PlacementOption)} } - case 7: + case 8: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) } - case 8: + case 9: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) } - case 9: + case 10: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPrimaryRegion, StrValue: yyS[yypt-0].ident} } - case 10: + case 11: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionRegions, StrValue: yyS[yypt-0].ident} } - case 11: + case 12: { cnt := yyS[yypt-0].item.(uint64) if cnt == 0 { @@ -11490,41 +11498,37 @@ yynewstate: } parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerCount, UintValue: cnt} } - case 12: - { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterCount, UintValue: yyS[yypt-0].item.(uint64)} - } case 13: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerCount, UintValue: yyS[yypt-0].item.(uint64)} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterCount, UintValue: yyS[yypt-0].item.(uint64)} } case 14: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionSchedule, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerCount, UintValue: yyS[yypt-0].item.(uint64)} } case 15: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionConstraints, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionSchedule, StrValue: yyS[yypt-0].ident} } case 16: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLeaderConstraints, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionConstraints, StrValue: yyS[yypt-0].ident} } case 17: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerConstraints, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLeaderConstraints, StrValue: yyS[yypt-0].ident} } case 18: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterConstraints, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerConstraints, StrValue: yyS[yypt-0].ident} } case 19: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerConstraints, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterConstraints, StrValue: yyS[yypt-0].ident} } case 20: { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerConstraints, StrValue: yyS[yypt-0].ident} } case 21: { @@ -11540,21 +11544,25 @@ yynewstate: } case 24: { - parser.yyVAL.item = &ast.AttributesSpec{Default: true} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } case 25: { - parser.yyVAL.item = &ast.AttributesSpec{Default: false, Attributes: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.AttributesSpec{Default: true} } case 26: { - parser.yyVAL.item = &ast.StatsOptionsSpec{Default: true} + parser.yyVAL.item = &ast.AttributesSpec{Default: false, Attributes: yyS[yypt-0].ident} } case 27: { - parser.yyVAL.item = &ast.StatsOptionsSpec{Default: false, StatsOptions: yyS[yypt-0].ident} + parser.yyVAL.item = &ast.StatsOptionsSpec{Default: true} } case 28: + { + parser.yyVAL.item = &ast.StatsOptionsSpec{Default: false, StatsOptions: yyS[yypt-0].ident} + } + case 29: { if yyS[yypt-0].item != nil { parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11565,19 +11573,19 @@ yynewstate: parser.yyVAL.item = nil } } - case 29: + case 30: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRemovePartitioning, } } - case 30: + case 31: { ret := yyS[yypt-0].item.(*ast.AlterTableSpec) ret.NoWriteToBinlog = yyS[yypt-1].item.(bool) parser.yyVAL.item = ret } - case 31: + case 32: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTablePartitionAttributes, @@ -11585,7 +11593,7 @@ yynewstate: AttributesSpec: yyS[yypt-0].item.(*ast.AttributesSpec), } } - case 32: + case 33: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTablePartitionOptions, @@ -11593,22 +11601,22 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 33: + case 34: { parser.yyVAL.item = []string{} } - case 34: + case 35: { parser.yyVAL.item = yyS[yypt-0].item } - case 35: + case 36: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableOption, Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 36: + case 37: { tiflashReplicaSpec := &ast.TiFlashReplicaSpec{ Count: yyS[yypt-1].item.(uint64), @@ -11619,21 +11627,21 @@ yynewstate: TiFlashReplica: tiflashReplicaSpec, } } - case 37: + case 38: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableSetTiFlashMode, TiFlashMode: model.TiFlashModeNormal, } } - case 38: + case 39: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableSetTiFlashMode, TiFlashMode: model.TiFlashModeFast, } } - case 39: + case 40: { op := &ast.AlterTableSpec{ Tp: ast.AlterTableOption, @@ -11645,7 +11653,7 @@ yynewstate: } parser.yyVAL.item = op } - case 40: + case 41: { op := &ast.AlterTableSpec{ Tp: ast.AlterTableOption, @@ -11657,7 +11665,7 @@ yynewstate: } parser.yyVAL.item = op } - case 41: + case 42: { parser.yyVAL.item = &ast.AlterTableSpec{ IfNotExists: yyS[yypt-2].item.(bool), @@ -11666,7 +11674,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 42: + case 43: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -11686,7 +11694,7 @@ yynewstate: NewConstraints: constraints, } } - case 43: + case 44: { constraint := yyS[yypt-0].item.(*ast.Constraint) parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11694,7 +11702,7 @@ yynewstate: Constraint: constraint, } } - case 44: + case 45: { var defs []*ast.PartitionDefinition if yyS[yypt-0].item != nil { @@ -11712,7 +11720,7 @@ yynewstate: PartDefinitions: defs, } } - case 45: + case 46: { noWriteToBinlog := yyS[yypt-2].item.(bool) if noWriteToBinlog { @@ -11726,7 +11734,7 @@ yynewstate: Num: getUint64FromNUM(yyS[yypt-0].item), } } - case 46: + case 47: { statsSpec := &ast.StatisticsSpec{ StatsName: yyS[yypt-4].ident, @@ -11739,21 +11747,21 @@ yynewstate: Statistics: statsSpec, } } - case 47: + case 48: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableAttributes, AttributesSpec: yyS[yypt-0].item.(*ast.AttributesSpec), } } - case 48: + case 49: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableStatsOptions, StatsOptionsSpec: yyS[yypt-0].item.(*ast.StatsOptionsSpec), } } - case 49: + case 50: { yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) parser.lastErrorAsWarn() @@ -11767,7 +11775,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 50: + case 51: { noWriteToBinlog := yyS[yypt-1].item.(bool) if noWriteToBinlog { @@ -11780,7 +11788,7 @@ yynewstate: Num: getUint64FromNUM(yyS[yypt-0].item), } } - case 51: + case 52: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-2].item.(bool), @@ -11788,11 +11796,11 @@ yynewstate: OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), } } - case 52: + case 53: { parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} } - case 53: + case 54: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -11800,7 +11808,7 @@ yynewstate: PartitionNames: yyS[yypt-0].item.([]model.CIStr), } } - case 54: + case 55: { statsSpec := &ast.StatisticsSpec{ StatsName: yyS[yypt-0].ident, @@ -11811,7 +11819,7 @@ yynewstate: Statistics: statsSpec, } } - case 55: + case 56: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableExchangePartition, @@ -11820,7 +11828,7 @@ yynewstate: WithValidation: yyS[yypt-0].item.(bool), } } - case 56: + case 57: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableTruncatePartition, @@ -11832,7 +11840,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 57: + case 58: { ret := &ast.AlterTableSpec{ NoWriteToBinlog: yyS[yypt-1].item.(bool), @@ -11845,7 +11853,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 58: + case 59: { ret := &ast.AlterTableSpec{ NoWriteToBinlog: yyS[yypt-1].item.(bool), @@ -11858,7 +11866,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 59: + case 60: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableImportPartitionTablespace, @@ -11872,7 +11880,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 60: + case 61: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableDiscardPartitionTablespace, @@ -11886,7 +11894,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 61: + case 62: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableImportTablespace, @@ -11895,7 +11903,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 62: + case 63: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableDiscardTablespace, @@ -11904,7 +11912,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 63: + case 64: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableRebuildPartition, @@ -11917,7 +11925,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 64: + case 65: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -11925,7 +11933,7 @@ yynewstate: Name: yyS[yypt-0].ident, } } - case 65: + case 66: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -11933,26 +11941,26 @@ yynewstate: Name: yyS[yypt-0].ident, } } - case 66: + case 67: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableOrderByColumns, OrderByList: yyS[yypt-0].item.([]*ast.AlterOrderItem), } } - case 67: + case 68: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableDisableKeys, } } - case 68: + case 69: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableEnableKeys, } } - case 69: + case 70: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-2].item.(bool), @@ -11961,7 +11969,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 70: + case 71: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-3].item.(bool), @@ -11971,7 +11979,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 71: + case 72: { option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} colDef := &ast.ColumnDef{ @@ -11983,7 +11991,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 72: + case 73: { option := &ast.ColumnOption{Expr: yyS[yypt-1].expr} colDef := &ast.ColumnDef{ @@ -11995,7 +12003,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 73: + case 74: { colDef := &ast.ColumnDef{ Name: yyS[yypt-2].item.(*ast.ColumnName), @@ -12005,7 +12013,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 74: + case 75: { oldColName := &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-2].ident)} newColName := &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} @@ -12015,28 +12023,28 @@ yynewstate: NewColumnName: newColName, } } - case 75: + case 76: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 76: + case 77: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 77: + case 78: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 78: + case 79: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameIndex, @@ -12044,21 +12052,21 @@ yynewstate: ToKey: model.NewCIStr(yyS[yypt-0].ident), } } - case 79: + case 80: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableLock, LockType: yyS[yypt-0].item.(ast.LockType), } } - case 80: + case 81: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWriteable, Writeable: yyS[yypt-0].item.(bool), } } - case 81: + case 82: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -12066,28 +12074,28 @@ yynewstate: Algorithm: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 82: + case 83: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableForce, } } - case 83: + case 84: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWithValidation, } } - case 84: + case 85: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWithoutValidation, } } - case 85: + case 86: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -12096,7 +12104,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) parser.lastErrorAsWarn() } - case 86: + case 87: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -12105,7 +12113,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) parser.lastErrorAsWarn() } - case 87: + case 88: { c := &ast.Constraint{ Name: yyS[yypt-1].ident, @@ -12116,7 +12124,7 @@ yynewstate: Constraint: c, } } - case 88: + case 89: { // Parse it and ignore it. Just for compatibility. c := &ast.Constraint{ @@ -12127,7 +12135,7 @@ yynewstate: Constraint: c, } } - case 89: + case 90: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableIndexInvisible, @@ -12135,19 +12143,19 @@ yynewstate: Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 90: + case 91: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableCache, } } - case 91: + case 92: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableNoCache, } } - case 92: + case 93: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableReorganizePartition, @@ -12155,7 +12163,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 93: + case 94: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableReorganizePartition, @@ -12164,56 +12172,56 @@ yynewstate: } parser.yyVAL.item = ret } - case 94: + case 95: { parser.yyVAL.item = nil } - case 96: + case 97: { parser.yyVAL.item = true } - case 98: + case 99: { parser.yyVAL.item = true } - case 99: + case 100: { parser.yyVAL.item = false } - case 100: + case 101: { parser.yyVAL.item = model.PrimaryKeyTypeClustered } - case 101: + case 102: { parser.yyVAL.item = model.PrimaryKeyTypeNonClustered } - case 102: + case 103: { parser.yyVAL.item = ast.AlgorithmTypeDefault } - case 103: + case 104: { parser.yyVAL.item = ast.AlgorithmTypeCopy } - case 104: + case 105: { parser.yyVAL.item = ast.AlgorithmTypeInplace } - case 105: + case 106: { parser.yyVAL.item = ast.AlgorithmTypeInstant } - case 106: + case 107: { yylex.AppendError(ErrUnknownAlterAlgorithm.GenWithStackByArgs(yyS[yypt-2].ident)) return 1 } - case 107: + case 108: { parser.yyVAL.item = ast.LockTypeDefault } - case 108: + case 109: { id := strings.ToUpper(yyS[yypt-0].ident) @@ -12228,138 +12236,138 @@ yynewstate: return 1 } } - case 109: + case 110: { parser.yyVAL.item = true } - case 110: + case 111: { parser.yyVAL.item = false } - case 117: + case 118: { parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} } - case 118: + case 119: { parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} } - case 119: + case 120: { parser.yyVAL.item = &ast.ColumnPosition{ Tp: ast.ColumnPositionAfter, RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), } } - case 120: + case 121: { parser.yyVAL.item = make([]*ast.AlterTableSpec, 0, 1) } - case 122: + case 123: { parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} } - case 123: + case 124: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) } - case 124: + case 125: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 125: + case 126: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 126: + case 127: { parser.yyVAL.item = nil } - case 127: + case 128: { parser.yyVAL.item = nil } - case 128: + case 129: { parser.yyVAL.item = yyS[yypt-0].ident } - case 130: + case 131: { parser.yyVAL.statement = &ast.RenameTableStmt{ TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), } } - case 131: + case 132: { parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} } - case 132: + case 133: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) } - case 133: + case 134: { parser.yyVAL.item = &ast.TableToTable{ OldTable: yyS[yypt-2].item.(*ast.TableName), NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 134: + case 135: { parser.yyVAL.statement = &ast.RenameUserStmt{ UserToUsers: yyS[yypt-0].item.([]*ast.UserToUser), } } - case 135: + case 136: { parser.yyVAL.item = []*ast.UserToUser{yyS[yypt-0].item.(*ast.UserToUser)} } - case 136: + case 137: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserToUser), yyS[yypt-0].item.(*ast.UserToUser)) } - case 137: + case 138: { parser.yyVAL.item = &ast.UserToUser{ OldUser: yyS[yypt-2].item.(*auth.UserIdentity), NewUser: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 138: + case 139: { parser.yyVAL.statement = &ast.RecoverTableStmt{ JobID: yyS[yypt-0].item.(int64), } } - case 139: + case 140: { parser.yyVAL.statement = &ast.RecoverTableStmt{ Table: yyS[yypt-0].item.(*ast.TableName), } } - case 140: + case 141: { parser.yyVAL.statement = &ast.RecoverTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), JobNum: yyS[yypt-0].item.(int64), } } - case 141: + case 142: { parser.yyVAL.statement = &ast.FlashBackTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), NewName: yyS[yypt-0].ident, } } - case 142: + case 143: { parser.yyVAL.ident = "" } - case 143: + case 144: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 144: + case 145: { parser.yyVAL.statement = &ast.SplitRegionStmt{ SplitSyntaxOpt: yyS[yypt-4].item.(*ast.SplitSyntaxOption), @@ -12368,7 +12376,7 @@ yynewstate: SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), } } - case 145: + case 146: { parser.yyVAL.statement = &ast.SplitRegionStmt{ SplitSyntaxOpt: yyS[yypt-6].item.(*ast.SplitSyntaxOption), @@ -12378,7 +12386,7 @@ yynewstate: SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), } } - case 146: + case 147: { parser.yyVAL.item = &ast.SplitOption{ Lower: yyS[yypt-4].item.([]ast.ExprNode), @@ -12386,52 +12394,52 @@ yynewstate: Num: yyS[yypt-0].item.(int64), } } - case 147: + case 148: { parser.yyVAL.item = &ast.SplitOption{ ValueLists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 148: + case 149: { parser.yyVAL.item = &ast.SplitSyntaxOption{} } - case 149: + case 150: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasRegionFor: true, } } - case 150: + case 151: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasPartition: true, } } - case 151: + case 152: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasRegionFor: true, HasPartition: true, } } - case 152: + case 153: { 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)} } - case 153: + case 154: { 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)} } - case 154: + case 155: { 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)} } - case 155: + case 156: { 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)} } - case 156: + case 157: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12441,7 +12449,7 @@ yynewstate: AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } - case 157: + case 158: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12452,7 +12460,7 @@ yynewstate: AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } - case 158: + case 159: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12461,7 +12469,7 @@ yynewstate: HistogramOperation: ast.HistogramOperationUpdate, } } - case 159: + case 160: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, @@ -12469,7 +12477,7 @@ yynewstate: HistogramOperation: ast.HistogramOperationDrop, } } - case 160: + case 161: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, @@ -12477,7 +12485,7 @@ yynewstate: ColumnChoice: model.ColumnList, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 161: + case 162: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12486,94 +12494,90 @@ yynewstate: ColumnChoice: model.ColumnList, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 162: + case 163: { parser.yyVAL.item = model.DefaultChoice } - case 163: + case 164: { parser.yyVAL.item = model.AllColumns } - case 164: + case 165: { parser.yyVAL.item = model.PredicateColumns } - case 165: + case 166: { parser.yyVAL.item = []ast.AnalyzeOpt{} } - case 166: + case 167: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.AnalyzeOpt) } - case 167: + case 168: { parser.yyVAL.item = []ast.AnalyzeOpt{yyS[yypt-0].item.(ast.AnalyzeOpt)} } - case 168: + case 169: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.AnalyzeOpt), yyS[yypt-0].item.(ast.AnalyzeOpt)) } - case 169: + case 170: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 170: + case 171: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 171: + case 172: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: ast.NewValueExpr(yyS[yypt-2].item, "", "")} } - case 172: + case 173: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: ast.NewValueExpr(yyS[yypt-2].item, "", "")} } - case 173: + case 174: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 174: + case 175: { parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptSampleRate, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 175: + case 176: { parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} } - case 176: + case 177: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 177: + case 178: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 178: + case 179: { parser.yyVAL.item = []*ast.Assignment{} } - case 180: + case 181: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 181: + case 182: { parser.yyVAL.statement = &ast.BeginStmt{ Mode: ast.Pessimistic, } } - case 182: + case 183: { parser.yyVAL.statement = &ast.BeginStmt{ Mode: ast.Optimistic, } } - case 183: - { - parser.yyVAL.statement = &ast.BeginStmt{} - } case 184: { parser.yyVAL.statement = &ast.BeginStmt{} @@ -12583,37 +12587,41 @@ yynewstate: parser.yyVAL.statement = &ast.BeginStmt{} } case 186: + { + parser.yyVAL.statement = &ast.BeginStmt{} + } + case 187: { parser.yyVAL.statement = &ast.BeginStmt{ CausalConsistencyOnly: true, } } - case 187: + case 188: { parser.yyVAL.statement = &ast.BeginStmt{ ReadOnly: true, } } - case 188: + case 189: { parser.yyVAL.statement = &ast.BeginStmt{ ReadOnly: true, AsOf: yyS[yypt-0].item.(*ast.AsOfClause), } } - case 189: + case 190: { parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} } - case 190: + case 191: { parser.yyVAL.item = []*ast.ColumnDef{yyS[yypt-0].item.(*ast.ColumnDef)} } - case 191: + case 192: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnDef), yyS[yypt-0].item.(*ast.ColumnDef)) } - case 192: + case 193: { colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} if !colDef.Validate() { @@ -12622,7 +12630,7 @@ yynewstate: } parser.yyVAL.item = colDef } - case 193: + case 194: { // TODO: check flen 0 tp := types.NewFieldType(mysql.TypeLonglong) @@ -12636,103 +12644,103 @@ yynewstate: } parser.yyVAL.item = colDef } - case 194: + case 195: { parser.yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 195: + case 196: { parser.yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 196: + case 197: { parser.yyVAL.item = &ast.ColumnName{Schema: model.NewCIStr(yyS[yypt-4].ident), Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 197: + case 198: { parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} } - case 198: + case 199: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) } - case 199: + case 200: { parser.yyVAL.item = []*ast.ColumnName{} } - case 201: + case 202: { parser.yyVAL.item = []model.CIStr{} } - case 202: + case 203: { parser.yyVAL.item = yyS[yypt-1].item } - case 203: + case 204: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 204: + case 205: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 205: + case 206: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} } - case 207: + case 208: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)} } - case 208: + case 209: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnNameOrUserVar), yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)) } - case 209: + case 210: { parser.yyVAL.item = &ast.ColumnNameOrUserVar{ColumnName: yyS[yypt-0].item.(*ast.ColumnName)} } - case 210: + case 211: { parser.yyVAL.item = &ast.ColumnNameOrUserVar{UserVar: yyS[yypt-0].expr.(*ast.VariableExpr)} } - case 211: + case 212: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} } - case 212: + case 213: { parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar) } - case 213: + case 214: { parser.yyVAL.statement = &ast.CommitStmt{} } - case 214: + case 215: { parser.yyVAL.statement = &ast.CommitStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 218: + case 219: { parser.yyVAL.ident = "NOT" } - case 219: + case 220: { parser.yyVAL.item = true } - case 220: + case 221: { parser.yyVAL.item = false } - case 221: + case 222: { parser.yyVAL.item = true } - case 223: + case 224: { parser.yyVAL.item = 0 } - case 224: + case 225: { if yyS[yypt-0].item.(bool) { parser.yyVAL.item = 1 @@ -12740,57 +12748,57 @@ yynewstate: parser.yyVAL.item = 2 } } - case 225: + case 226: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} } - case 226: + case 227: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} } - case 227: + case 228: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} } - case 228: + case 229: { // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY // can also be specified as just KEY when given in a column definition. // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} } - case 229: + case 230: { // KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY // can also be specified as just KEY when given in a column definition. // See http://dev.mysql.com/doc/refman/5.7/en/create-table.html parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey, PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType)} } - case 230: + case 231: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} } - case 231: + case 232: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} } - case 232: + case 233: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} } - case 233: + case 234: { parser.yyVAL.item = []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} } - case 234: + case 235: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: yyS[yypt-0].expr} } - case 235: + case 236: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident, "", "")} } - case 236: + case 237: { // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html // The CHECK clause is parsed but ignored by all storage engines. @@ -12817,7 +12825,7 @@ yynewstate: default: } } - case 237: + case 238: { startOffset := parser.startOffset(&yyS[yypt-2]) endOffset := parser.endOffset(&yyS[yypt-1]) @@ -12830,56 +12838,56 @@ yynewstate: Stored: yyS[yypt-0].item.(bool), } } - case 238: + case 239: { parser.yyVAL.item = &ast.ColumnOption{ Tp: ast.ColumnOptionReference, Refer: yyS[yypt-0].item.(*ast.ReferenceDef), } } - case 239: + case 240: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: yyS[yypt-0].ident} } - case 240: + case 241: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: yyS[yypt-0].ident} } - case 241: + case 242: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionStorage, StrValue: yyS[yypt-0].ident} yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 242: + case 243: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoRandom, AutoRandomBitLength: yyS[yypt-0].item.(int)} } - case 246: + case 247: { parser.yyVAL.ident = "DEFAULT" } - case 247: + case 248: { parser.yyVAL.ident = "FIXED" } - case 248: + case 249: { parser.yyVAL.ident = "DYNAMIC" } - case 251: + case 252: { parser.yyVAL.item = false } - case 252: + case 253: { parser.yyVAL.item = false } - case 253: + case 254: { parser.yyVAL.item = true } - case 254: + case 255: { if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { parser.yyVAL.item = []*ast.ColumnOption{columnOption} @@ -12887,7 +12895,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-0].item } } - case 255: + case 256: { if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), columnOption) @@ -12895,11 +12903,11 @@ yynewstate: parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.([]*ast.ColumnOption)...) } } - case 256: + case 257: { parser.yyVAL.item = []*ast.ColumnOption{} } - case 258: + case 259: { c := &ast.Constraint{ Tp: ast.ConstraintPrimaryKey, @@ -12918,7 +12926,7 @@ yynewstate: } parser.yyVAL.item = c } - case 259: + case 260: { c := &ast.Constraint{ Tp: ast.ConstraintFulltext, @@ -12931,7 +12939,7 @@ yynewstate: } parser.yyVAL.item = c } - case 260: + case 261: { c := &ast.Constraint{ IfNotExists: yyS[yypt-5].item.(bool), @@ -12951,7 +12959,7 @@ yynewstate: } parser.yyVAL.item = c } - case 261: + case 262: { c := &ast.Constraint{ Tp: ast.ConstraintUniq, @@ -12971,7 +12979,7 @@ yynewstate: } parser.yyVAL.item = c } - case 262: + case 263: { parser.yyVAL.item = &ast.Constraint{ IfNotExists: yyS[yypt-5].item.(bool), @@ -12982,7 +12990,7 @@ yynewstate: IsEmptyIndex: yyS[yypt-4].item.(*ast.NullString).Empty, } } - case 263: + case 264: { parser.yyVAL.item = &ast.Constraint{ Tp: ast.ConstraintCheck, @@ -12990,29 +12998,29 @@ yynewstate: Enforced: yyS[yypt-0].item.(bool), } } - case 264: + case 265: { parser.yyVAL.item = ast.MatchFull } - case 265: + case 266: { parser.yyVAL.item = ast.MatchPartial } - case 266: + case 267: { parser.yyVAL.item = ast.MatchSimple } - case 267: + case 268: { parser.yyVAL.item = ast.MatchNone } - case 268: + case 269: { parser.yyVAL.item = yyS[yypt-0].item yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 269: + case 270: { onDeleteUpdate := yyS[yypt-0].item.([2]interface{}) parser.yyVAL.item = &ast.ReferenceDef{ @@ -13023,90 +13031,90 @@ yynewstate: Match: yyS[yypt-1].item.(ast.MatchType), } } - case 270: + case 271: { parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} } - case 271: + case 272: { parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} } - case 272: + case 273: { parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} } - case 273: + case 274: { parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, &ast.OnUpdateOpt{}} } - case 274: + case 275: { parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, yyS[yypt-0].item} } - case 275: + case 276: { parser.yyVAL.item = [2]interface{}{yyS[yypt-1].item, yyS[yypt-0].item} } - case 276: + case 277: { parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, yyS[yypt-1].item} } - case 277: + case 278: { parser.yyVAL.item = ast.ReferOptionRestrict } - case 278: + case 279: { parser.yyVAL.item = ast.ReferOptionCascade } - case 279: + case 280: { parser.yyVAL.item = ast.ReferOptionSetNull } - case 280: + case 281: { parser.yyVAL.item = ast.ReferOptionNoAction } - case 281: + case 282: { parser.yyVAL.item = ast.ReferOptionSetDefault yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 286: + case 287: { parser.yyVAL.expr = yyS[yypt-1].expr.(*ast.FuncCallExpr) } - case 287: + case 288: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-2].ident), } } - case 288: + case 289: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 289: + case 290: { parser.yyVAL.expr = yyS[yypt-1].expr.(*ast.FuncCallExpr) } - case 291: + case 292: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} } - case 292: + case 293: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} } - case 293: + case 294: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}} } - case 294: + case 295: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-0].item.(*ast.TableName), @@ -13116,7 +13124,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 295: + case 296: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -13126,39 +13134,39 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 303: + case 304: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr, parser.charset, parser.collation) } - case 304: + case 305: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} } - case 305: + case 306: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} } - case 309: + case 310: { parser.yyVAL.item = ast.StatsTypeCardinality } - case 310: + case 311: { parser.yyVAL.item = ast.StatsTypeDependency } - case 311: + case 312: { parser.yyVAL.item = ast.StatsTypeCorrelation } - case 312: + case 313: { parser.yyVAL.item = ast.BindingStatusTypeEnabled } - case 313: + case 314: { parser.yyVAL.item = ast.BindingStatusTypeDisabled } - case 314: + case 315: { parser.yyVAL.statement = &ast.CreateStatisticsStmt{ IfNotExists: yyS[yypt-9].item.(bool), @@ -13168,11 +13176,11 @@ yynewstate: Columns: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 315: + case 316: { parser.yyVAL.statement = &ast.DropStatisticsStmt{StatsName: yyS[yypt-0].ident} } - case 316: + case 317: { var indexOption *ast.IndexOption if yyS[yypt-1].item != nil { @@ -13205,80 +13213,80 @@ yynewstate: LockAlg: indexLockAndAlgorithm, } } - case 317: + case 318: { parser.yyVAL.item = ([]*ast.IndexPartSpecification)(nil) } - case 318: + case 319: { parser.yyVAL.item = yyS[yypt-1].item } - case 319: + case 320: { parser.yyVAL.item = []*ast.IndexPartSpecification{yyS[yypt-0].item.(*ast.IndexPartSpecification)} } - case 320: + case 321: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexPartSpecification), yyS[yypt-0].item.(*ast.IndexPartSpecification)) } - case 321: + case 322: { // Order is parsed but just ignored as MySQL did. parser.yyVAL.item = &ast.IndexPartSpecification{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int)} } - case 322: + case 323: { parser.yyVAL.item = &ast.IndexPartSpecification{Expr: yyS[yypt-2].expr} } - case 323: + case 324: { parser.yyVAL.item = nil } - case 324: + case 325: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-0].item.(ast.LockType), AlgorithmTp: ast.AlgorithmTypeDefault, } } - case 325: + case 326: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: ast.LockTypeDefault, AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 326: + case 327: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-1].item.(ast.LockType), AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 327: + case 328: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-0].item.(ast.LockType), AlgorithmTp: yyS[yypt-1].item.(ast.AlgorithmType), } } - case 328: + case 329: { parser.yyVAL.item = ast.IndexKeyTypeNone } - case 329: + case 330: { parser.yyVAL.item = ast.IndexKeyTypeUnique } - case 330: + case 331: { parser.yyVAL.item = ast.IndexKeyTypeSpatial } - case 331: + case 332: { parser.yyVAL.item = ast.IndexKeyTypeFullText } - case 332: + case 333: { parser.yyVAL.statement = &ast.AlterDatabaseStmt{ Name: model.NewCIStr(yyS[yypt-1].ident), @@ -13286,7 +13294,7 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 333: + case 334: { parser.yyVAL.statement = &ast.AlterDatabaseStmt{ Name: model.NewCIStr(""), @@ -13294,7 +13302,7 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 334: + case 335: { parser.yyVAL.statement = &ast.CreateDatabaseStmt{ IfNotExists: yyS[yypt-2].item.(bool), @@ -13302,19 +13310,19 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 337: + case 338: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].ident} } - case 338: + case 339: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].ident} } - case 339: + case 340: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: yyS[yypt-0].ident} } - case 340: + case 341: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.DatabaseOption{ @@ -13324,7 +13332,7 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 341: + case 342: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.DatabaseOption{ @@ -13334,7 +13342,7 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 342: + case 343: { tiflashReplicaSpec := &ast.TiFlashReplicaSpec{ Count: yyS[yypt-1].item.(uint64), @@ -13345,19 +13353,19 @@ yynewstate: TiFlashReplica: tiflashReplicaSpec, } } - case 343: + case 344: { parser.yyVAL.item = []*ast.DatabaseOption{} } - case 345: + case 346: { parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} } - case 346: + case 347: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) } - case 347: + case 348: { stmt := yyS[yypt-6].item.(*ast.CreateTableStmt) stmt.Table = yyS[yypt-7].item.(*ast.TableName) @@ -13378,7 +13386,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 348: + case 349: { tmp := &ast.CreateTableStmt{ Table: yyS[yypt-2].item.(*ast.TableName), @@ -13395,23 +13403,23 @@ yynewstate: } parser.yyVAL.statement = tmp } - case 349: + case 350: { parser.yyVAL.item = nil } - case 350: + case 351: { parser.yyVAL.item = true } - case 351: + case 352: { parser.yyVAL.item = false } - case 354: + case 355: { parser.yyVAL.item = nil } - case 355: + case 356: { method := yyS[yypt-3].item.(*ast.PartitionMethod) method.Num = yyS[yypt-2].item.(uint64) @@ -13428,7 +13436,7 @@ yynewstate: } parser.yyVAL.item = opt } - case 356: + case 357: { keyAlgorithm, _ := yyS[yypt-3].item.(*ast.PartitionKeyAlgorithm) parser.yyVAL.item = &ast.PartitionMethod{ @@ -13438,7 +13446,7 @@ yynewstate: KeyAlgorithm: keyAlgorithm, } } - case 357: + case 358: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeHash, @@ -13446,11 +13454,11 @@ yynewstate: Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 358: + case 359: { parser.yyVAL.item = nil } - case 359: + case 360: { tp := getUint64FromNUM(yyS[yypt-0].item) if tp != 1 && tp != 2 { @@ -13461,35 +13469,35 @@ yynewstate: Type: tp, } } - case 361: + case 362: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeRange, Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 362: + case 363: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeRange, ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 363: + case 364: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeList, Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 364: + case 365: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeList, ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 365: + case 366: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, @@ -13497,38 +13505,38 @@ yynewstate: Unit: yyS[yypt-0].item.(ast.TimeUnitType), } } - case 366: + case 367: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, Limit: yyS[yypt-0].item.(uint64), } } - case 367: + case 368: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, } } - case 368: + case 369: { parser.yyVAL.ident = "" } - case 370: + case 371: { parser.yyVAL.item = nil } - case 371: + case 372: { method := yyS[yypt-1].item.(*ast.PartitionMethod) method.Num = yyS[yypt-0].item.(uint64) parser.yyVAL.item = method } - case 372: + case 373: { parser.yyVAL.item = uint64(0) } - case 373: + case 374: { res := yyS[yypt-0].item.(uint64) if res == 0 { @@ -13537,11 +13545,11 @@ yynewstate: } parser.yyVAL.item = res } - case 374: + case 375: { parser.yyVAL.item = uint64(0) } - case 375: + case 376: { res := yyS[yypt-0].item.(uint64) if res == 0 { @@ -13550,23 +13558,23 @@ yynewstate: } parser.yyVAL.item = res } - case 376: + case 377: { parser.yyVAL.item = nil } - case 377: + case 378: { parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) } - case 378: + case 379: { parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} } - case 379: + case 380: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) } - case 380: + case 381: { parser.yyVAL.item = &ast.PartitionDefinition{ Name: model.NewCIStr(yyS[yypt-3].ident), @@ -13575,80 +13583,80 @@ yynewstate: Sub: yyS[yypt-0].item.([]*ast.SubPartitionDefinition), } } - case 381: + case 382: { parser.yyVAL.item = make([]*ast.SubPartitionDefinition, 0) } - case 382: + case 383: { parser.yyVAL.item = yyS[yypt-1].item } - case 383: + case 384: { parser.yyVAL.item = []*ast.SubPartitionDefinition{yyS[yypt-0].item.(*ast.SubPartitionDefinition)} } - case 384: + case 385: { list := yyS[yypt-2].item.([]*ast.SubPartitionDefinition) parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.SubPartitionDefinition)) } - case 385: + case 386: { parser.yyVAL.item = &ast.SubPartitionDefinition{ Name: model.NewCIStr(yyS[yypt-1].ident), Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 386: + case 387: { parser.yyVAL.item = make([]*ast.TableOption, 0) } - case 387: + case 388: { list := yyS[yypt-1].item.([]*ast.TableOption) parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.TableOption)) } - case 388: + case 389: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} } - case 389: + case 390: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} } - case 390: + case 391: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} } - case 391: + case 392: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: yyS[yypt-0].ident} } - case 392: + case 393: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: yyS[yypt-0].ident} } - case 393: + case 394: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: yyS[yypt-0].ident} } - case 394: + case 395: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 395: + case 396: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 396: + case 397: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: yyS[yypt-0].ident} } - case 397: + case 398: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: yyS[yypt-0].item.(uint64)} } - case 398: + case 399: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.TableOption{ @@ -13658,27 +13666,27 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 399: + case 400: { parser.yyVAL.item = &ast.PartitionDefinitionClauseNone{} } - case 400: + case 401: { parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, } } - case 401: + case 402: { parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ Exprs: yyS[yypt-1].item.([]ast.ExprNode), } } - case 402: + case 403: { parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{} } - case 403: + case 404: { exprs := yyS[yypt-1].item.([]ast.ExprNode) values := make([][]ast.ExprNode, 0, len(exprs)) @@ -13691,33 +13699,29 @@ yynewstate: } parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{Values: values} } - case 404: + case 405: { parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: false} } - case 405: + case 406: { parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: true} } - case 406: + case 407: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingError } - case 407: + case 408: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingIgnore } - case 408: + case 409: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingReplace } - case 411: - { - parser.yyVAL.item = &ast.CreateTableStmt{} - } case 412: { - parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + parser.yyVAL.item = &ast.CreateTableStmt{} } case 413: { @@ -13728,6 +13732,10 @@ yynewstate: parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } case 415: + { + parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 416: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -13740,7 +13748,7 @@ yynewstate: } parser.yyVAL.item = &ast.CreateTableStmt{Select: sel} } - case 419: + case 420: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -13753,15 +13761,15 @@ yynewstate: } parser.yyVAL.statement = sel } - case 420: + case 421: { parser.yyVAL.item = yyS[yypt-0].item } - case 421: + case 422: { parser.yyVAL.item = yyS[yypt-1].item } - case 422: + case 423: { startOffset := parser.startOffset(&yyS[yypt-1]) selStmt := yyS[yypt-1].statement.(ast.StmtNode) @@ -13786,17 +13794,13 @@ yynewstate: } parser.yyVAL.statement = x } - case 423: - { - parser.yyVAL.item = false - } case 424: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 425: { - parser.yyVAL.item = model.AlgorithmUndefined + parser.yyVAL.item = true } case 426: { @@ -13804,67 +13808,71 @@ yynewstate: } case 427: { - parser.yyVAL.item = model.AlgorithmMerge + parser.yyVAL.item = model.AlgorithmUndefined } case 428: { - parser.yyVAL.item = model.AlgorithmTemptable + parser.yyVAL.item = model.AlgorithmMerge } case 429: { - parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} + parser.yyVAL.item = model.AlgorithmTemptable } case 430: { - parser.yyVAL.item = yyS[yypt-0].item + parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } case 431: { - parser.yyVAL.item = model.SecurityDefiner + parser.yyVAL.item = yyS[yypt-0].item } case 432: { parser.yyVAL.item = model.SecurityDefiner } case 433: + { + parser.yyVAL.item = model.SecurityDefiner + } + case 434: { parser.yyVAL.item = model.SecurityInvoker } - case 435: + case 436: { parser.yyVAL.item = nil } - case 436: + case 437: { parser.yyVAL.item = yyS[yypt-1].item.([]model.CIStr) } - case 437: + case 438: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 438: + case 439: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 439: + case 440: { parser.yyVAL.item = nil } - case 440: + case 441: { parser.yyVAL.item = model.CheckOptionCascaded } - case 441: + case 442: { parser.yyVAL.item = model.CheckOptionLocal } - case 442: + case 443: { parser.yyVAL.statement = &ast.DoStmt{ Exprs: yyS[yypt-0].item.([]ast.ExprNode), } } - case 443: + case 444: { // Single Table tn := yyS[yypt-6].item.(*ast.TableName) @@ -13892,7 +13900,7 @@ yynewstate: parser.yyVAL.statement = x } - case 444: + case 445: { // Multiple Table x := &ast.DeleteStmt{ @@ -13912,7 +13920,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 445: + case 446: { // Multiple Table x := &ast.DeleteStmt{ @@ -13931,23 +13939,23 @@ yynewstate: } parser.yyVAL.statement = x } - case 448: + case 449: { d := yyS[yypt-0].statement.(*ast.DeleteStmt) d.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = d } - case 449: + case 450: { d := yyS[yypt-0].statement.(*ast.DeleteStmt) d.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = d } - case 451: + case 452: { parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 452: + case 453: { var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm if yyS[yypt-0].item != nil { @@ -13958,39 +13966,39 @@ yynewstate: } parser.yyVAL.statement = &ast.DropIndexStmt{IfExists: yyS[yypt-4].item.(bool), IndexName: yyS[yypt-3].ident, Table: yyS[yypt-1].item.(*ast.TableName), LockAlg: indexLockAndAlgorithm} } - case 453: + case 454: { parser.yyVAL.statement = &ast.DropTableStmt{IfExists: yyS[yypt-2].item.(bool), Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: false, TemporaryKeyword: yyS[yypt-4].item.(ast.TemporaryKeyword)} } - case 454: + case 455: { parser.yyVAL.item = ast.TemporaryNone } - case 455: + case 456: { parser.yyVAL.item = ast.TemporaryLocal } - case 456: + case 457: { parser.yyVAL.item = ast.TemporaryGlobal } - case 457: + case 458: { parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} } - case 458: + case 459: { parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} } - case 459: + case 460: { parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} } - case 460: + case 461: { parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} } - case 461: + case 462: { tmp := make([]*auth.UserIdentity, 0, 10) roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) @@ -13999,7 +14007,7 @@ yynewstate: } parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} } - case 462: + case 463: { tmp := make([]*auth.UserIdentity, 0, 10) roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) @@ -14008,29 +14016,29 @@ yynewstate: } parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} } - case 463: + case 464: { parser.yyVAL.statement = &ast.DropStatsStmt{Table: yyS[yypt-0].item.(*ast.TableName)} } - case 464: + case 465: { parser.yyVAL.statement = &ast.DropStatsStmt{ Table: yyS[yypt-2].item.(*ast.TableName), PartitionNames: yyS[yypt-0].item.([]model.CIStr), } } - case 465: + case 466: { parser.yyVAL.statement = &ast.DropStatsStmt{ Table: yyS[yypt-1].item.(*ast.TableName), IsGlobalStats: true, } } - case 473: + case 474: { parser.yyVAL.statement = nil } - case 474: + case 475: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14040,7 +14048,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 475: + case 476: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14050,7 +14058,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 476: + case 477: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14059,7 +14067,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 477: + case 478: { parser.yyVAL.statement = &ast.TraceStmt{ Stmt: yyS[yypt-0].statement, @@ -14069,7 +14077,7 @@ yynewstate: startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(parser.lexer.client, string(parser.src[startOffset:])) } - case 481: + case 482: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: &ast.ShowStmt{ @@ -14078,7 +14086,7 @@ yynewstate: }, } } - case 482: + case 483: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: &ast.ShowStmt{ @@ -14088,49 +14096,49 @@ yynewstate: }, } } - case 483: + case 484: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: "row", } } - case 484: + case 485: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: "row", ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 485: + case 486: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: yyS[yypt-3].ident, ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 486: + case 487: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: yyS[yypt-1].ident, } } - case 487: + case 488: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: yyS[yypt-3].ident, ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 488: + case 489: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: yyS[yypt-1].ident, } } - case 489: + case 490: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -14138,7 +14146,7 @@ yynewstate: Analyze: true, } } - case 490: + case 491: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -14146,7 +14154,7 @@ yynewstate: Analyze: true, } } - case 491: + case 492: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -14154,15 +14162,15 @@ yynewstate: Analyze: true, } } - case 499: + case 500: { parser.yyVAL.statement = &ast.SavepointStmt{Name: yyS[yypt-0].ident} } - case 500: + case 501: { parser.yyVAL.statement = &ast.ReleaseSavepointStmt{Name: yyS[yypt-0].ident} } - case 501: + case 502: { stmt := yyS[yypt-3].item.(*ast.BRIEStmt) stmt.Kind = ast.BRIEKindBackup @@ -14170,7 +14178,7 @@ yynewstate: stmt.Options = yyS[yypt-0].item.([]*ast.BRIEOption) parser.yyVAL.statement = stmt } - case 502: + case 503: { stmt := yyS[yypt-3].item.(*ast.BRIEStmt) stmt.Kind = ast.BRIEKindRestore @@ -14178,110 +14186,110 @@ yynewstate: stmt.Options = yyS[yypt-0].item.([]*ast.BRIEOption) parser.yyVAL.statement = stmt } - case 503: + case 504: { parser.yyVAL.item = &ast.BRIEStmt{} } - case 504: + case 505: { parser.yyVAL.item = &ast.BRIEStmt{Schemas: yyS[yypt-0].item.([]string)} } - case 505: + case 506: { parser.yyVAL.item = &ast.BRIEStmt{Tables: yyS[yypt-0].item.([]*ast.TableName)} } - case 506: + case 507: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 507: + case 508: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 508: + case 509: { parser.yyVAL.item = []*ast.BRIEOption{} } - case 509: + case 510: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.BRIEOption), yyS[yypt-0].item.(*ast.BRIEOption)) } - case 510: + case 511: { parser.yyVAL.item = ast.BRIEOptionConcurrency } - case 511: + case 512: { parser.yyVAL.item = ast.BRIEOptionResume } - case 512: + case 513: { parser.yyVAL.item = ast.BRIEOptionSendCreds } - case 513: + case 514: { parser.yyVAL.item = ast.BRIEOptionOnline } - case 514: + case 515: { parser.yyVAL.item = ast.BRIEOptionCheckpoint } - case 515: + case 516: { parser.yyVAL.item = ast.BRIEOptionSkipSchemaFiles } - case 516: + case 517: { parser.yyVAL.item = ast.BRIEOptionStrictFormat } - case 517: + case 518: { parser.yyVAL.item = ast.BRIEOptionCSVNotNull } - case 518: + case 519: { parser.yyVAL.item = ast.BRIEOptionCSVBackslashEscape } - case 519: + case 520: { parser.yyVAL.item = ast.BRIEOptionCSVTrimLastSeparators } - case 520: + case 521: { parser.yyVAL.item = ast.BRIEOptionTiKVImporter } - case 521: + case 522: { parser.yyVAL.item = ast.BRIEOptionCSVSeparator } - case 522: + case 523: { parser.yyVAL.item = ast.BRIEOptionCSVDelimiter } - case 523: + case 524: { parser.yyVAL.item = ast.BRIEOptionCSVNull } - case 524: + case 525: { parser.yyVAL.item = ast.BRIEOptionBackend } - case 525: + case 526: { parser.yyVAL.item = ast.BRIEOptionOnDuplicate } - case 526: + case 527: { parser.yyVAL.item = ast.BRIEOptionOnDuplicate } - case 527: + case 528: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), UintValue: yyS[yypt-0].item.(uint64), } } - case 528: + case 529: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14292,21 +14300,21 @@ yynewstate: UintValue: value, } } - case 529: + case 530: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), StrValue: yyS[yypt-0].ident, } } - case 530: + case 531: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), StrValue: strings.ToLower(yyS[yypt-0].ident), } } - case 531: + case 532: { unit, err := yyS[yypt-1].item.(ast.TimeUnitType).Duration() if err != nil { @@ -14319,35 +14327,35 @@ yynewstate: UintValue: yyS[yypt-2].item.(uint64) * uint64(unit), } } - case 532: + case 533: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionBackupTS, StrValue: yyS[yypt-0].ident, } } - case 533: + case 534: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionBackupTSO, UintValue: yyS[yypt-0].item.(uint64), } } - case 534: + case 535: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionLastBackupTS, StrValue: yyS[yypt-0].ident, } } - case 535: + case 536: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionLastBackupTSO, UintValue: yyS[yypt-0].item.(uint64), } } - case 536: + case 537: { // TODO: check overflow? parser.yyVAL.item = &ast.BRIEOption{ @@ -14355,21 +14363,21 @@ yynewstate: UintValue: yyS[yypt-3].item.(uint64) * 1048576, } } - case 537: + case 538: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionCSVHeader, UintValue: ast.BRIECSVHeaderIsColumns, } } - case 538: + case 539: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionCSVHeader, UintValue: yyS[yypt-0].item.(uint64), } } - case 539: + case 540: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14380,14 +14388,14 @@ yynewstate: UintValue: value, } } - case 540: + case 541: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionChecksum, UintValue: uint64(yyS[yypt-0].item.(ast.BRIEOptionLevel)), } } - case 541: + case 542: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14398,18 +14406,18 @@ yynewstate: UintValue: value, } } - case 542: + case 543: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionAnalyze, UintValue: uint64(yyS[yypt-0].item.(ast.BRIEOptionLevel)), } } - case 543: + case 544: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 544: + case 545: { v, rangeErrMsg := getInt64FromNUM(yyS[yypt-0].item) if len(rangeErrMsg) != 0 { @@ -14418,35 +14426,35 @@ yynewstate: } parser.yyVAL.item = v } - case 546: + case 547: { parser.yyVAL.item = yyS[yypt-0].item.(int64) != 0 } - case 547: + case 548: { parser.yyVAL.item = false } - case 548: + case 549: { parser.yyVAL.item = true } - case 549: + case 550: { parser.yyVAL.item = ast.BRIEOptionLevelOff } - case 550: + case 551: { parser.yyVAL.item = ast.BRIEOptionLevelOptional } - case 551: + case 552: { parser.yyVAL.item = ast.BRIEOptionLevelRequired } - case 552: + case 553: { parser.yyVAL.statement = &ast.PurgeImportStmt{TaskID: getUint64FromNUM(yyS[yypt-0].item)} } - case 553: + case 554: { parser.yyVAL.statement = &ast.CreateImportStmt{ IfNotExists: yyS[yypt-5].item.(bool), @@ -14456,21 +14464,21 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.BRIEOption), } } - case 554: + case 555: { parser.yyVAL.statement = &ast.StopImportStmt{ IfRunning: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 555: + case 556: { parser.yyVAL.statement = &ast.ResumeImportStmt{ IfNotRunning: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 556: + case 557: { s := &ast.AlterImportStmt{ Name: yyS[yypt-3].ident, @@ -14482,14 +14490,14 @@ yynewstate: } parser.yyVAL.statement = s } - case 557: + case 558: { parser.yyVAL.statement = &ast.DropImportStmt{ IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 558: + case 559: { parser.yyVAL.statement = &ast.ShowImportStmt{ Name: yyS[yypt-2].ident, @@ -14497,73 +14505,73 @@ yynewstate: TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 559: + case 560: { parser.yyVAL.item = false } - case 560: + case 561: { parser.yyVAL.item = true } - case 561: + case 562: { parser.yyVAL.item = false } - case 562: + case 563: { parser.yyVAL.item = true } - case 563: + case 564: { parser.yyVAL.item = false } - case 564: + case 565: { parser.yyVAL.item = true } - case 565: + case 566: { parser.yyVAL.item = ast.ErrorHandleError } - case 566: + case 567: { parser.yyVAL.item = ast.ErrorHandleReplace } - case 567: + case 568: { parser.yyVAL.item = ast.ErrorHandleSkipAll } - case 568: + case 569: { parser.yyVAL.item = ast.ErrorHandleSkipConstraint } - case 569: + case 570: { parser.yyVAL.item = ast.ErrorHandleSkipDuplicate } - case 570: + case 571: { parser.yyVAL.item = ast.ErrorHandleSkipStrict } - case 571: + case 572: { parser.yyVAL.item = nil } - case 572: + case 573: { parser.yyVAL.item = &ast.ImportTruncate{ IsErrorsOnly: false, TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 573: + case 574: { parser.yyVAL.item = &ast.ImportTruncate{ IsErrorsOnly: true, TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 574: + case 575: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -14574,19 +14582,19 @@ yynewstate: Value: yyS[yypt-0].expr, } } - case 575: + case 576: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 576: + case 577: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 577: + case 578: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 578: + case 579: { expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) if ok { @@ -14596,7 +14604,7 @@ yynewstate: parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} } } - case 579: + case 580: { parser.yyVAL.expr = &ast.MatchAgainst{ ColumnNames: yyS[yypt-6].item.([]*ast.ColumnName), @@ -14604,87 +14612,87 @@ yynewstate: Modifier: ast.FulltextSearchModifier(yyS[yypt-1].item.(int)), } } - case 580: + case 581: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} } - case 581: + case 582: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} } - case 582: + case 583: { /* 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 584: + case 585: { parser.yyVAL.expr = &ast.MaxValueExpr{} } - case 586: + case 587: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 587: + case 588: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 588: + case 589: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode | ast.FulltextSearchModifierWithQueryExpansion } - case 589: + case 590: { parser.yyVAL.item = ast.FulltextSearchModifierBooleanMode } - case 590: + case 591: { parser.yyVAL.item = ast.FulltextSearchModifierWithQueryExpansion } - case 595: + case 596: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 596: + case 597: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 597: + case 598: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 598: + case 599: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 599: + case 600: { parser.yyVAL.item = []ast.ExprNode{} } - case 601: + case 602: { parser.yyVAL.item = []ast.ExprNode{} } - case 603: + case 604: { expr := ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) parser.yyVAL.item = []ast.ExprNode{expr} } - case 604: + case 605: { parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} } - case 605: + case 606: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 606: + case 607: { 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 607: + case 608: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -14696,25 +14704,21 @@ yynewstate: } parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} } - case 609: - { - parser.yyVAL.item = opcode.GE - } case 610: { - parser.yyVAL.item = opcode.GT + parser.yyVAL.item = opcode.GE } case 611: { - parser.yyVAL.item = opcode.LE + parser.yyVAL.item = opcode.GT } case 612: { - parser.yyVAL.item = opcode.LT + parser.yyVAL.item = opcode.LE } case 613: { - parser.yyVAL.item = opcode.NE + parser.yyVAL.item = opcode.LT } case 614: { @@ -14722,51 +14726,51 @@ yynewstate: } case 615: { - parser.yyVAL.item = opcode.EQ + parser.yyVAL.item = opcode.NE } case 616: { - parser.yyVAL.item = opcode.NullEQ + parser.yyVAL.item = opcode.EQ } case 617: { - parser.yyVAL.item = true + parser.yyVAL.item = opcode.NullEQ } case 618: { - parser.yyVAL.item = false + parser.yyVAL.item = true } case 619: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 620: { - parser.yyVAL.item = false + parser.yyVAL.item = true } case 621: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 622: { - parser.yyVAL.item = false + parser.yyVAL.item = true } case 623: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 624: { - parser.yyVAL.item = false + parser.yyVAL.item = true } case 625: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 626: { - parser.yyVAL.item = false + parser.yyVAL.item = true } case 627: { @@ -14778,19 +14782,23 @@ yynewstate: } case 629: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 630: { - parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} + parser.yyVAL.item = true } case 631: + { + parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} + } + case 632: { 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 632: + case 633: { parser.yyVAL.expr = &ast.BetweenExpr{ Expr: yyS[yypt-4].expr, @@ -14799,7 +14807,7 @@ yynewstate: Not: !yyS[yypt-3].item.(bool), } } - case 633: + case 634: { escape := yyS[yypt-0].ident if len(escape) > 1 { @@ -14815,57 +14823,57 @@ yynewstate: Escape: escape[0], } } - case 634: + case 635: { parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} } - case 638: + case 639: { parser.yyVAL.ident = "\\" } - case 639: + case 640: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 640: + case 641: { parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} } - case 641: + case 642: { wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} } - case 642: + case 643: { 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 643: + case 644: { expr := yyS[yypt-1].expr asName := yyS[yypt-0].ident parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} } - case 644: + case 645: { parser.yyVAL.ident = "" } - case 647: + case 648: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 649: + case 650: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 650: + case 651: { field := yyS[yypt-0].item.(*ast.SelectField) field.Offset = parser.startOffset(&yyS[yypt]) parser.yyVAL.item = []*ast.SelectField{field} } - case 651: + case 652: { fl := yyS[yypt-2].item.([]*ast.SelectField) last := fl[len(fl)-1] @@ -14877,71 +14885,71 @@ yynewstate: newField.Offset = parser.startOffset(&yyS[yypt]) parser.yyVAL.item = append(fl, newField) } - case 652: + case 653: { parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 653: + case 654: { parser.yyVAL.item = nil } - case 654: + case 655: { parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} } - case 655: + case 656: { parser.yyVAL.item = nil } - case 657: + case 658: { parser.yyVAL.item = &ast.AsOfClause{ TsExpr: yyS[yypt-0].expr.(ast.ExprNode), } } - case 658: + case 659: { parser.yyVAL.item = false } - case 659: + case 660: { parser.yyVAL.item = true } - case 660: + case 661: { parser.yyVAL.item = false } - case 661: + case 662: { parser.yyVAL.item = true } - case 662: + case 663: { parser.yyVAL.item = false } - case 663: + case 664: { parser.yyVAL.item = true } - case 664: + case 665: { parser.yyVAL.item = &ast.NullString{ String: "", Empty: false, } } - case 665: + case 666: { parser.yyVAL.item = &ast.NullString{ String: yyS[yypt-0].ident, Empty: len(yyS[yypt-0].ident) == 0, } } - case 666: + case 667: { parser.yyVAL.item = nil } - case 667: + case 668: { // Merge the options if yyS[yypt-1].item == nil { @@ -14965,19 +14973,19 @@ yynewstate: parser.yyVAL.item = opt1 } } - case 668: + case 669: { parser.yyVAL.item = &ast.IndexOption{ KeyBlockSize: yyS[yypt-0].item.(uint64), } } - case 669: + case 670: { parser.yyVAL.item = &ast.IndexOption{ Tp: yyS[yypt-0].item.(model.IndexType), } } - case 670: + case 671: { parser.yyVAL.item = &ast.IndexOption{ ParserName: model.NewCIStr(yyS[yypt-0].ident), @@ -14985,75 +14993,75 @@ yynewstate: yylex.AppendError(yylex.Errorf("The WITH PARASER clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 671: + case 672: { parser.yyVAL.item = &ast.IndexOption{ Comment: yyS[yypt-0].ident, } } - case 672: + case 673: { parser.yyVAL.item = &ast.IndexOption{ Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 673: + case 674: { parser.yyVAL.item = &ast.IndexOption{ PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType), } } - case 674: + case 675: { parser.yyVAL.item = []interface{}{yyS[yypt-0].item, nil} } - case 675: + case 676: { parser.yyVAL.item = []interface{}{yyS[yypt-2].item, yyS[yypt-0].item} } - case 676: + case 677: { parser.yyVAL.item = []interface{}{&ast.NullString{String: yyS[yypt-2].ident, Empty: len(yyS[yypt-2].ident) == 0}, yyS[yypt-0].item} } - case 677: + case 678: { parser.yyVAL.item = nil } - case 679: + case 680: { parser.yyVAL.item = yyS[yypt-0].item } - case 680: + case 681: { parser.yyVAL.item = yyS[yypt-0].item } - case 681: + case 682: { parser.yyVAL.item = model.IndexTypeBtree } - case 682: + case 683: { parser.yyVAL.item = model.IndexTypeHash } - case 683: + case 684: { parser.yyVAL.item = model.IndexTypeRtree } - case 684: + case 685: { parser.yyVAL.item = ast.IndexVisibilityVisible } - case 685: + case 686: { parser.yyVAL.item = ast.IndexVisibilityInvisible } - case 1157: + case 1158: { parser.yyVAL.statement = &ast.CallStmt{ Procedure: yyS[yypt-0].expr.(*ast.FuncCallExpr), } } - case 1158: + case 1159: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15061,7 +15069,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1159: + case 1160: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15070,7 +15078,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1160: + case 1161: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15078,7 +15086,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1161: + case 1162: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -15087,7 +15095,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1162: + case 1163: { x := yyS[yypt-1].item.(*ast.InsertStmt) x.Priority = yyS[yypt-6].item.(mysql.PriorityEnum) @@ -15104,17 +15112,13 @@ yynewstate: x.PartitionNames = yyS[yypt-2].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1165: + case 1166: { parser.yyVAL.item = &ast.InsertStmt{ Columns: yyS[yypt-3].item.([]*ast.ColumnName), Lists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 1166: - { - parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} - } case 1167: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} @@ -15124,6 +15128,10 @@ yynewstate: parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } case 1169: + { + parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 1170: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -15136,13 +15144,9 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: sel} } - case 1170: - { - parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} - } case 1171: { - parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} } case 1172: { @@ -15153,6 +15157,10 @@ yynewstate: parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } case 1174: + { + parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} + } + case 1175: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -15165,66 +15173,66 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Select: sel} } - case 1175: + case 1176: { parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} } - case 1178: + case 1179: { parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} } - case 1179: + case 1180: { parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) } - case 1180: + case 1181: { parser.yyVAL.item = yyS[yypt-1].item } - case 1181: + case 1182: { parser.yyVAL.item = []ast.ExprNode{} } - case 1183: + case 1184: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1184: + case 1185: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1186: + case 1187: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1187: + case 1188: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr, } } - case 1188: + case 1189: { parser.yyVAL.item = []*ast.Assignment{} } - case 1189: + case 1190: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 1190: + case 1191: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 1191: + case 1192: { parser.yyVAL.item = nil } - case 1192: + case 1193: { parser.yyVAL.item = yyS[yypt-0].item } - case 1193: + case 1194: { x := yyS[yypt-0].item.(*ast.InsertStmt) x.IsReplace = true @@ -15234,31 +15242,31 @@ yynewstate: x.PartitionNames = yyS[yypt-1].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1194: + case 1195: { parser.yyVAL.expr = ast.NewValueExpr(false, parser.charset, parser.collation) } - case 1195: + case 1196: { parser.yyVAL.expr = ast.NewValueExpr(nil, parser.charset, parser.collation) } - case 1196: + case 1197: { parser.yyVAL.expr = ast.NewValueExpr(true, parser.charset, parser.collation) } - case 1197: + case 1198: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1198: + case 1199: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1199: + case 1200: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1201: + case 1202: { // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) @@ -15275,15 +15283,15 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1202: + case 1203: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1203: + case 1204: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1204: + case 1205: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -15299,7 +15307,7 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1205: + case 1206: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -15315,12 +15323,12 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1206: + case 1207: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = expr } - case 1207: + case 1208: { valExpr := yyS[yypt-1].expr.(ast.ValueExpr) strLit := valExpr.GetString() @@ -15333,31 +15341,31 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1208: + case 1209: { parser.yyVAL.item = []*ast.AlterOrderItem{yyS[yypt-0].item.(*ast.AlterOrderItem)} } - case 1209: + case 1210: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterOrderItem), yyS[yypt-0].item.(*ast.AlterOrderItem)) } - case 1210: + case 1211: { parser.yyVAL.item = &ast.AlterOrderItem{Column: yyS[yypt-1].item.(*ast.ColumnName), Desc: yyS[yypt-0].item.(bool)} } - case 1211: + case 1212: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1212: + case 1213: { parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} } - case 1213: + case 1214: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) } - case 1214: + case 1215: { expr := yyS[yypt-0].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -15369,7 +15377,7 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, NullOrder: true} } - case 1215: + case 1216: { expr := yyS[yypt-1].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -15381,55 +15389,55 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} } - case 1216: + case 1217: { parser.yyVAL.item = false } - case 1217: + case 1218: { parser.yyVAL.item = true } - case 1218: + case 1219: { parser.yyVAL.item = false // ASC by default } - case 1219: + case 1220: { parser.yyVAL.item = false } - case 1220: + case 1221: { parser.yyVAL.item = true } - case 1221: + case 1222: { parser.yyVAL.item = nil } - case 1223: + case 1224: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1224: + case 1225: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1225: + case 1226: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1226: + case 1227: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1227: + case 1228: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1228: + case 1229: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1229: + case 1230: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -15440,7 +15448,7 @@ yynewstate: }, } } - case 1230: + case 1231: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_SUB"), @@ -15451,7 +15459,7 @@ yynewstate: }, } } - case 1231: + case 1232: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -15462,44 +15470,44 @@ yynewstate: }, } } - case 1232: + case 1233: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1233: + case 1234: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1234: + case 1235: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1235: + case 1236: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1236: + case 1237: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1237: + case 1238: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1239: + case 1240: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1240: + case 1241: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1241: + case 1242: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Schema: model.NewCIStr(yyS[yypt-4].ident), @@ -15507,39 +15515,39 @@ yynewstate: Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1246: + case 1247: { parser.yyVAL.expr = &ast.SetCollationExpr{Expr: yyS[yypt-2].expr, Collate: yyS[yypt-0].ident} } - case 1249: + case 1250: { parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1252: + case 1253: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1253: + case 1254: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} } - case 1254: + case 1255: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} } - case 1255: + case 1256: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} } - case 1256: + case 1257: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} } - case 1257: + case 1258: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1259: + case 1260: { startOffset := parser.startOffset(&yyS[yypt-1]) endOffset := parser.endOffset(&yyS[yypt]) @@ -15547,23 +15555,23 @@ yynewstate: expr.SetText(parser.lexer.client, parser.src[startOffset:endOffset]) parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} } - case 1260: + case 1261: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1261: + case 1262: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1262: + case 1263: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.Exists = true parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} } - case 1263: + case 1264: { /* * ODBC escape syntax. @@ -15587,7 +15595,7 @@ yynewstate: parser.yyVAL.expr = yyS[yypt-1].expr } } - case 1264: + case 1265: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary tp := types.NewFieldType(mysql.TypeString) @@ -15600,7 +15608,7 @@ yynewstate: FunctionType: ast.CastBinaryOperator, } } - case 1265: + case 1266: { /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ tp := yyS[yypt-1].item.(*types.FieldType) @@ -15620,7 +15628,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1266: + case 1267: { x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} if yyS[yypt-3].expr != nil { @@ -15631,7 +15639,7 @@ yynewstate: } parser.yyVAL.expr = x } - case 1267: + case 1268: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert tp := yyS[yypt-1].item.(*types.FieldType) @@ -15651,7 +15659,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1268: + case 1269: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") @@ -15660,62 +15668,62 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, } } - case 1269: + case 1270: { parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} } - case 1270: + case 1271: { parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} } - case 1271: + case 1272: { 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 1272: + case 1273: { 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 1275: + case 1276: { parser.yyVAL.item = false } - case 1276: + case 1277: { parser.yyVAL.item = true } - case 1277: + case 1278: { parser.yyVAL.item = false } - case 1279: + case 1280: { parser.yyVAL.item = true } - case 1282: + case 1283: { parser.yyVAL.item = true } - case 1324: + case 1325: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1325: + case 1326: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1326: + case 1327: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} } - case 1327: + case 1328: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} } - case 1328: + case 1329: { args := []ast.ExprNode{} if yyS[yypt-0].item != nil { @@ -15723,7 +15731,7 @@ yynewstate: } parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} } - case 1329: + case 1330: { nilVal := ast.NewValueExpr(nil, parser.charset, parser.collation) args := yyS[yypt-1].item.([]ast.ExprNode) @@ -15732,7 +15740,7 @@ yynewstate: Args: append(args, nilVal), } } - case 1330: + case 1331: { charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") args := yyS[yypt-3].item.([]ast.ExprNode) @@ -15741,42 +15749,42 @@ yynewstate: Args: append(args, charset1), } } - case 1331: + case 1332: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} } - case 1332: + case 1333: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} } - case 1333: + case 1334: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} } - case 1334: + case 1335: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1335: + case 1336: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} } - case 1336: + case 1337: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1337: + case 1338: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1338: + case 1339: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1339: + case 1340: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -15787,7 +15795,7 @@ yynewstate: }, } } - case 1340: + case 1341: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -15798,7 +15806,7 @@ yynewstate: }, } } - case 1341: + case 1342: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -15809,7 +15817,7 @@ yynewstate: }, } } - case 1342: + case 1343: { timeUnit := &ast.TimeUnitExpr{Unit: yyS[yypt-3].item.(ast.TimeUnitType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -15817,7 +15825,7 @@ yynewstate: Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, } } - case 1343: + case 1344: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -15827,67 +15835,67 @@ yynewstate: }, } } - case 1344: + case 1345: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} } - case 1345: + case 1346: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1346: + case 1347: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1347: + case 1348: { 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 1348: + case 1349: { 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 1349: + case 1350: { 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 1350: + case 1351: { 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 1351: + case 1352: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1352: + case 1353: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, } } - case 1353: + case 1354: { spaceVal := ast.NewValueExpr(" ", parser.charset, parser.collation) direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-3].item.(ast.TrimDirectionType)} @@ -15896,7 +15904,7 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, spaceVal, direction}, } } - case 1354: + case 1355: { direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-4].item.(ast.TrimDirectionType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -15904,63 +15912,63 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, } } - case 1355: + case 1356: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1356: + case 1357: { 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 1357: + case 1358: { 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 1359: + case 1360: { 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 1360: + case 1361: { parser.yyVAL.item = ast.GetFormatSelectorDate } - case 1361: + case 1362: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1362: + case 1363: { parser.yyVAL.item = ast.GetFormatSelectorTime } - case 1363: + case 1364: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1368: + case 1369: { parser.yyVAL.item = ast.TrimBoth } - case 1369: + case 1370: { parser.yyVAL.item = ast.TrimLeading } - case 1370: + case 1371: { parser.yyVAL.item = ast.TrimTrailing } - case 1371: + case 1372: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -15970,7 +15978,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 1372: + case 1373: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-3].item.(*ast.TableName), @@ -15981,7 +15989,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr, valueExpr}, } } - case 1374: + case 1375: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15989,15 +15997,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 1375: + case 1376: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: false} } - case 1376: + case 1377: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1377: + case 1378: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16005,7 +16013,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1378: + case 1379: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16013,7 +16021,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1379: + case 1380: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16021,7 +16029,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1380: + case 1381: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16029,7 +16037,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1381: + case 1382: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16037,7 +16045,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1382: + case 1383: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16045,11 +16053,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1383: + case 1384: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} } - case 1384: + case 1385: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16057,7 +16065,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1385: + case 1386: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16065,7 +16073,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1386: + case 1387: { args := []ast.ExprNode{ast.NewValueExpr(1, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -16074,7 +16082,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} } } - case 1387: + case 1388: { args := yyS[yypt-4].item.([]ast.ExprNode) args = append(args, yyS[yypt-2].item.(ast.ExprNode)) @@ -16088,7 +16096,7 @@ yynewstate: parser.yyVAL.expr = agg } } - case 1388: + case 1389: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16096,7 +16104,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 1389: + case 1390: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16104,7 +16112,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 1390: + case 1391: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16112,7 +16120,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 1391: + case 1392: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16120,7 +16128,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1392: + case 1393: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16128,7 +16136,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 1393: + case 1394: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16136,11 +16144,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1394: + case 1395: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } - case 1395: + case 1396: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16148,7 +16156,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1396: + case 1397: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16156,7 +16164,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1397: + case 1398: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16164,7 +16172,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1398: + case 1399: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16172,7 +16180,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1399: + case 1400: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16180,7 +16188,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1400: + case 1401: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -16188,22 +16196,22 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1401: + case 1402: { parser.yyVAL.item = ast.NewValueExpr(",", "", "") } - case 1402: + case 1403: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1403: + case 1404: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1404: + case 1405: { var tp ast.FuncCallExprType if isInTokenMap(yyS[yypt-3].ident) { @@ -16218,159 +16226,159 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1405: + case 1406: { parser.yyVAL.item = nil } - case 1406: + case 1407: { parser.yyVAL.item = nil } - case 1407: + case 1408: { expr := ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation) parser.yyVAL.item = expr } - case 1409: + case 1410: { parser.yyVAL.item = ast.TimeUnitSecondMicrosecond } - case 1410: + case 1411: { parser.yyVAL.item = ast.TimeUnitMinuteMicrosecond } - case 1411: + case 1412: { parser.yyVAL.item = ast.TimeUnitMinuteSecond } - case 1412: + case 1413: { parser.yyVAL.item = ast.TimeUnitHourMicrosecond } - case 1413: + case 1414: { parser.yyVAL.item = ast.TimeUnitHourSecond } - case 1414: + case 1415: { parser.yyVAL.item = ast.TimeUnitHourMinute } - case 1415: + case 1416: { parser.yyVAL.item = ast.TimeUnitDayMicrosecond } - case 1416: + case 1417: { parser.yyVAL.item = ast.TimeUnitDaySecond } - case 1417: + case 1418: { parser.yyVAL.item = ast.TimeUnitDayMinute } - case 1418: + case 1419: { parser.yyVAL.item = ast.TimeUnitDayHour } - case 1419: + case 1420: { parser.yyVAL.item = ast.TimeUnitYearMonth } - case 1420: + case 1421: { parser.yyVAL.item = ast.TimeUnitMicrosecond } - case 1421: + case 1422: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1422: + case 1423: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1423: + case 1424: { parser.yyVAL.item = ast.TimeUnitHour } - case 1424: + case 1425: { parser.yyVAL.item = ast.TimeUnitDay } - case 1425: + case 1426: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1426: + case 1427: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1427: + case 1428: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1428: + case 1429: { parser.yyVAL.item = ast.TimeUnitYear } - case 1429: + case 1430: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1430: + case 1431: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1431: + case 1432: { parser.yyVAL.item = ast.TimeUnitHour } - case 1432: + case 1433: { parser.yyVAL.item = ast.TimeUnitDay } - case 1433: + case 1434: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1434: + case 1435: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1435: + case 1436: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1436: + case 1437: { parser.yyVAL.item = ast.TimeUnitYear } - case 1437: + case 1438: { parser.yyVAL.expr = nil } - case 1439: + case 1440: { parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} } - case 1440: + case 1441: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) } - case 1441: + case 1442: { parser.yyVAL.item = &ast.WhenClause{ Expr: yyS[yypt-2].expr, Result: yyS[yypt-0].expr, } } - case 1442: + case 1443: { parser.yyVAL.item = nil } - case 1443: + case 1444: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1444: + case 1445: { tp := types.NewFieldType(mysql.TypeVarString) tp.SetFlen(yyS[yypt-0].item.(int)) // TODO: Flen should be the flen of expression @@ -16382,7 +16390,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1445: + case 1446: { tp := types.NewFieldType(mysql.TypeVarString) tp.SetFlen(yyS[yypt-1].item.(int)) // TODO: Flen should be the flen of expression @@ -16405,7 +16413,7 @@ yynewstate: } parser.yyVAL.item = tp } - case 1446: + case 1447: { tp := types.NewFieldType(mysql.TypeDate) tp.SetCharset(charset.CharsetBin) @@ -16413,7 +16421,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1447: + case 1448: { tp := types.NewFieldType(mysql.TypeYear) tp.SetCharset(charset.CharsetBin) @@ -16421,7 +16429,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1448: + case 1449: { tp := types.NewFieldType(mysql.TypeDatetime) flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) @@ -16435,7 +16443,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1449: + case 1450: { fopt := yyS[yypt-0].item.(*ast.FloatOpt) tp := types.NewFieldType(mysql.TypeNewDecimal) @@ -16446,7 +16454,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1450: + case 1451: { tp := types.NewFieldType(mysql.TypeDuration) flen, _ := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) @@ -16460,7 +16468,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1451: + case 1452: { tp := types.NewFieldType(mysql.TypeLonglong) tp.SetCharset(charset.CharsetBin) @@ -16468,7 +16476,7 @@ yynewstate: tp.AddFlag(mysql.BinaryFlag) parser.yyVAL.item = tp } - case 1452: + case 1453: { tp := types.NewFieldType(mysql.TypeLonglong) tp.AddFlag(mysql.UnsignedFlag | mysql.BinaryFlag) @@ -16476,7 +16484,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1453: + case 1454: { tp := types.NewFieldType(mysql.TypeJSON) tp.AddFlag(mysql.BinaryFlag | mysql.ParseToJSONFlag) @@ -16484,7 +16492,7 @@ yynewstate: tp.SetCollate(mysql.DefaultCollationName) parser.yyVAL.item = tp } - case 1454: + case 1455: { tp := types.NewFieldType(mysql.TypeDouble) flen, decimal := mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) @@ -16495,7 +16503,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1455: + case 1456: { tp := types.NewFieldType(mysql.TypeFloat) fopt := yyS[yypt-0].item.(*ast.FloatOpt) @@ -16512,7 +16520,7 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1456: + case 1457: { var tp *types.FieldType if parser.lexer.GetSQLMode().HasRealAsFloatMode() { @@ -16528,65 +16536,65 @@ yynewstate: tp.SetCollate(charset.CollationBin) parser.yyVAL.item = tp } - case 1457: + case 1458: { parser.yyVAL.item = mysql.LowPriority } - case 1458: + case 1459: { parser.yyVAL.item = mysql.HighPriority } - case 1459: + case 1460: { parser.yyVAL.item = mysql.DelayedPriority } - case 1460: + case 1461: { parser.yyVAL.item = mysql.NoPriority } - case 1462: + case 1463: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1463: + case 1464: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1464: + case 1465: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1465: + case 1466: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1466: + case 1467: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1467: + case 1468: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-3].ident), Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1468: + case 1469: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1469: + case 1470: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1472: + case 1473: { parser.yyVAL.item = false } - case 1473: + case 1474: { parser.yyVAL.item = true } - case 1474: + case 1475: { var sqlText string var sqlVar *ast.VariableExpr @@ -16602,94 +16610,94 @@ yynewstate: SQLVar: sqlVar, } } - case 1475: + case 1476: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1476: + case 1477: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1477: + case 1478: { parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} } - case 1478: + case 1479: { parser.yyVAL.statement = &ast.ExecuteStmt{ Name: yyS[yypt-2].ident, UsingVars: yyS[yypt-0].item.([]ast.ExprNode), } } - case 1479: + case 1480: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1480: + case 1481: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1481: + case 1482: { parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} } - case 1484: + case 1485: { parser.yyVAL.statement = &ast.RollbackStmt{} } - case 1485: + case 1486: { parser.yyVAL.statement = &ast.RollbackStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 1486: + case 1487: { parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} } - case 1487: + case 1488: { parser.yyVAL.statement = &ast.RollbackStmt{SavepointName: yyS[yypt-0].ident} } - case 1488: + case 1489: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1489: + case 1490: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1490: + case 1491: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1491: + case 1492: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1492: + case 1493: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1493: + case 1494: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1494: + case 1495: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1495: + case 1496: { parser.yyVAL.statement = &ast.ShutdownStmt{} } - case 1496: + case 1497: { parser.yyVAL.statement = &ast.RestartStmt{} } - case 1497: + case 1498: { parser.yyVAL.statement = &ast.HelpStmt{Topic: yyS[yypt-0].ident} } - case 1498: + case 1499: { st := &ast.SelectStmt{ SelectStmtOpts: yyS[yypt-2].item.(*ast.SelectStmtOpts), @@ -16705,7 +16713,7 @@ yynewstate: } parser.yyVAL.item = st } - case 1499: + case 1500: { st := yyS[yypt-2].item.(*ast.SelectStmt) lastField := st.Fields.Fields[len(st.Fields.Fields)-1] @@ -16717,7 +16725,7 @@ yynewstate: st.Where = yyS[yypt-0].item.(ast.ExprNode) } } - case 1500: + case 1501: { st := yyS[yypt-6].item.(*ast.SelectStmt) st.From = yyS[yypt-4].item.(*ast.TableRefsClause) @@ -16740,11 +16748,11 @@ yynewstate: } parser.yyVAL.item = st } - case 1501: + case 1502: { parser.yyVAL.item = nil } - case 1502: + case 1503: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -16757,7 +16765,7 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1503: + case 1504: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -16768,43 +16776,43 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1504: + case 1505: { parser.yyVAL.item = ast.SampleMethodTypeNone } - case 1505: + case 1506: { parser.yyVAL.item = ast.SampleMethodTypeSystem } - case 1506: + case 1507: { parser.yyVAL.item = ast.SampleMethodTypeBernoulli } - case 1507: + case 1508: { parser.yyVAL.item = ast.SampleMethodTypeTiDBRegion } - case 1508: + case 1509: { parser.yyVAL.item = ast.SampleClauseUnitTypeDefault } - case 1509: + case 1510: { parser.yyVAL.item = ast.SampleClauseUnitTypeRow } - case 1510: + case 1511: { parser.yyVAL.item = ast.SampleClauseUnitTypePercent } - case 1511: + case 1512: { parser.yyVAL.expr = nil } - case 1512: + case 1513: { parser.yyVAL.expr = yyS[yypt-1].expr } - case 1513: + case 1514: { st := yyS[yypt-6].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -16851,7 +16859,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1514: + case 1515: { st := yyS[yypt-5].item.(*ast.SelectStmt) if yyS[yypt-4].item != nil { @@ -16871,7 +16879,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1515: + case 1516: { st := yyS[yypt-4].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -16888,7 +16896,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1516: + case 1517: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindTable, @@ -16910,7 +16918,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1517: + case 1518: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindValues, @@ -16931,13 +16939,13 @@ yynewstate: } parser.yyVAL.statement = st } - case 1518: + case 1519: { sel := yyS[yypt-0].statement.(*ast.SelectStmt) sel.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = sel } - case 1519: + case 1520: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -16953,11 +16961,11 @@ yynewstate: } parser.yyVAL.statement = sel } - case 1520: + case 1521: { parser.yyVAL.item = yyS[yypt-0].item } - case 1521: + case 1522: { ws := yyS[yypt-0].item.(*ast.WithClause) ws.IsRecursive = true @@ -16966,20 +16974,20 @@ yynewstate: } parser.yyVAL.item = ws } - case 1522: + case 1523: { ws := yyS[yypt-2].item.(*ast.WithClause) ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) parser.yyVAL.item = ws } - case 1523: + case 1524: { 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 1524: + case 1525: { cte := &ast.CommonTableExpression{} cte.Name = model.NewCIStr(yyS[yypt-3].ident) @@ -16987,37 +16995,37 @@ yynewstate: cte.Query = yyS[yypt-0].expr.(*ast.SubqueryExpr) parser.yyVAL.item = cte } - case 1526: + case 1527: { parser.yyVAL.item = nil } - case 1527: + case 1528: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) } - case 1528: + case 1529: { parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} } - case 1529: + case 1530: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) } - case 1530: + case 1531: { var spec = yyS[yypt-0].item.(ast.WindowSpec) spec.Name = yyS[yypt-2].item.(model.CIStr) parser.yyVAL.item = spec } - case 1531: + case 1532: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1532: + case 1533: { parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) } - case 1533: + case 1534: { spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(model.CIStr)} if yyS[yypt-2].item != nil { @@ -17031,117 +17039,113 @@ yynewstate: } parser.yyVAL.item = spec } - case 1534: + case 1535: { parser.yyVAL.item = model.CIStr{} } - case 1536: + case 1537: { parser.yyVAL.item = nil } - case 1537: + case 1538: { parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1538: + case 1539: { parser.yyVAL.item = nil } - case 1539: + case 1540: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1540: + case 1541: { parser.yyVAL.item = nil } - case 1541: + case 1542: { parser.yyVAL.item = &ast.FrameClause{ Type: yyS[yypt-1].item.(ast.FrameType), Extent: yyS[yypt-0].item.(ast.FrameExtent), } } - case 1542: + case 1543: { parser.yyVAL.item = ast.FrameType(ast.Rows) } - case 1543: + case 1544: { parser.yyVAL.item = ast.FrameType(ast.Ranges) } - case 1544: + case 1545: { parser.yyVAL.item = ast.FrameType(ast.Groups) } - case 1545: + case 1546: { parser.yyVAL.item = ast.FrameExtent{ Start: yyS[yypt-0].item.(ast.FrameBound), End: ast.FrameBound{Type: ast.CurrentRow}, } } - case 1547: + case 1548: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} } - case 1548: + case 1549: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1549: + case 1550: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1550: + case 1551: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1551: + case 1552: { parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} } - case 1552: + case 1553: { parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} } - case 1554: + case 1555: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} } - case 1555: + case 1556: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1556: + case 1557: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1557: + case 1558: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1558: + case 1559: { parser.yyVAL.item = nil } - case 1559: + case 1560: { spec := yyS[yypt-0].item.(ast.WindowSpec) parser.yyVAL.item = &spec } - case 1560: + case 1561: { parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) } - case 1561: + case 1562: { parser.yyVAL.item = ast.WindowSpec{Name: yyS[yypt-0].item.(model.CIStr), OnlyAlias: true} } - case 1563: - { - parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} - } case 1564: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} @@ -17160,9 +17164,13 @@ yynewstate: } case 1568: { - parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } case 1569: + { + parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} + } + case 1570: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -17170,7 +17178,7 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1570: + case 1571: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -17178,23 +17186,23 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1571: + case 1572: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: 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 1572: + case 1573: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: 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 1573: + case 1574: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: 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 1574: + case 1575: { parser.yyVAL.item = nil } - case 1575: + case 1576: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -17202,7 +17210,7 @@ yynewstate: } parser.yyVAL.item = args } - case 1576: + case 1577: { args := []ast.ExprNode{ast.NewParamMarkerExpr(yyS[yypt-1].offset)} if yyS[yypt-0].item != nil { @@ -17210,17 +17218,13 @@ yynewstate: } parser.yyVAL.item = args } - case 1577: - { - parser.yyVAL.item = nil - } case 1578: { - parser.yyVAL.item = yyS[yypt-0].expr + parser.yyVAL.item = nil } case 1579: { - parser.yyVAL.item = false + parser.yyVAL.item = yyS[yypt-0].expr } case 1580: { @@ -17228,11 +17232,11 @@ yynewstate: } case 1581: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 1582: { - parser.yyVAL.item = false + parser.yyVAL.item = true } case 1583: { @@ -17240,13 +17244,17 @@ yynewstate: } case 1584: { - parser.yyVAL.item = true + parser.yyVAL.item = false } case 1585: { - parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} + parser.yyVAL.item = true } case 1586: + { + parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} + } + case 1587: { if j, ok := yyS[yypt-0].item.(*ast.Join); ok { // if $1 is Join, use it directly @@ -17255,12 +17263,12 @@ yynewstate: parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} } } - case 1587: + case 1588: { /* 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 1589: + case 1590: { /* * ODBC escape syntax for outer join is { OJ join_table } @@ -17268,7 +17276,7 @@ yynewstate: */ parser.yyVAL.item = yyS[yypt-1].item } - case 1592: + case 1593: { tn := yyS[yypt-5].item.(*ast.TableName) tn.PartitionNames = yyS[yypt-4].item.([]model.CIStr) @@ -17281,66 +17289,66 @@ yynewstate: } parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-3].item.(model.CIStr)} } - case 1593: + case 1594: { resultNode := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query parser.yyVAL.item = &ast.TableSource{Source: resultNode, AsName: yyS[yypt-0].item.(model.CIStr)} } - case 1594: + case 1595: { j := yyS[yypt-1].item.(*ast.Join) j.ExplicitParens = true parser.yyVAL.item = yyS[yypt-1].item } - case 1595: + case 1596: { parser.yyVAL.item = []model.CIStr{} } - case 1596: + case 1597: { parser.yyVAL.item = yyS[yypt-1].item } - case 1597: + case 1598: { parser.yyVAL.item = model.CIStr{} } - case 1599: + case 1600: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1600: + case 1601: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1601: + case 1602: { parser.yyVAL.item = ast.HintUse } - case 1602: + case 1603: { parser.yyVAL.item = ast.HintIgnore } - case 1603: + case 1604: { parser.yyVAL.item = ast.HintForce } - case 1604: + case 1605: { parser.yyVAL.item = ast.HintForScan } - case 1605: + case 1606: { parser.yyVAL.item = ast.HintForJoin } - case 1606: + case 1607: { parser.yyVAL.item = ast.HintForOrderBy } - case 1607: + case 1608: { parser.yyVAL.item = ast.HintForGroupBy } - case 1608: + case 1609: { parser.yyVAL.item = &ast.IndexHint{ IndexNames: yyS[yypt-1].item.([]model.CIStr), @@ -17348,134 +17356,134 @@ yynewstate: HintScope: yyS[yypt-3].item.(ast.IndexHintScope), } } - case 1609: + case 1610: { var nameList []model.CIStr parser.yyVAL.item = nameList } - case 1610: + case 1611: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1611: + case 1612: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1612: + case 1613: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1613: + case 1614: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1614: + case 1615: { parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} } - case 1615: + case 1616: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) } - case 1616: + case 1617: { parser.yyVAL.item = []*ast.IndexHint{} } - case 1618: + case 1619: { parser.yyVAL.item = ast.NewCrossJoin(yyS[yypt-2].item.(ast.ResultSetNode), yyS[yypt-0].item.(ast.ResultSetNode)) } - case 1619: + case 1620: { 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 1620: + case 1621: { 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 1621: + case 1622: { 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 1622: + case 1623: { 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 1623: + case 1624: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} } - case 1624: + case 1625: { 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 1625: + case 1626: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} } - case 1626: + case 1627: { 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 1627: + case 1628: { parser.yyVAL.item = ast.LeftJoin } - case 1628: + case 1629: { parser.yyVAL.item = ast.RightJoin } - case 1634: + case 1635: { parser.yyVAL.item = nil } - case 1635: + case 1636: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} } - case 1636: + case 1637: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1637: + case 1638: { parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1642: + case 1643: { parser.yyVAL.item = ast.NewValueExpr(uint64(1), parser.charset, parser.collation) } - case 1644: + case 1645: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1645: + case 1646: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1646: + case 1647: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1647: + case 1648: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1648: + case 1649: { parser.yyVAL.item = nil } - case 1650: + case 1651: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.TableHints = yyS[yypt-0].item.([]*ast.TableOptimizerHint) parser.yyVAL.item = opt } - case 1651: + case 1652: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true @@ -17487,61 +17495,61 @@ yynewstate: } parser.yyVAL.item = opt } - case 1652: + case 1653: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.Priority = yyS[yypt-0].item.(mysql.PriorityEnum) parser.yyVAL.item = opt } - case 1653: + case 1654: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLSmallResult = true parser.yyVAL.item = opt } - case 1654: + case 1655: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBigResult = true parser.yyVAL.item = opt } - case 1655: + case 1656: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBufferResult = true parser.yyVAL.item = opt } - case 1656: + case 1657: { opt := &ast.SelectStmtOpts{} opt.SQLCache = yyS[yypt-0].item.(bool) parser.yyVAL.item = opt } - case 1657: + case 1658: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.CalcFoundRows = true parser.yyVAL.item = opt } - case 1658: + case 1659: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.StraightJoin = true parser.yyVAL.item = opt } - case 1659: + case 1660: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true parser.yyVAL.item = opt } - case 1661: + case 1662: { opts := yyS[yypt-1].item.(*ast.SelectStmtOpts) opt := yyS[yypt-0].item.(*ast.SelectStmtOpts) @@ -17586,7 +17594,7 @@ yynewstate: parser.yyVAL.item = opts } - case 1663: + case 1664: { hints, warns := parser.parseHint(yyS[yypt-0].ident) for _, w := range warns { @@ -17595,31 +17603,31 @@ yynewstate: } parser.yyVAL.item = hints } - case 1664: + case 1665: { parser.yyVAL.item = nil } - case 1666: + case 1667: { parser.yyVAL.item = true } - case 1667: + case 1668: { parser.yyVAL.item = false } - case 1668: + case 1669: { parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} } - case 1669: + case 1670: { parser.yyVAL.item = nil } - case 1671: + case 1672: { parser.yyVAL.item = nil } - case 1672: + case 1673: { x := &ast.SelectIntoOption{ Tp: ast.SelectIntoOutfile, @@ -17634,7 +17642,7 @@ yynewstate: parser.yyVAL.item = x } - case 1673: + case 1674: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -17644,14 +17652,14 @@ yynewstate: rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1674: + case 1675: { 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 1675: + case 1676: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -17661,7 +17669,7 @@ yynewstate: rs.SetText(parser.lexer.client, src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1676: + case 1677: { subQuery := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query isRecursive := true @@ -17684,32 +17692,32 @@ yynewstate: parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } } - case 1677: + case 1678: { parser.yyVAL.item = nil } - case 1678: + case 1679: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdate, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1679: + case 1680: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1680: + case 1681: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1681: + case 1682: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateWaitN, @@ -17717,55 +17725,55 @@ yynewstate: Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1682: + case 1683: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1683: + case 1684: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1684: + case 1685: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1685: + case 1686: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: []*ast.TableName{}, } } - case 1686: + case 1687: { parser.yyVAL.item = []*ast.TableName{} } - case 1687: + case 1688: { parser.yyVAL.item = yyS[yypt-0].item.([]*ast.TableName) } - case 1690: + case 1691: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1691: + case 1692: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1692: + case 1693: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17782,7 +17790,7 @@ yynewstate: setOpr.SelectList.Selects = append(setOpr.SelectList.Selects, st) parser.yyVAL.statement = setOpr } - case 1693: + case 1694: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17805,7 +17813,7 @@ yynewstate: setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} parser.yyVAL.statement = setOpr } - case 1694: + case 1695: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17829,7 +17837,7 @@ yynewstate: setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1695: + case 1696: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17853,7 +17861,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1696: + case 1697: { setOprList1 := yyS[yypt-4].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17878,7 +17886,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1697: + case 1698: { var setOprList []ast.Node var with *ast.WithClause @@ -17894,7 +17902,7 @@ yynewstate: setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1698: + case 1699: { var setOprList []ast.Node var with *ast.WithClause @@ -17910,7 +17918,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1699: + case 1700: { var setOprList []ast.Node var with *ast.WithClause @@ -17927,7 +17935,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1701: + case 1702: { setOprList1 := yyS[yypt-2].item.([]ast.Node) setOprList2 := yyS[yypt-0].item.([]ast.Node) @@ -17943,11 +17951,11 @@ yynewstate: } parser.yyVAL.item = append(setOprList1, setOprList2...) } - case 1702: + case 1703: { parser.yyVAL.item = []ast.Node{yyS[yypt-0].statement.(*ast.SelectStmt)} } - case 1703: + case 1704: { var setOprList []ast.Node switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -17958,7 +17966,7 @@ yynewstate: } parser.yyVAL.item = setOprList } - case 1704: + case 1705: { var tp ast.SetOprType tp = ast.Union @@ -17967,7 +17975,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1705: + case 1706: { var tp ast.SetOprType tp = ast.Except @@ -17976,7 +17984,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1706: + case 1707: { var tp ast.SetOprType tp = ast.Intersect @@ -17985,7 +17993,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1708: + case 1709: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.PumpType, @@ -17993,7 +18001,7 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1709: + case 1710: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.DrainerType, @@ -18001,19 +18009,19 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1710: + case 1711: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1711: + case 1712: { parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].ident} } - case 1712: + case 1713: { parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].ident} } - case 1713: + case 1714: { vars := yyS[yypt-0].item.([]*ast.VariableAssignment) for _, v := range vars { @@ -18021,11 +18029,11 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: vars} } - case 1714: + case 1715: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1715: + case 1716: { assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) for i := 0; i < len(assigns); i++ { @@ -18036,23 +18044,23 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} } - case 1716: + case 1717: { parser.yyVAL.statement = &ast.SetConfigStmt{Type: strings.ToLower(yyS[yypt-3].ident), Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1717: + case 1718: { parser.yyVAL.statement = &ast.SetConfigStmt{Instance: yyS[yypt-3].ident, Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1718: + case 1719: { parser.yyVAL.statement = &ast.SetSessionStatesStmt{SessionStates: yyS[yypt-0].ident} } - case 1719: + case 1720: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.SetRoleStmt) } - case 1720: + case 1721: { tmp := yyS[yypt-2].item.(*ast.SetRoleStmt) parser.yyVAL.statement = &ast.SetDefaultRoleStmt{ @@ -18061,27 +18069,27 @@ yynewstate: UserList: yyS[yypt-0].item.([]*auth.UserIdentity), } } - case 1721: + case 1722: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} } - case 1722: + case 1723: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} } - case 1723: + case 1724: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1724: + case 1725: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1726: + case 1727: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} } - case 1727: + case 1728: { if yyS[yypt-0].item != nil { parser.yyVAL.item = yyS[yypt-0].item @@ -18089,7 +18097,7 @@ yynewstate: parser.yyVAL.item = []*ast.VariableAssignment{} } } - case 1728: + case 1729: { if yyS[yypt-0].item != nil { varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) @@ -18098,28 +18106,28 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 1729: + case 1730: { 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 1730: + case 1731: { 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 1731: + case 1732: { 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 1732: + case 1733: { varAssigns := []*ast.VariableAssignment{} asof := yyS[yypt-0].item.(*ast.AsOfClause) @@ -18128,59 +18136,59 @@ yynewstate: } parser.yyVAL.item = varAssigns } - case 1733: + case 1734: { parser.yyVAL.ident = ast.RepeatableRead } - case 1734: + case 1735: { parser.yyVAL.ident = ast.ReadCommitted } - case 1735: + case 1736: { parser.yyVAL.ident = ast.ReadUncommitted } - case 1736: + case 1737: { parser.yyVAL.ident = ast.Serializable } - case 1737: + case 1738: { parser.yyVAL.expr = ast.NewValueExpr("ON", parser.charset, parser.collation) } - case 1738: + case 1739: { parser.yyVAL.expr = ast.NewValueExpr("BINARY", parser.charset, parser.collation) } - case 1743: + case 1744: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1745: + case 1746: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1746: + case 1747: { parser.yyVAL.ident = yyS[yypt-2].ident + "-" + yyS[yypt-0].ident } - case 1747: + case 1748: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1748: + case 1749: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} } - case 1749: + case 1750: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1750: + case 1751: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1751: + case 1752: { v := strings.ToLower(yyS[yypt-2].ident) var isGlobal bool @@ -18196,27 +18204,27 @@ yynewstate: } parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} } - case 1752: + case 1753: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} } - case 1753: + case 1754: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1754: + case 1755: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-2].ident, "", ""), } } - case 1755: + case 1756: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, @@ -18224,24 +18232,24 @@ yynewstate: ExtendValue: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1756: + case 1757: { v := &ast.DefaultExpr{} parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetNames, Value: v} } - case 1757: + case 1758: { parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetCharset, Value: yyS[yypt-0].expr} } - case 1758: + case 1759: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1759: + case 1760: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1760: + case 1761: { // Validate input charset name to keep the same behavior as parser of MySQL. cs, err := charset.GetCharsetInfo(yyS[yypt-0].ident) @@ -18253,11 +18261,11 @@ yynewstate: // to keep lower case of input for generated column restore. parser.yyVAL.ident = cs.Name } - case 1761: + case 1762: { parser.yyVAL.ident = charset.CharsetBin } - case 1762: + case 1763: { info, err := charset.GetCollationByName(yyS[yypt-0].ident) if err != nil { @@ -18266,19 +18274,19 @@ yynewstate: } parser.yyVAL.ident = info.Name } - case 1763: + case 1764: { parser.yyVAL.ident = charset.CollationBin } - case 1764: + case 1765: { parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} } - case 1765: + case 1766: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) } - case 1768: + case 1769: { v := strings.ToLower(yyS[yypt-0].ident) var isGlobal bool @@ -18295,77 +18303,77 @@ yynewstate: } parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} } - case 1769: + case 1770: { v := yyS[yypt-0].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} } - case 1770: + case 1771: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1771: + case 1772: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} } - case 1772: + case 1773: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} } - case 1773: + case 1774: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 1774: + case 1775: { parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} } - case 1775: + case 1776: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) } - case 1777: + case 1778: { parser.yyVAL.ident = yyS[yypt-1].ident } - case 1781: + case 1782: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].ident, Hostname: strings.ToLower(yyS[yypt-0].ident)} } - case 1782: + case 1783: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].ident, Hostname: strings.ToLower(strings.TrimPrefix(yyS[yypt-0].ident, "@"))} } - case 1783: + case 1784: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1784: + case 1785: { parser.yyVAL.item = yyS[yypt-0].item } - case 1785: + case 1786: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1786: + case 1787: { parser.yyVAL.item = yyS[yypt-0].item } - case 1787: + case 1788: { parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} } - case 1788: + case 1789: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) } - case 1789: + case 1790: { parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} } - case 1790: + case 1791: { stmt := &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} if yyS[yypt-0].item != nil { @@ -18373,7 +18381,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1791: + case 1792: { stmt := &ast.AdminStmt{ Tp: ast.AdminShowDDLJobs, @@ -18384,21 +18392,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1792: + case 1793: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowNextRowID, Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, } } - case 1793: + case 1794: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1794: + case 1795: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndex, @@ -18406,7 +18414,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1795: + case 1796: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRecoverIndex, @@ -18414,7 +18422,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1796: + case 1797: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCleanupIndex, @@ -18422,7 +18430,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1797: + case 1798: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndexRange, @@ -18431,136 +18439,136 @@ yynewstate: HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), } } - case 1798: + case 1799: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminChecksumTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1799: + case 1800: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCancelDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1800: + case 1801: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueries, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1801: + case 1802: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowSlow, ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), } } - case 1802: + case 1803: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadExprPushdownBlacklist, } } - case 1803: + case 1804: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadOptRuleBlacklist, } } - case 1804: + case 1805: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginEnable, Plugins: yyS[yypt-0].item.([]string), } } - case 1805: + case 1806: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginDisable, Plugins: yyS[yypt-0].item.([]string), } } - case 1806: + case 1807: { parser.yyVAL.statement = &ast.CleanupTableLockStmt{ Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1807: + case 1808: { parser.yyVAL.statement = &ast.RepairTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), CreateStmt: yyS[yypt-0].statement.(*ast.CreateTableStmt), } } - case 1808: + case 1809: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushBindings, } } - case 1809: + case 1810: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCaptureBindings, } } - case 1810: + case 1811: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminEvolveBindings, } } - case 1811: + case 1812: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadBindings, } } - case 1812: + case 1813: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1813: + case 1814: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1814: + case 1815: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowTelemetry, } } - case 1815: + case 1816: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminResetTelemetryID, } } - case 1816: + case 1817: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushPlanCache, StatementScope: yyS[yypt-1].item.(ast.StatementScope), } } - case 1817: + case 1818: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowRecent, Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1818: + case 1819: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18568,7 +18576,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1819: + case 1820: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18576,7 +18584,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1820: + case 1821: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18584,27 +18592,27 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1821: + case 1822: { parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} } - case 1822: + case 1823: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) } - case 1823: + case 1824: { parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} } - case 1824: + case 1825: { parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} } - case 1825: + case 1826: { parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) } - case 1826: + case 1827: { stmt := yyS[yypt-1].item.(*ast.ShowStmt) if yyS[yypt-0].item != nil { @@ -18616,21 +18624,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1827: + case 1828: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1828: + case 1829: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateView, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1829: + case 1830: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateDatabase, @@ -18638,21 +18646,21 @@ yynewstate: DBName: yyS[yypt-0].ident, } } - case 1830: + case 1831: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateSequence, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1831: + case 1832: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreatePlacementPolicy, DBName: yyS[yypt-0].ident, } } - case 1832: + case 1833: { // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html parser.yyVAL.statement = &ast.ShowStmt{ @@ -18660,14 +18668,14 @@ yynewstate: User: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 1833: + case 1834: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateImport, DBName: yyS[yypt-0].ident, // we reuse DBName of ShowStmt } } - case 1834: + case 1835: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -18679,14 +18687,14 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1835: + case 1836: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowTableNextRowId, Table: yyS[yypt-1].item.(*ast.TableName), } } - case 1836: + case 1837: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -18699,12 +18707,12 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1837: + case 1838: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} } - case 1838: + case 1839: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html if yyS[yypt-0].item != nil { @@ -18721,26 +18729,26 @@ yynewstate: } } } - case 1839: + case 1840: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowMasterStatus, } } - case 1840: + case 1841: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProcessList, Full: yyS[yypt-1].item.(bool), } } - case 1841: + case 1842: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProfiles, } } - case 1842: + case 1843: { v := &ast.ShowStmt{ Tp: ast.ShowProfile, @@ -18756,37 +18764,37 @@ yynewstate: } parser.yyVAL.statement = v } - case 1843: + case 1844: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowPrivileges, } } - case 1844: + case 1845: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowBuiltins, } } - case 1845: + case 1846: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.ShowStmt) } - case 1846: + case 1847: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForDatabase, DBName: yyS[yypt-0].ident, } } - case 1847: + case 1848: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1848: + case 1849: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForPartition, @@ -18794,90 +18802,90 @@ yynewstate: Partition: model.NewCIStr(yyS[yypt-0].ident), } } - case 1849: + case 1850: { parser.yyVAL.item = nil } - case 1851: + case 1852: { parser.yyVAL.item = []int{yyS[yypt-0].item.(int)} } - case 1852: + case 1853: { l := yyS[yypt-2].item.([]int) l = append(l, yyS[yypt-0].item.(int)) parser.yyVAL.item = l } - case 1853: + case 1854: { parser.yyVAL.item = ast.ProfileTypeCPU } - case 1854: + case 1855: { parser.yyVAL.item = ast.ProfileTypeMemory } - case 1855: + case 1856: { parser.yyVAL.item = ast.ProfileTypeBlockIo } - case 1856: + case 1857: { parser.yyVAL.item = ast.ProfileTypeContextSwitch } - case 1857: + case 1858: { parser.yyVAL.item = ast.ProfileTypePageFaults } - case 1858: + case 1859: { parser.yyVAL.item = ast.ProfileTypeIpc } - case 1859: + case 1860: { parser.yyVAL.item = ast.ProfileTypeSwaps } - case 1860: + case 1861: { parser.yyVAL.item = ast.ProfileTypeSource } - case 1861: + case 1862: { parser.yyVAL.item = ast.ProfileTypeAll } - case 1862: + case 1863: { parser.yyVAL.item = nil } - case 1863: + case 1864: { v := yyS[yypt-0].item.(int64) parser.yyVAL.item = &v } - case 1864: + case 1865: { parser.yyVAL.item = nil } - case 1865: + case 1866: { parser.yyVAL.item = yyS[yypt-0].item.([]*auth.RoleIdentity) } - case 1871: + case 1872: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} } - case 1872: + case 1873: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} } - case 1873: + case 1874: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowConfig} } - case 1874: + case 1875: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} } - case 1875: + case 1876: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTables, @@ -18885,28 +18893,28 @@ yynewstate: Full: yyS[yypt-2].item.(bool), } } - case 1876: + case 1877: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowOpenTables, DBName: yyS[yypt-0].ident, } } - case 1877: + case 1878: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTableStatus, DBName: yyS[yypt-0].ident, } } - case 1878: + case 1879: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowIndex, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1879: + case 1880: { show := &ast.ShowStmt{ Tp: ast.ShowIndex, @@ -18914,7 +18922,7 @@ yynewstate: } parser.yyVAL.item = show } - case 1880: + case 1881: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -18923,7 +18931,7 @@ yynewstate: Full: yyS[yypt-3].item.(bool), } } - case 1881: + case 1882: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -18933,81 +18941,81 @@ yynewstate: Extended: true, } } - case 1882: + case 1883: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings, CountWarningsOrErrors: true} } - case 1883: + case 1884: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} } - case 1884: + case 1885: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors, CountWarningsOrErrors: true} } - case 1885: + case 1886: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} } - case 1886: + case 1887: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowVariables, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1887: + case 1888: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowStatus, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1888: + case 1889: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindings, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1889: + case 1890: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowCollation, } } - case 1890: + case 1891: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTriggers, DBName: yyS[yypt-0].ident, } } - case 1891: + case 1892: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindingCacheStatus, } } - case 1892: + case 1893: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowProcedureStatus, } } - case 1893: + case 1894: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPumpStatus, } } - case 1894: + case 1895: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowDrainerStatus, } } - case 1895: + case 1896: { // 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 @@ -19017,189 +19025,189 @@ yynewstate: Tp: ast.ShowProcedureStatus, } } - case 1896: + case 1897: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowEvents, DBName: yyS[yypt-0].ident, } } - case 1897: + case 1898: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlugins, } } - case 1898: + case 1899: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowSessionStates} } - case 1899: + case 1900: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsExtended} } - case 1900: + case 1901: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsMeta, Table: &ast.TableName{Name: model.NewCIStr("STATS_META"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1901: + case 1902: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHistograms, Table: &ast.TableName{Name: model.NewCIStr("STATS_HISTOGRAMS"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1902: + case 1903: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsTopN} } - case 1903: + case 1904: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsBuckets, Table: &ast.TableName{Name: model.NewCIStr("STATS_BUCKETS"), Schema: model.NewCIStr(mysql.SystemDB)}} } - case 1904: + case 1905: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHealthy} } - case 1905: + case 1906: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowHistogramsInFlight} } - case 1906: + case 1907: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowColumnStatsUsage} } - case 1907: + case 1908: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowAnalyzeStatus} } - case 1908: + case 1909: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowBackups} } - case 1909: + case 1910: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowRestores} } - case 1910: + case 1911: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowImports} } - case 1911: + case 1912: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacement} } - case 1912: + case 1913: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacementLabels} } - case 1913: + case 1914: { parser.yyVAL.item = nil } - case 1914: + case 1915: { parser.yyVAL.item = &ast.PatternLikeExpr{ Pattern: yyS[yypt-0].expr, Escape: '\\', } } - case 1915: + case 1916: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1916: + case 1917: { parser.yyVAL.item = false } - case 1917: + case 1918: { parser.yyVAL.item = true } - case 1918: + case 1919: { parser.yyVAL.item = false } - case 1919: + case 1920: { parser.yyVAL.item = ast.StatementScopeSession } - case 1920: + case 1921: { parser.yyVAL.item = ast.StatementScopeGlobal } - case 1921: + case 1922: { parser.yyVAL.item = ast.StatementScopeInstance } - case 1922: + case 1923: { parser.yyVAL.item = ast.StatementScopeSession } - case 1923: + case 1924: { parser.yyVAL.item = false } - case 1924: + case 1925: { parser.yyVAL.item = true } - case 1925: + case 1926: { parser.yyVAL.ident = "" } - case 1926: + case 1927: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 1927: + case 1928: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) } - case 1928: + case 1929: { tmp := yyS[yypt-0].item.(*ast.FlushStmt) tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) parser.yyVAL.statement = tmp } - case 1929: + case 1930: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 1930: + case 1931: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 1931: + case 1932: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushPrivileges, } } - case 1932: + case 1933: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushStatus, } } - case 1933: + case 1934: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTiDBPlugin, Plugins: yyS[yypt-0].item.([]string), } } - case 1934: + case 1935: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushHosts, } } - case 1935: + case 1936: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushLogs, LogType: yyS[yypt-1].item.(ast.LogType), } } - case 1936: + case 1937: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTables, @@ -19207,69 +19215,69 @@ yynewstate: ReadLock: yyS[yypt-0].item.(bool), } } - case 1937: + case 1938: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushClientErrorsSummary, } } - case 1938: + case 1939: { parser.yyVAL.item = ast.LogTypeDefault } - case 1939: + case 1940: { parser.yyVAL.item = ast.LogTypeBinary } - case 1940: + case 1941: { parser.yyVAL.item = ast.LogTypeEngine } - case 1941: + case 1942: { parser.yyVAL.item = ast.LogTypeError } - case 1942: + case 1943: { parser.yyVAL.item = ast.LogTypeGeneral } - case 1943: + case 1944: { parser.yyVAL.item = ast.LogTypeSlow } - case 1944: + case 1945: { parser.yyVAL.item = false } - case 1945: + case 1946: { parser.yyVAL.item = true } - case 1946: + case 1947: { parser.yyVAL.item = true } - case 1947: + case 1948: { parser.yyVAL.item = []*ast.TableName{} } - case 1949: + case 1950: { parser.yyVAL.item = []*ast.TableName{} } - case 1950: + case 1951: { parser.yyVAL.item = yyS[yypt-0].item } - case 1951: + case 1952: { parser.yyVAL.item = false } - case 1952: + case 1953: { parser.yyVAL.item = true } - case 2023: + case 2024: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19282,7 +19290,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2049: + case 2050: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19295,7 +19303,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2064: + case 2065: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -19308,7 +19316,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2066: + case 2067: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -19318,7 +19326,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2067: + case 2068: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -19328,7 +19336,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2068: + case 2069: { cst := yyS[yypt-0].item.(*ast.Constraint) if yyS[yypt-1].item != nil { @@ -19336,7 +19344,7 @@ yynewstate: } parser.yyVAL.item = cst } - case 2073: + case 2074: { if yyS[yypt-0].item != nil { parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} @@ -19344,7 +19352,7 @@ yynewstate: parser.yyVAL.item = []interface{}{} } } - case 2074: + case 2075: { if yyS[yypt-0].item != nil { parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) @@ -19352,7 +19360,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 2075: + case 2076: { var columnDefs []*ast.ColumnDef var constraints []*ast.Constraint @@ -19361,7 +19369,7 @@ yynewstate: Constraints: constraints, } } - case 2076: + case 2077: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -19379,69 +19387,69 @@ yynewstate: Constraints: constraints, } } - case 2078: + case 2079: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2079: + case 2080: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2080: + case 2081: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2081: + case 2082: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIdCache, UintValue: yyS[yypt-0].item.(uint64)} } - case 2082: + case 2083: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoRandomBase, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2083: + case 2084: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} } - case 2084: + case 2085: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} } - case 2085: + case 2086: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2086: + case 2087: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTableCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2087: + case 2088: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} } - case 2088: + case 2089: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} } - case 2089: + case 2090: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} } - case 2090: + case 2091: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} } - case 2091: + case 2092: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} } - case 2092: + case 2093: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} } - case 2093: + case 2094: { n := yyS[yypt-0].item.(uint64) if n != 0 && n != 1 { @@ -19452,13 +19460,13 @@ yynewstate: yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2094: + case 2095: { 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 2095: + case 2096: { // Parse it but will ignore it. // In MySQL, STATS_SAMPLE_PAGES=N(Where 0 1 { @@ -21165,7 +21185,7 @@ yynewstate: OptEnclosed: true, } } - case 2416: + case 2417: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -21177,7 +21197,7 @@ yynewstate: Value: str, } } - case 2417: + case 2418: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -21189,104 +21209,104 @@ yynewstate: Value: str, } } - case 2419: + case 2420: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2420: + case 2421: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2421: + case 2422: { parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} } - case 2422: + case 2423: { parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].ident, Terminated: yyS[yypt-0].ident} } - case 2423: + case 2424: { parser.yyVAL.ident = "" } - case 2424: + case 2425: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2425: + case 2426: { parser.yyVAL.ident = "\n" } - case 2426: + case 2427: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2427: + case 2428: { parser.yyVAL.item = nil } - case 2428: + case 2429: { parser.yyVAL.item = yyS[yypt-0].item } - case 2429: + case 2430: { l := yyS[yypt-2].item.([]*ast.Assignment) parser.yyVAL.item = append(l, yyS[yypt-0].item.(*ast.Assignment)) } - case 2430: + case 2431: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 2431: + case 2432: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].expr.(*ast.ColumnNameExpr).Name, Expr: yyS[yypt-0].expr, } } - case 2432: + case 2433: { parser.yyVAL.statement = &ast.UnlockTablesStmt{} } - case 2433: + case 2434: { parser.yyVAL.statement = &ast.LockTablesStmt{ TableLocks: yyS[yypt-0].item.([]ast.TableLock), } } - case 2436: + case 2437: { parser.yyVAL.item = ast.TableLock{ Table: yyS[yypt-1].item.(*ast.TableName), Type: yyS[yypt-0].item.(model.TableLockType), } } - case 2437: + case 2438: { parser.yyVAL.item = model.TableLockRead } - case 2438: + case 2439: { parser.yyVAL.item = model.TableLockReadLocal } - case 2439: + case 2440: { parser.yyVAL.item = model.TableLockWrite } - case 2440: + case 2441: { parser.yyVAL.item = model.TableLockWriteLocal } - case 2441: + case 2442: { parser.yyVAL.item = []ast.TableLock{yyS[yypt-0].item.(ast.TableLock)} } - case 2442: + case 2443: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.TableLock), yyS[yypt-0].item.(ast.TableLock)) } - case 2443: + case 2444: { parser.yyVAL.statement = &ast.NonTransactionalDeleteStmt{ DryRun: yyS[yypt-1].item.(int), @@ -21295,41 +21315,41 @@ yynewstate: DeleteStmt: yyS[yypt-0].statement.(*ast.DeleteStmt), } } - case 2444: + case 2445: { parser.yyVAL.item = ast.NoDryRun } - case 2445: + case 2446: { parser.yyVAL.item = ast.DryRunSplitDml } - case 2446: + case 2447: { parser.yyVAL.item = ast.DryRunQuery } - case 2447: + case 2448: { parser.yyVAL.item = (*ast.ColumnName)(nil) } - case 2448: + case 2449: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.ColumnName) } - case 2449: + case 2450: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-1].item.(bool), } } - case 2450: + case 2451: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-2].item.(bool), } } - case 2451: + case 2452: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), @@ -21337,28 +21357,28 @@ yynewstate: TiDBExtension: yyS[yypt-2].item.(bool), } } - case 2452: + case 2453: { parser.yyVAL.item = false } - case 2453: + case 2454: { parser.yyVAL.item = true } - case 2454: + case 2455: { parser.yyVAL.statement = &ast.LoadStatsStmt{ Path: yyS[yypt-0].ident, } } - case 2455: + case 2456: { parser.yyVAL.statement = &ast.DropPlacementPolicyStmt{ IfExists: yyS[yypt-1].item.(bool), PolicyName: model.NewCIStr(yyS[yypt-0].ident), } } - case 2456: + case 2457: { parser.yyVAL.statement = &ast.CreatePlacementPolicyStmt{ OrReplace: yyS[yypt-5].item.(bool), @@ -21367,7 +21387,7 @@ yynewstate: PlacementOptions: yyS[yypt-0].item.([]*ast.PlacementOption), } } - case 2457: + case 2458: { parser.yyVAL.statement = &ast.AlterPlacementPolicyStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -21375,7 +21395,7 @@ yynewstate: PlacementOptions: yyS[yypt-0].item.([]*ast.PlacementOption), } } - case 2458: + case 2459: { parser.yyVAL.statement = &ast.CreateSequenceStmt{ IfNotExists: yyS[yypt-3].item.(bool), @@ -21384,21 +21404,17 @@ yynewstate: TblOptions: yyS[yypt-0].item.([]*ast.TableOption), } } - case 2459: + case 2460: { parser.yyVAL.item = []*ast.SequenceOption{} } - case 2461: - { - parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} - } case 2462: { - parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) + parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } case 2463: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceOptionIncrementBy, IntValue: yyS[yypt-0].item.(int64)} + parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } case 2464: { @@ -21406,7 +21422,7 @@ yynewstate: } case 2465: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceStartWith, IntValue: yyS[yypt-0].item.(int64)} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceOptionIncrementBy, IntValue: yyS[yypt-0].item.(int64)} } case 2466: { @@ -21414,11 +21430,11 @@ yynewstate: } case 2467: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMinValue, IntValue: yyS[yypt-0].item.(int64)} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceStartWith, IntValue: yyS[yypt-0].item.(int64)} } case 2468: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMinValue} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMinValue, IntValue: yyS[yypt-0].item.(int64)} } case 2469: { @@ -21426,11 +21442,11 @@ yynewstate: } case 2470: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMaxValue, IntValue: yyS[yypt-0].item.(int64)} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMinValue} } case 2471: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMaxValue} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMaxValue, IntValue: yyS[yypt-0].item.(int64)} } case 2472: { @@ -21438,11 +21454,11 @@ yynewstate: } case 2473: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCache, IntValue: yyS[yypt-0].item.(int64)} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMaxValue} } case 2474: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCache} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCache, IntValue: yyS[yypt-0].item.(int64)} } case 2475: { @@ -21450,21 +21466,25 @@ yynewstate: } case 2476: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCycle} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCache} } case 2477: { - parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCycle} } case 2478: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} } - case 2480: + case 2479: { - parser.yyVAL.item = yyS[yypt-0].item + parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} } case 2481: + { + parser.yyVAL.item = yyS[yypt-0].item + } + case 2482: { unsigned_num := getUint64FromNUM(yyS[yypt-0].item) if unsigned_num > 9223372036854775808 { @@ -21477,14 +21497,14 @@ yynewstate: parser.yyVAL.item = -int64(unsigned_num) } } - case 2482: + case 2483: { parser.yyVAL.statement = &ast.DropSequenceStmt{ IfExists: yyS[yypt-1].item.(bool), Sequences: yyS[yypt-0].item.([]*ast.TableName), } } - case 2483: + case 2484: { parser.yyVAL.statement = &ast.AlterSequenceStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -21492,27 +21512,27 @@ yynewstate: SeqOptions: yyS[yypt-0].item.([]*ast.SequenceOption), } } - case 2484: + case 2485: { parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } - case 2485: + case 2486: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } - case 2487: + case 2488: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestart} } - case 2488: + case 2489: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2489: + case 2490: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2490: + case 2491: { x := &ast.IndexAdviseStmt{ Path: yyS[yypt-3].ident, @@ -21529,42 +21549,42 @@ yynewstate: } parser.yyVAL.statement = x } - case 2491: + case 2492: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2492: + case 2493: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2493: + case 2494: { parser.yyVAL.item = nil } - case 2494: + case 2495: { parser.yyVAL.item = &ast.MaxIndexNumClause{ PerTable: yyS[yypt-1].item.(uint64), PerDB: yyS[yypt-0].item.(uint64), } } - case 2495: + case 2496: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2496: + case 2497: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2497: + case 2498: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2498: + case 2499: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2499: + case 2500: { // Parse it but will ignore it switch yyS[yypt-0].ident { @@ -21579,19 +21599,19 @@ yynewstate: } parser.yyVAL.ident = yyS[yypt-0].ident } - case 2500: + case 2501: { parser.yyVAL.item = append([]*ast.RowExpr{}, yyS[yypt-0].item.(*ast.RowExpr)) } - case 2501: + case 2502: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RowExpr), yyS[yypt-0].item.(*ast.RowExpr)) } - case 2502: + case 2503: { parser.yyVAL.item = &ast.RowExpr{Values: yyS[yypt-0].item.([]ast.ExprNode)} } - case 2503: + case 2504: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -21607,7 +21627,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2504: + case 2505: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -21623,7 +21643,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2505: + case 2506: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -21643,7 +21663,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2506: + case 2507: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -21663,7 +21683,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2507: + case 2508: { x := &ast.PlanReplayerStmt{ Stmt: nil, diff --git a/parser/parser.y b/parser/parser.y index 52311bef662fa..26a664ee247ae 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -1517,6 +1517,13 @@ AlterTableStmt: AnalyzeOpts: $10.([]ast.AnalyzeOpt), } } +| "ALTER" IgnoreOptional "TABLE" TableName "COMPACT" + { + $$ = &ast.CompactTableStmt{ + Table: $4.(*ast.TableName), + ReplicaKind: ast.CompactReplicaKindAll, + } + } | "ALTER" IgnoreOptional "TABLE" TableName "COMPACT" "TIFLASH" "REPLICA" { $$ = &ast.CompactTableStmt{ @@ -11904,6 +11911,10 @@ StringType: { tp := $1.(*types.FieldType) tp.SetCharset($2.(*ast.OptBinary).Charset) + if $2.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } if $2.(*ast.OptBinary).IsBinary { tp.AddFlag(mysql.BinaryFlag) } @@ -11961,6 +11972,10 @@ StringType: { tp := types.NewFieldType(mysql.TypeMediumBlob) tp.SetCharset($3.(*ast.OptBinary).Charset) + if $3.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } if $3.(*ast.OptBinary).IsBinary { tp.AddFlag(mysql.BinaryFlag) } @@ -11970,6 +11985,10 @@ StringType: { tp := types.NewFieldType(mysql.TypeMediumBlob) tp.SetCharset($2.(*ast.OptBinary).Charset) + if $2.(*ast.OptBinary).Charset == charset.CharsetBin { + tp.AddFlag(mysql.BinaryFlag) + tp.SetCollate(charset.CollationBin) + } if $2.(*ast.OptBinary).IsBinary { tp.AddFlag(mysql.BinaryFlag) } @@ -12081,7 +12100,7 @@ OptCharsetWithOptBinary: { $$ = &ast.OptBinary{ IsBinary: false, - Charset: "", + Charset: charset.CharsetBin, } } diff --git a/parser/parser_test.go b/parser/parser_test.go index ee5c9fc7e384c..3d52e3871d47d 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -3397,8 +3397,8 @@ func TestDDL(t *testing.T) { {"create table t (a longtext ascii)", true, "CREATE TABLE `t` (`a` LONGTEXT CHARACTER SET LATIN1)"}, {"create table t (a mediumtext ascii)", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET LATIN1)"}, {"create table t (a tinytext ascii)", true, "CREATE TABLE `t` (`a` TINYTEXT CHARACTER SET LATIN1)"}, - {"create table t (a text byte)", true, "CREATE TABLE `t` (`a` TEXT)"}, - {"create table t (a long byte, b text ascii)", true, "CREATE TABLE `t` (`a` MEDIUMTEXT,`b` TEXT CHARACTER SET LATIN1)"}, + {"create table t (a text byte)", true, "CREATE TABLE `t` (`a` BLOB)"}, + {"create table t (a long byte, b text ascii)", true, "CREATE TABLE `t` (`a` MEDIUMBLOB,`b` TEXT CHARACTER SET LATIN1)"}, {"create table t (a text ascii, b mediumtext ascii, c int)", true, "CREATE TABLE `t` (`a` TEXT CHARACTER SET LATIN1,`b` MEDIUMTEXT CHARACTER SET LATIN1,`c` INT)"}, {"create table t (a int, b text ascii, c mediumtext ascii)", true, "CREATE TABLE `t` (`a` INT,`b` TEXT CHARACTER SET LATIN1,`c` MEDIUMTEXT CHARACTER SET LATIN1)"}, {"create table t (a long ascii, b long ascii)", true, "CREATE TABLE `t` (`a` MEDIUMTEXT CHARACTER SET LATIN1,`b` MEDIUMTEXT CHARACTER SET LATIN1)"}, @@ -4229,6 +4229,16 @@ func TestOptimizerHints(t *testing.T) { require.Equal(t, "limit_to_cop", hints[0].HintName.L) require.Equal(t, "limit_to_cop", hints[1].HintName.L) + // Test CTE MERGE + stmt, _, err = p.Parse("with cte(x) as (select * from t1) select /*+ MERGE(), merge() */ * from cte;", "", "") + require.NoError(t, err) + selectStmt = stmt[0].(*ast.SelectStmt) + + hints = selectStmt.TableHints + require.Len(t, hints, 2) + require.Equal(t, "merge", hints[0].HintName.L) + require.Equal(t, "merge", hints[1].HintName.L) + // Test STRAIGHT_JOIN stmt, _, err = p.Parse("select /*+ STRAIGHT_JOIN(), straight_join() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") require.NoError(t, err) @@ -4892,6 +4902,8 @@ func TestExplain(t *testing.T) { {"EXPLAIN FORMAT = JSON FOR CONNECTION 1", true, "EXPLAIN FORMAT = 'JSON' FOR CONNECTION 1"}, {"EXPLAIN FORMAT = JSON SELECT 1", true, "EXPLAIN FORMAT = 'JSON' SELECT 1"}, {"EXPLAIN FORMAT = 'hint' SELECT 1", true, "EXPLAIN FORMAT = 'hint' SELECT 1"}, + {"EXPLAIN ANALYZE FORMAT = 'verbose' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'verbose' SELECT 1"}, + {"EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1", true, "EXPLAIN ANALYZE FORMAT = 'binary' SELECT 1"}, {"EXPLAIN ALTER TABLE t1 ADD INDEX (a)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD INDEX(`a`)"}, {"EXPLAIN ALTER TABLE t1 ADD a varchar(255)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD COLUMN `a` VARCHAR(255)"}, } @@ -6473,6 +6485,30 @@ func TestCTE(t *testing.T) { RunTest(t, table, false) } +// For CTE Merge +func TestCTEMerge(t *testing.T) { + table := []testCase{ + {"WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, + {"WITH `cte` AS (SELECT 1,2), cte2 as (select 3) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2), `cte2` AS (SELECT 3) SELECT `col1`,`col2` FROM `cte`"}, + {"with cte(a) as (select 1) update t, cte set t.a=1 where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) UPDATE (`t`) JOIN `cte` SET `t`.`a`=1 WHERE `t`.`a`=`cte`.`a`"}, + {"with cte(a) as (select 1) delete t from t, cte where t.a=cte.a;", true, "WITH `cte` (`a`) AS (SELECT 1) DELETE `t` FROM (`t`) JOIN `cte` WHERE `t`.`a`=`cte`.`a`"}, + {"WITH cte1 AS (SELECT 1) SELECT * FROM (WITH cte2 AS (SELECT 2) SELECT * FROM cte2 JOIN cte1) AS dt;", true, "WITH `cte1` AS (SELECT 1) SELECT * FROM (WITH `cte2` AS (SELECT 2) SELECT * FROM `cte2` JOIN `cte1`) AS `dt`"}, + {"WITH cte AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte;", true, "WITH `cte` AS (SELECT 1) SELECT /*+ MAX_EXECUTION_TIME(1000)*/ * FROM `cte`"}, + {"with cte as (table t) table cte;", true, "WITH `cte` AS (TABLE `t`) TABLE `cte`"}, + {"with cte as (select 1) select 1 union with cte as (select 1) select * from cte;", false, ""}, + {"with cte as (select 1) (select 1);", true, "WITH `cte` AS (SELECT 1) (SELECT 1)"}, + {"with cte as (select 1) (select 1 union select 1)", true, "WITH `cte` AS (SELECT 1) (SELECT 1 UNION SELECT 1)"}, + {"select * from (with cte as (select 1) select 1 union select 2) qn", true, "SELECT * FROM (WITH `cte` AS (SELECT 1) SELECT 1 UNION SELECT 2) AS `qn`"}, + {"select * from t where 1 > (with cte as (select 2) select * from cte)", true, "SELECT * FROM `t` WHERE 1>(WITH `cte` AS (SELECT 2) SELECT * FROM `cte`)"}, + {"( with cte(n) as ( select 1 ) select n+1 from cte union select n+2 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte` UNION SELECT `n`+2 FROM `cte`) UNION SELECT 1"}, + {"( with cte(n) as ( select 1 ) select n+1 from cte) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) SELECT `n`+1 FROM `cte`) UNION SELECT 1"}, + {"( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1"}, + } + + RunTest(t, table, false) +} + func TestAsOfClause(t *testing.T) { table := []testCase{ {"SELECT * FROM `t` AS /* comment */ a;", true, "SELECT * FROM `t` AS `a`"}, diff --git a/parser/terror/terror.go b/parser/terror/terror.go index e6fd4e759d70c..92619f433715f 100644 --- a/parser/terror/terror.go +++ b/parser/terror/terror.go @@ -52,6 +52,7 @@ const ( // ErrClass represents a class of errors. type ErrClass int +// Error implements error interface. type Error = errors.Error // Error classes. @@ -101,7 +102,10 @@ func newCode2ErrClassMap() *code2ErrClassMap { func (m *code2ErrClassMap) Get(key string) (ErrClass, bool) { ret, have := m.data.Load(key) - return ret.(ErrClass), have + if !have { + return ErrClass(-1), false + } + return ret.(ErrClass), true } func (m *code2ErrClassMap) Put(key string, err ErrClass) { @@ -225,12 +229,12 @@ func getMySQLErrorCode(e *Error) uint16 { rfcCode := e.RFCCode() var class ErrClass if index := strings.Index(string(rfcCode), ":"); index > 0 { - if ec, has := rfcCode2errClass.Get(string(rfcCode)[:index]); has { - class = ec - } else { + ec, has := rfcCode2errClass.Get(string(rfcCode)[:index]) + if !has { log.Warn("Unknown error class", zap.String("class", string(rfcCode)[:index])) return defaultMySQLErrorCode } + class = ec } codeMap, ok := ErrClassToMySQLCodes[class] if !ok { @@ -247,8 +251,10 @@ func getMySQLErrorCode(e *Error) uint16 { var ( // ErrClassToMySQLCodes is the map of ErrClass to code-set. - ErrClassToMySQLCodes = make(map[ErrClass]map[ErrCode]struct{}) - ErrCritical = ClassGlobal.NewStdErr(CodeExecResultIsEmpty, mysql.Message("critical error %v", nil)) + ErrClassToMySQLCodes = make(map[ErrClass]map[ErrCode]struct{}) + // ErrCritical is the critical error class. + ErrCritical = ClassGlobal.NewStdErr(CodeExecResultIsEmpty, mysql.Message("critical error %v", nil)) + // ErrResultUndetermined is the error when execution result is unknown. ErrResultUndetermined = ClassGlobal.NewStdErr(CodeResultUndetermined, mysql.Message("execution result undetermined", nil)) ) @@ -308,6 +314,7 @@ func Log(err error) { } } +// GetErrClass returns the error class of the error. func GetErrClass(e *Error) ErrClass { rfcCode := e.RFCCode() if index := strings.Index(string(rfcCode), ":"); index > 0 { diff --git a/parser/tidb/features.go b/parser/tidb/features.go index 5c79a50807dbf..296a3d6b37d9b 100644 --- a/parser/tidb/features.go +++ b/parser/tidb/features.go @@ -39,6 +39,7 @@ var featureIDs = map[string]struct{}{ FeatureIDPlacement: {}, } +// CanParseFeature is used to check if a feature can be parsed. func CanParseFeature(fs ...string) bool { for _, f := range fs { if _, ok := featureIDs[f]; !ok { diff --git a/parser/types/field_type.go b/parser/types/field_type.go index 429896d6d790e..62daa2ae68355 100644 --- a/parser/types/field_type.go +++ b/parser/types/field_type.go @@ -67,68 +67,86 @@ func NewFieldType(tp byte) *FieldType { decimal: UnspecifiedLength, } } + +// IsDecimalValid checks whether the decimal is valid. func (ft *FieldType) IsDecimalValid() bool { if ft.tp == mysql.TypeNewDecimal && (ft.decimal < 0 || ft.decimal > mysql.MaxDecimalScale || ft.flen <= 0 || ft.flen > mysql.MaxDecimalWidth || ft.flen < ft.decimal) { return false } return true } + +// GetType returns the type of the FieldType. func (ft *FieldType) GetType() byte { return ft.tp } +// GetFlag returns the flag of the FieldType. func (ft *FieldType) GetFlag() uint { return ft.flag } +// GetFlen returns the length of the field. func (ft *FieldType) GetFlen() int { return ft.flen } +// GetDecimal returns the decimal of the FieldType. func (ft *FieldType) GetDecimal() int { return ft.decimal } +// GetCharset returns the field's charset func (ft *FieldType) GetCharset() string { return ft.charset } +// GetCollate returns the collation of the field. func (ft *FieldType) GetCollate() string { return ft.collate } +// GetElems returns the elements of the FieldType. func (ft *FieldType) GetElems() []string { return ft.elems } +// SetType sets the type of the FieldType. func (ft *FieldType) SetType(tp byte) { ft.tp = tp } +// SetFlag sets the flag of the FieldType. func (ft *FieldType) SetFlag(flag uint) { ft.flag = flag } +// AddFlag adds a flag to the FieldType. func (ft *FieldType) AddFlag(flag uint) { ft.flag |= flag } +// AndFlag and the flag of the FieldType. func (ft *FieldType) AndFlag(flag uint) { ft.flag &= flag } +// ToggleFlag toggle the flag of the FieldType. func (ft *FieldType) ToggleFlag(flag uint) { ft.flag ^= flag } +// DelFlag delete the flag of the FieldType. func (ft *FieldType) DelFlag(flag uint) { ft.flag &= ^flag } +// SetFlen sets the length of the field. func (ft *FieldType) SetFlen(flen int) { ft.flen = flen } +// SetFlenUnderLimit sets the length of the field to the value of the argument func (ft *FieldType) SetFlenUnderLimit(flen int) { if ft.tp == mysql.TypeNewDecimal { ft.flen = mathutil.Min(flen, mysql.MaxDecimalWidth) @@ -137,10 +155,12 @@ func (ft *FieldType) SetFlenUnderLimit(flen int) { } } +// SetDecimal sets the decimal of the FieldType. func (ft *FieldType) SetDecimal(decimal int) { ft.decimal = decimal } +// SetDecimalUnderLimit sets the decimal of the field to the value of the argument func (ft *FieldType) SetDecimalUnderLimit(decimal int) { if ft.tp == mysql.TypeNewDecimal { ft.decimal = mathutil.Min(decimal, mysql.MaxDecimalScale) @@ -149,6 +169,7 @@ func (ft *FieldType) SetDecimalUnderLimit(decimal int) { } } +// UpdateFlenAndDecimalUnderLimit updates the length and decimal to the value of the argument func (ft *FieldType) UpdateFlenAndDecimalUnderLimit(old *FieldType, deltaDecimal int, deltaFlen int) { if ft.tp != mysql.TypeNewDecimal { return @@ -166,22 +187,27 @@ func (ft *FieldType) UpdateFlenAndDecimalUnderLimit(old *FieldType, deltaDecimal } } +// SetCharset sets the charset of the FieldType. func (ft *FieldType) SetCharset(charset string) { ft.charset = charset } +// SetCollate sets the collation of the FieldType. func (ft *FieldType) SetCollate(collate string) { ft.collate = collate } +// SetElems sets the elements of the FieldType. func (ft *FieldType) SetElems(elems []string) { ft.elems = elems } +// SetElem sets the element of the FieldType. func (ft *FieldType) SetElem(idx int, element string) { ft.elems[idx] = element } +// SetElemWithIsBinaryLit sets the element of the FieldType. func (ft *FieldType) SetElemWithIsBinaryLit(idx int, element string, isBinaryLit bool) { ft.elems[idx] = element if isBinaryLit { @@ -193,10 +219,12 @@ func (ft *FieldType) SetElemWithIsBinaryLit(idx int, element string, isBinaryLit } } +// GetElem returns the element of the FieldType. func (ft *FieldType) GetElem(idx int) string { return ft.elems[idx] } +// GetElemIsBinaryLit returns the binary literal flag of the element at index idx. func (ft *FieldType) GetElemIsBinaryLit(idx int) bool { if len(ft.elemsIsBinaryLit) == 0 { return false @@ -204,6 +232,7 @@ func (ft *FieldType) GetElemIsBinaryLit(idx int) bool { return ft.elemsIsBinaryLit[idx] } +// CleanElemIsBinaryLit cleans the binary literal flag of the element at index idx. func (ft *FieldType) CleanElemIsBinaryLit() { if ft != nil && ft.elemsIsBinaryLit != nil { ft.elemsIsBinaryLit = nil @@ -542,6 +571,7 @@ type jsonFieldType struct { ElemsIsBinaryLit []bool } +// UnmarshalJSON implements the json.Unmarshaler interface. func (ft *FieldType) UnmarshalJSON(data []byte) error { var r jsonFieldType err := json.Unmarshal(data, &r) @@ -558,6 +588,7 @@ func (ft *FieldType) UnmarshalJSON(data []byte) error { return err } +// MarshalJSON marshals the FieldType to JSON. func (ft *FieldType) MarshalJSON() ([]byte, error) { var r jsonFieldType r.Tp = ft.tp diff --git a/parser/yy_parser.go b/parser/yy_parser.go index 221dd7a26e790..7ab66a19937d1 100644 --- a/parser/yy_parser.go +++ b/parser/yy_parser.go @@ -70,12 +70,17 @@ func TrimComment(txt string) string { return specCodeEnd.ReplaceAllString(txt, "") } +//revive:disable:exported + +// ParserConfig is the parser config. type ParserConfig struct { EnableWindowFunction bool EnableStrictDoubleTypeCheck bool SkipPositionRecording bool } +//revive:enable:exported + // Parser represents a parser instance. Some temporary objects are stored in it to reduce object allocation during Parse function. type Parser struct { charset string @@ -126,10 +131,12 @@ func New() *Parser { return p } +// SetStrictDoubleTypeCheck enables/disables strict double type check. func (parser *Parser) SetStrictDoubleTypeCheck(val bool) { parser.strictDoubleFieldType = val } +// SetParserConfig sets the parser config. func (parser *Parser) SetParserConfig(config ParserConfig) { parser.EnableWindowFunc(config.EnableWindowFunction) parser.SetStrictDoubleTypeCheck(config.EnableStrictDoubleTypeCheck) @@ -221,7 +228,7 @@ func (parser *Parser) setLastSelectFieldText(st *ast.SelectStmt, lastEnd int) { } } -func (parser *Parser) startOffset(v *yySymType) int { +func (*Parser) startOffset(v *yySymType) int { return v.offset } @@ -334,8 +341,9 @@ func getInt64FromNUM(num interface{}) (val int64, errMsg string) { switch v := num.(type) { case int64: return v, "" + default: + return -1, fmt.Sprintf("%d is out of range [–9223372036854775808,9223372036854775807]", num) } - return -1, fmt.Sprintf("%d is out of range [–9223372036854775808,9223372036854775807]", num) } func isRevokeAllGrant(roleOrPrivList []*ast.RoleOrPriv) bool { diff --git a/planner/core/BUILD.bazel b/planner/core/BUILD.bazel index 83342809499ce..347b7fb18c7e5 100644 --- a/planner/core/BUILD.bazel +++ b/planner/core/BUILD.bazel @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "core", srcs = [ + "access_object.go", "cache.go", "cacheable_checker.go", "collect_column_stats_usage.go", @@ -13,6 +14,7 @@ go_library( "explain.go", "expression_rewriter.go", "find_best_task.go", + "flat_plan.go", "fragment.go", "handle_cols.go", "hashcode.go", @@ -37,6 +39,7 @@ go_library( "resolve_indices.go", "rule_aggregation_elimination.go", "rule_aggregation_push_down.go", + "rule_aggregation_skew_rewrite.go", "rule_build_key_info.go", "rule_column_pruning.go", "rule_decorrelate.go", @@ -51,6 +54,7 @@ go_library( "rule_partition_processor.go", "rule_predicate_push_down.go", "rule_result_reorder.go", + "rule_semi_join_rewrite.go", "rule_topn_push_down.go", "show_predicate_extractor.go", "stats.go", @@ -116,6 +120,7 @@ go_library( "//util/kvcache", "//util/logutil", "//util/mathutil", + "//util/memory", "//util/mock", "//util/paging", "//util/parser", @@ -144,6 +149,7 @@ go_test( name = "core_test", timeout = "short", srcs = [ + "binary_plan_test.go", "cache_test.go", "cacheable_checker_test.go", "cbo_test.go", @@ -154,6 +160,7 @@ go_test( "expression_rewriter_test.go", "expression_test.go", "find_best_task_test.go", + "flat_plan_test.go", "fragment_test.go", "indexmerge_test.go", "integration_partition_test.go", @@ -237,6 +244,7 @@ go_test( "//util/ranger", "//util/set", "//util/tracing", + "@com_github_golang_snappy//:snappy", "@com_github_pingcap_errors//:errors", "@com_github_pingcap_failpoint//:failpoint", "@com_github_pingcap_tipb//go-tipb", diff --git a/planner/core/access_object.go b/planner/core/access_object.go index b5aa4af1fd692..81296c39c9223 100644 --- a/planner/core/access_object.go +++ b/planner/core/access_object.go @@ -109,7 +109,7 @@ func (d DynamicPartitionAccessObjects) SetIntoPB(pb *tipb.ExplainOperator) { if len(obj.err) > 0 { continue } - pbObj := pbObjSlice[i] + pbObj := &pbObjSlice[i] pbObj.Database = obj.Database pbObj.Table = obj.Table pbObj.AllPartitions = obj.AllPartitions @@ -119,7 +119,11 @@ func (d DynamicPartitionAccessObjects) SetIntoPB(pb *tipb.ExplainOperator) { for i := range pbObjSlice { pbObjs.Objects = append(pbObjs.Objects, &pbObjSlice[i]) } - pb.AccessObject = &tipb.ExplainOperator_DynamicPartitionObjects{DynamicPartitionObjects: &pbObjs} + pb.AccessObjects = []*tipb.AccessObject{ + { + AccessObject: &tipb.AccessObject_DynamicPartitionObjects{DynamicPartitionObjects: &pbObjs}, + }, + } } // IndexAccess represents the index accessed by an operator. @@ -202,7 +206,11 @@ func (s *ScanAccessObject) SetIntoPB(pb *tipb.ExplainOperator) { for i := range s.Indexes { pbObj.Indexes = append(pbObj.Indexes, s.Indexes[i].ToPB()) } - pb.AccessObject = &tipb.ExplainOperator_ScanObject{ScanObject: &pbObj} + pb.AccessObjects = []*tipb.AccessObject{ + { + AccessObject: &tipb.AccessObject_ScanObject{ScanObject: &pbObj}, + }, + } } // OtherAccessObject represents other kinds of access. @@ -222,7 +230,11 @@ func (o OtherAccessObject) SetIntoPB(pb *tipb.ExplainOperator) { if pb == nil { return } - pb.AccessObject = &tipb.ExplainOperator_OtherObject{OtherObject: string(o)} + pb.AccessObjects = []*tipb.AccessObject{ + { + AccessObject: &tipb.AccessObject_OtherObject{OtherObject: string(o)}, + }, + } } // AccessObject implements dataAccesser interface. diff --git a/planner/core/binary_plan_test.go b/planner/core/binary_plan_test.go new file mode 100644 index 0000000000000..be8aadd6e7f4c --- /dev/null +++ b/planner/core/binary_plan_test.go @@ -0,0 +1,504 @@ +// 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 ( + "encoding/base64" + "fmt" + "os" + "regexp" + "strings" + "testing" + + "github.com/golang/snappy" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/stmtsummary" + "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" +) + +func simplifyAndCheckBinaryPlan(t *testing.T, pb *tipb.ExplainData) { + if pb.Main != nil { + simplifyAndCheckBinaryOperator(t, pb.Main, pb.WithRuntimeStats) + } + for _, cte := range pb.Ctes { + if cte != nil { + simplifyAndCheckBinaryOperator(t, cte, pb.WithRuntimeStats) + } + } +} + +func simplifyAndCheckBinaryOperator(t *testing.T, pb *tipb.ExplainOperator, withRuntimeStats bool) { + if withRuntimeStats { + if pb.TaskType == tipb.TaskType_root { + require.NotEmpty(t, pb.RootBasicExecInfo) + } else if pb.TaskType != tipb.TaskType_unknown { + require.NotEmpty(t, pb.CopExecInfo) + } + } + pb.RootBasicExecInfo = "" + pb.RootGroupExecInfo = nil + pb.CopExecInfo = "" + match, err := regexp.MatchString("((Table|Index).*Scan)|CTEFullScan|Point_Get", pb.Name) + if err == nil && match { + require.NotNil(t, pb.AccessObjects) + } + // AccessObject field is an interface and json.Unmarshall can't handle it, so we don't check it against the json output. + pb.AccessObjects = nil + // MemoryBytes and DiskBytes are not stable sometimes. + pb.MemoryBytes = 0 + pb.DiskBytes = 0 + if len(pb.Children) > 0 { + for _, op := range pb.Children { + if op != nil { + simplifyAndCheckBinaryOperator(t, op, withRuntimeStats) + } + } + } +} + +func TestBinaryPlanInExplainAndSlowLog(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + // If we don't set this, it will be false sometimes and the cost in the result will be different. + tk.MustExec("set @@tidb_enable_chunk_rpc=true") + + // Prepare the slow log + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + tk.MustExec("set tidb_slow_log_threshold=0;") + defer func() { + tk.MustExec("set tidb_slow_log_threshold=300;") + }() + + var input []string + var output []struct { + SQL string + BinaryPlan *tipb.ExplainData + } + planSuiteData := core.GetBinaryPlanSuiteData() + planSuiteData.GetTestCases(t, &input, &output) + + for i, test := range input { + comment := fmt.Sprintf("case:%v sql:%s", i, test) + if len(test) < 7 || test[:7] != "explain" { + tk.MustExec(test) + testdata.OnRecord(func() { + output[i].SQL = test + output[i].BinaryPlan = nil + }) + continue + } + result := testdata.ConvertRowsToStrings(tk.MustQuery(test).Rows()) + require.Equal(t, len(result), 1, comment) + s := result[0] + + // assert that the binary plan in the slow log is the same as the result in the EXPLAIN statement + slowLogResult := testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query = "` + test + `;" ` + + "order by time desc limit 1").Rows()) + require.Lenf(t, slowLogResult, 1, comment) + require.Equal(t, s, slowLogResult[0], comment) + + b, err := base64.StdEncoding.DecodeString(s) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary := &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + testdata.OnRecord(func() { + output[i].SQL = test + output[i].BinaryPlan = binary + }) + simplifyAndCheckBinaryPlan(t, binary) + require.Equal(t, output[i].BinaryPlan, binary) + } +} + +func TestBinaryPlanSwitch(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + + tk.MustExec("use test") + // 1. assert binary plan is generated if the variable is turned on + tk.MustExec("set global tidb_generate_binary_plan = 1") + tk.MustQuery("select sleep(1)") + + result := testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query like "%select sleep(1)%" and query not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s := result[0] + b, err := base64.StdEncoding.DecodeString(s) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary := &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + + result = testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.statements_summary " + + `where QUERY_SAMPLE_TEXT like "%select sleep(1)%" and QUERY_SAMPLE_TEXT not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s = result[0] + b, err = base64.StdEncoding.DecodeString(s) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary = &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + + // 2. assert binary plan is not generated if the variable is turned off + tk.MustExec("set global tidb_generate_binary_plan = 0") + tk.MustQuery("select 1 > sleep(1)") + + result = testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query like "%select 1 > sleep(1)%" and query not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s = result[0] + require.Empty(t, s) + + result = testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.statements_summary " + + `where QUERY_SAMPLE_TEXT like "%select 1 > sleep(1)%" and QUERY_SAMPLE_TEXT not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s = result[0] + require.Empty(t, s) +} + +// TestTooLongBinaryPlan asserts that if the binary plan is larger than 1024*1024 bytes, it should be output to slow query but not to stmt summary. +func TestTooLongBinaryPlan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + + tk.MustExec("use test") + tk.MustExec("drop table if exists th") + tk.MustExec("set @@session.tidb_enable_table_partition = 1") + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) + tk.MustExec("create table th (i int, a int,b int, c int, index (a)) partition by hash (a) partitions 8192;") + tk.MustQuery("select count(*) from th t1 join th t2 join th t3 join th t4 join th t5 join th t6 where t1.i=t2.a and t1.i=t3.i and t3.i=t4.i and t4.i=t5.i and t5.i=t6.i") + + result := testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query like "%th t1 join th t2 join th t3%" and query not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s := result[0] + require.Greater(t, len(s), stmtsummary.MaxEncodedPlanSizeInBytes) + b, err := base64.StdEncoding.DecodeString(s) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary := &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + require.False(t, binary.DiscardedDueToTooLong) + require.True(t, binary.WithRuntimeStats) + require.NotNil(t, binary.Main) + + result = testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.statements_summary " + + `where QUERY_SAMPLE_TEXT like "%th t1 join th t2 join th t3%" and QUERY_SAMPLE_TEXT not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s = result[0] + b, err = base64.StdEncoding.DecodeString(s) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary = &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + require.True(t, binary.DiscardedDueToTooLong) + require.Nil(t, binary.Main) + require.Nil(t, binary.Ctes) +} + +// TestLongBinaryPlan asserts that if the binary plan is smaller than 1024*1024 bytes, it should be output to both slow query and stmt summary. +// The size of the binary plan in this test case is designed to be larger than 1024*1024*0.85 bytes but smaller than 1024*1024 bytes. +func TestLongBinaryPlan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + + tk.MustExec("use test") + + tk.MustExec("drop table if exists th") + tk.MustExec("set @@session.tidb_enable_table_partition = 1") + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) + tk.MustExec("create table th (i int, a int,b int, c int, index (a)) partition by hash (a) partitions 1700;") + tk.MustQuery("select count(*) from th t1 join th t2 join th t3 join th t4 join th t5 join th t6 where t1.i=t2.a and t1.i=t3.i and t3.i=t4.i and t4.i=t5.i and t5.i=t6.i") + + result := testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query like "%th t1 join th t2 join th t3%" and query not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s1 := result[0] + // The binary plan in this test case is expected to be slightly smaller than MaxEncodedPlanSizeInBytes. + // If the size of the binary plan changed and this case failed in the future, you can adjust the partition numbers in the CREATE TABLE statement above. + require.Less(t, len(s1), stmtsummary.MaxEncodedPlanSizeInBytes) + require.Greater(t, len(s1), int(float64(stmtsummary.MaxEncodedPlanSizeInBytes)*0.85)) + b, err := base64.StdEncoding.DecodeString(s1) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary := &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + require.False(t, binary.DiscardedDueToTooLong) + require.True(t, binary.WithRuntimeStats) + require.NotNil(t, binary.Main) + + result = testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.statements_summary " + + `where QUERY_SAMPLE_TEXT like "%th t1 join th t2 join th t3%" and QUERY_SAMPLE_TEXT not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s2 := result[0] + require.Equal(t, s1, s2) +} + +func TestBinaryPlanOfPreparedStmt(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil)) + + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int);") + tk.MustExec("insert into t value(30,30);") + tk.MustExec(`prepare stmt from "select sleep(1), b from t where a > ?"`) + tk.MustExec("set @a = 20") + tk.MustQuery("execute stmt using @a") + + result := testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query like "%select sleep%" and query not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s1 := result[0] + b, err := base64.StdEncoding.DecodeString(s1) + require.NoError(t, err) + b, err = snappy.Decode(nil, b) + require.NoError(t, err) + binary := &tipb.ExplainData{} + err = binary.Unmarshal(b) + require.NoError(t, err) + require.False(t, binary.DiscardedDueToTooLong) + require.True(t, binary.WithRuntimeStats) + require.NotNil(t, binary.Main) + + result = testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.statements_summary " + + `where QUERY_SAMPLE_TEXT like "%select sleep%" and QUERY_SAMPLE_TEXT not like "%like%" ` + + "limit 1;").Rows()) + require.Len(t, result, 1) + s2 := result[0] + require.Equal(t, s1, s2) +} + +// TestDecodeBinaryPlan asserts that the result of EXPLAIN ANALYZE FORMAT = 'verbose' is the same as tidb_decode_binary_plan(). +func TestDecodeBinaryPlan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // Prepare the slow log + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + f, err := os.CreateTemp("", "tidb-slow-*.log") + require.NoError(t, err) + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + require.NoError(t, f.Close()) + require.NoError(t, os.Remove(newCfg.Log.SlowQueryFile)) + }() + require.NoError(t, logutil.InitLogger(newCfg.Log.ToLogConfig())) + tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", f.Name())) + tk.MustExec("set tidb_slow_log_threshold=0;") + defer func() { + tk.MustExec("set tidb_slow_log_threshold=300;") + }() + tk.MustExec(`create table tp (a int, b int) partition by range(a) ( + partition p0 values less than (100), + partition p1 values less than (200), + partition p2 values less than (300), + partition p3 values less than maxvalue + )`) + tk.MustExec("insert into tp value(1,1), (10,10), (123,234), (213, 234);") + tk.MustExec("create table t(a int, b int, c int, index ia(a));") + tk.MustExec("insert into t value(1,1,1), (10,10,10), (123,234,345), (-213, -234, -234);") + cases := []string{ + "explain analyze format = 'verbose' select * from t", + "explain analyze format = 'verbose' select * from t where a > 10", + "explain analyze format = 'verbose' select /*+ inl_join(t1) */ * from t t1 join t t2 where t1.a = t2.a", + "explain analyze format = 'verbose' WITH RECURSIVE cte(n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5) SELECT * FROM cte", + "set @@tidb_partition_prune_mode='static'", + "explain analyze format = 'verbose' select * from tp", + "explain analyze format = 'verbose' select * from tp t1 join tp t2 on t1.b > t2.b", + "explain analyze format = 'verbose' select * from tp where a > 400", + "explain analyze format = 'verbose' select * from tp where a < 30", + "explain analyze format = 'verbose' select * from tp where a > 0", + "set @@tidb_partition_prune_mode='dynamic'", + "explain analyze format = 'verbose' select * from tp", + "explain analyze format = 'verbose' select * from tp t1 join tp t2 on t1.b > t2.b", + "explain analyze format = 'verbose' select * from tp where a > 400", + "explain analyze format = 'verbose' select * from tp where a < 30", + "explain analyze format = 'verbose' select * from tp where a > 0", + } + + for _, c := range cases { + if len(c) < 7 || c[:7] != "explain" { + tk.MustExec(c) + continue + } + comment := fmt.Sprintf("sql:%s", c) + + var res1, res2 []string + + explainResult := tk.MustQuery(c).Rows() + for _, row := range explainResult { + for _, val := range row { + str := val.(string) + str = strings.TrimSpace(str) + if len(str) > 0 { + res1 = append(res1, str) + } + } + } + + slowLogResult := testdata.ConvertRowsToStrings(tk.MustQuery("select binary_plan from information_schema.slow_query " + + `where query = "` + c + `;" ` + + "order by time desc limit 1").Rows()) + require.Lenf(t, slowLogResult, 1, comment) + decoded := testdata.ConvertRowsToStrings(tk.MustQuery(`select tidb_decode_binary_plan('` + slowLogResult[0] + `')`).Rows())[0] + decodedRows := strings.Split(decoded, "\n") + // remove the first newline and the title row + decodedRows = decodedRows[2:] + for _, decodedRow := range decodedRows { + vals := strings.Split(decodedRow, "|") + for _, val := range vals { + val = strings.TrimSpace(val) + if len(val) > 0 { + res2 = append(res2, val) + } + } + } + + require.Equalf(t, res1, res2, comment) + } +} + +func TestInvalidDecodeBinaryPlan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + str1 := "some random bytes" + str2 := base64.StdEncoding.EncodeToString([]byte(str1)) + str3 := base64.StdEncoding.EncodeToString(snappy.Encode(nil, []byte(str1))) + + tk.MustQuery(`select tidb_decode_binary_plan('` + str1 + `')`).Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 illegal base64 data at input byte 4")) + tk.MustQuery(`select tidb_decode_binary_plan('` + str2 + `')`).Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 snappy: corrupt input")) + tk.MustQuery(`select tidb_decode_binary_plan('` + str3 + `')`).Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 proto: illegal wireType 7")) +} diff --git a/planner/core/collect_column_stats_usage.go b/planner/core/collect_column_stats_usage.go index e6f9e7ebed2b6..49f5cfdfd7011 100644 --- a/planner/core/collect_column_stats_usage.go +++ b/planner/core/collect_column_stats_usage.go @@ -32,15 +32,15 @@ type columnStatsUsageCollector struct { // collectMode indicates whether to collect predicate columns and/or histogram-needed columns collectMode uint64 // predicateCols records predicate columns. - predicateCols map[model.TableColumnID]struct{} + predicateCols map[model.TableItemID]struct{} // colMap maps expression.Column.UniqueID to the table columns whose statistics may be utilized to calculate statistics of the column. // It is used for collecting predicate columns. // For example, in `select count(distinct a, b) as e from t`, the count of column `e` is calculated as `max(ndv(t.a), ndv(t.b))` if // we don't know `ndv(t.a, t.b)`(see (*LogicalAggregation).DeriveStats and getColsNDV for details). So when calculating the statistics // of column `e`, we may use the statistics of column `t.a` and `t.b`. - colMap map[int64]map[model.TableColumnID]struct{} + colMap map[int64]map[model.TableItemID]struct{} // histNeededCols records histogram-needed columns - histNeededCols map[model.TableColumnID]struct{} + histNeededCols map[model.TableItemID]struct{} // cols is used to store columns collected from expressions and saves some allocation. cols []*expression.Column } @@ -52,11 +52,11 @@ func newColumnStatsUsageCollector(collectMode uint64) *columnStatsUsageCollector cols: make([]*expression.Column, 0, 8), } if collectMode&collectPredicateColumns != 0 { - collector.predicateCols = make(map[model.TableColumnID]struct{}) - collector.colMap = make(map[int64]map[model.TableColumnID]struct{}) + collector.predicateCols = make(map[model.TableItemID]struct{}) + collector.colMap = make(map[int64]map[model.TableItemID]struct{}) } if collectMode&collectHistNeededColumns != 0 { - collector.histNeededCols = make(map[model.TableColumnID]struct{}) + collector.histNeededCols = make(map[model.TableItemID]struct{}) } return collector } @@ -81,7 +81,7 @@ func (c *columnStatsUsageCollector) addPredicateColumnsFromExpressions(list []ex func (c *columnStatsUsageCollector) updateColMap(col *expression.Column, relatedCols []*expression.Column) { if _, ok := c.colMap[col.UniqueID]; !ok { - c.colMap[col.UniqueID] = map[model.TableColumnID]struct{}{} + c.colMap[col.UniqueID] = map[model.TableItemID]struct{}{} } for _, relatedCol := range relatedCols { tblColIDs, ok := c.colMap[relatedCol.UniqueID] @@ -104,8 +104,8 @@ func (c *columnStatsUsageCollector) collectPredicateColumnsForDataSource(ds *Dat // set TableColumnID.TableID. In this way, we keep the set of predicate columns consistent between different partitions and global table. tblID := ds.TableInfo().ID for _, col := range ds.Schema().Columns { - tblColID := model.TableColumnID{TableID: tblID, ColumnID: col.ID} - c.colMap[col.UniqueID] = map[model.TableColumnID]struct{}{tblColID: {}} + tblColID := model.TableItemID{TableID: tblID, ID: col.ID, IsIndex: false} + c.colMap[col.UniqueID] = map[model.TableItemID]struct{}{tblColID: {}} } // We should use `pushedDownConds` here. `allConds` is used for partition pruning, which doesn't need stats. c.addPredicateColumnsFromExpressions(ds.pushedDownConds) @@ -149,7 +149,7 @@ func (c *columnStatsUsageCollector) collectPredicateColumnsForUnionAll(p *Logica func (c *columnStatsUsageCollector) addHistNeededColumns(ds *DataSource) { columns := expression.ExtractColumnsFromExpressions(c.cols[:0], ds.pushedDownConds, nil) for _, col := range columns { - tblColID := model.TableColumnID{TableID: ds.physicalTableID, ColumnID: col.ID} + tblColID := model.TableItemID{TableID: ds.physicalTableID, ID: col.ID, IsIndex: false} c.histNeededCols[tblColID] = struct{}{} } } @@ -275,7 +275,7 @@ func (c *columnStatsUsageCollector) collectFromPlan(lp LogicalPlan) { // CollectColumnStatsUsage collects column stats usage from logical plan. // predicate indicates whether to collect predicate columns and histNeeded indicates whether to collect histogram-needed columns. // The first return value is predicate columns(nil if predicate is false) and the second return value is histogram-needed columns(nil if histNeeded is false). -func CollectColumnStatsUsage(lp LogicalPlan, predicate, histNeeded bool) ([]model.TableColumnID, []model.TableColumnID) { +func CollectColumnStatsUsage(lp LogicalPlan, predicate, histNeeded bool) ([]model.TableItemID, []model.TableItemID) { var mode uint64 if predicate { mode |= collectPredicateColumns @@ -285,14 +285,14 @@ func CollectColumnStatsUsage(lp LogicalPlan, predicate, histNeeded bool) ([]mode } collector := newColumnStatsUsageCollector(mode) collector.collectFromPlan(lp) - set2slice := func(set map[model.TableColumnID]struct{}) []model.TableColumnID { - ret := make([]model.TableColumnID, 0, len(set)) + set2slice := func(set map[model.TableItemID]struct{}) []model.TableItemID { + ret := make([]model.TableItemID, 0, len(set)) for tblColID := range set { ret = append(ret, tblColID) } return ret } - var predicateCols, histNeededCols []model.TableColumnID + var predicateCols, histNeededCols []model.TableItemID if predicate { predicateCols = set2slice(collector.predicateCols) } diff --git a/planner/core/collect_column_stats_usage_test.go b/planner/core/collect_column_stats_usage_test.go index 295f29e4d4bc0..d494235bc66fc 100644 --- a/planner/core/collect_column_stats_usage_test.go +++ b/planner/core/collect_column_stats_usage_test.go @@ -26,7 +26,7 @@ import ( "github.com/stretchr/testify/require" ) -func getColumnName(t *testing.T, is infoschema.InfoSchema, tblColID model.TableColumnID, comment string) string { +func getColumnName(t *testing.T, is infoschema.InfoSchema, tblColID model.TableItemID, comment string) string { var tblInfo *model.TableInfo var prefix string if tbl, ok := is.TableByID(tblColID.TableID); ok { @@ -57,7 +57,7 @@ func getColumnName(t *testing.T, is infoschema.InfoSchema, tblColID model.TableC var colName string for _, col := range tblInfo.Columns { - if tblColID.ColumnID == col.ID { + if tblColID.ID == col.ID { colName = prefix + col.Name.L } } @@ -66,7 +66,7 @@ func getColumnName(t *testing.T, is infoschema.InfoSchema, tblColID model.TableC } func checkColumnStatsUsage(t *testing.T, is infoschema.InfoSchema, lp LogicalPlan, histNeededOnly bool, expected []string, comment string) { - var tblColIDs []model.TableColumnID + var tblColIDs []model.TableItemID if histNeededOnly { _, tblColIDs = CollectColumnStatsUsage(lp, false, true) } else { diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index 6495d318dc265..9568096deb589 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -35,7 +35,6 @@ import ( "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -47,8 +46,11 @@ import ( "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/plancodec" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/texttree" + "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" ) @@ -315,12 +317,6 @@ func (e *Execute) checkPreparedPriv(ctx context.Context, sctx sessionctx.Context return err } -func (e *Execute) setFoundInPlanCache(sctx sessionctx.Context, opt bool) error { - vars := sctx.GetSessionVars() - err := vars.SetSystemVar(variable.TiDBFoundInPlanCache, variable.BoolToOnOff(opt)) - return err -} - // GetBindSQL4PlanCache used to get the bindSQL for plan cache to build the plan cache key. func GetBindSQL4PlanCache(sctx sessionctx.Context, preparedStmt *CachedPrepareStmt) string { useBinding := sctx.GetSessionVars().UsePlanBaselines @@ -417,10 +413,7 @@ func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, } else { planCacheCounter.Inc() } - err = e.setFoundInPlanCache(sctx, true) - if err != nil { - return err - } + sessVars.FoundInPlanCache = true e.names = names e.Plan = plan stmtCtx.PointExec = true @@ -459,17 +452,11 @@ func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, logutil.BgLogger().Debug("rebuild range failed", zap.Error(err)) goto REBUILD } - err = e.setFoundInPlanCache(sctx, true) - if err != nil { - return err - } + sessVars.FoundInPlanCache = true if len(bindSQL) > 0 { // When the `len(bindSQL) > 0`, it means we use the binding. // So we need to record this. - err = sessVars.SetSystemVar(variable.TiDBFoundInBinding, variable.BoolToOnOff(true)) - if err != nil { - return err - } + sessVars.FoundInBinding = true } if metrics.ResettablePlanCacheCounterFortTest { metrics.PlanCacheCounter.WithLabelValues("prepare").Inc() @@ -515,6 +502,7 @@ REBUILD: } cached := NewPlanCacheValue(p, names, stmtCtx.TblInfo2UnionScan, isBinProtocol, binVarTypes, txtVarTypes, sessVars.StmtCtx.BindSQL) preparedStmt.NormalizedPlan, preparedStmt.PlanDigest = NormalizePlan(p) + stmtCtx.SetPlan(p) stmtCtx.SetPlanDigest(preparedStmt.NormalizedPlan, preparedStmt.PlanDigest) if cacheVals, exists := sctx.PreparedPlanCache().Get(cacheKey); exists { hitVal := false @@ -533,7 +521,7 @@ REBUILD: sctx.PreparedPlanCache().Put(cacheKey, []*PlanCacheValue{cached}) } } - err = e.setFoundInPlanCache(sctx, false) + sessVars.FoundInPlanCache = false return err } @@ -579,6 +567,7 @@ func (e *Execute) tryCachePointPlan(ctx context.Context, sctx sessionctx.Context prepared.CachedPlan = p prepared.CachedNames = names preparedStmt.NormalizedPlan, preparedStmt.PlanDigest = NormalizePlan(p) + sctx.GetSessionVars().StmtCtx.SetPlan(p) sctx.GetSessionVars().StmtCtx.SetPlanDigest(preparedStmt.NormalizedPlan, preparedStmt.PlanDigest) } return err @@ -1174,11 +1163,8 @@ type Explain struct { ExecStmt ast.StmtNode RuntimeStatsColl *execdetails.RuntimeStatsColl - Rows [][]string - ExplainRows [][]string - explainedPlans map[int]bool - - ctes []*PhysicalCTE + Rows [][]string + ExplainRows [][]string } // GetExplainRowsForPlan get explain rows for plan. @@ -1217,6 +1203,8 @@ func (e *Explain) prepareSchema() error { fieldNames = []string{"dot contents"} case format == types.ExplainFormatHint: fieldNames = []string{"hint"} + case format == types.ExplainFormatBinary: + fieldNames = []string{"binary plan"} default: return errors.Errorf("explain format '%s' is not supported now", e.Format) } @@ -1254,14 +1242,14 @@ func (e *Explain) RenderResult() error { switch strings.ToLower(e.Format) { case types.ExplainFormatROW, types.ExplainFormatBrief, types.ExplainFormatVerbose, types.ExplainFormatTrueCardCost: if e.Rows == nil || e.Analyze { - e.explainedPlans = map[int]bool{} - err := e.explainPlanInRowFormat(e.TargetPlan, "root", "", "", true) - if err != nil { - return err - } - err = e.explainPlanInRowFormatCTE() - if err != nil { - return err + flat := FlattenPhysicalPlan(e.TargetPlan, true) + e.explainFlatPlanInRowFormat(flat) + if e.Analyze && + e.SCtx().GetSessionVars().MemoryDebugModeMinHeapInUse != 0 && + e.SCtx().GetSessionVars().MemoryDebugModeAlarmRatio > 0 { + row := e.Rows[0] + tracker := e.SCtx().GetSessionVars().StmtCtx.MemTracker + row[7] = row[7] + "(Total: " + tracker.FormatBytes(tracker.MaxConsumed()) + ")" } } case types.ExplainFormatDOT: @@ -1269,194 +1257,113 @@ func (e *Explain) RenderResult() error { e.prepareDotInfo(physicalPlan) } case types.ExplainFormatHint: - hints := GenHintsFromPhysicalPlan(e.TargetPlan) + flat := FlattenPhysicalPlan(e.TargetPlan, false) + hints := GenHintsFromFlatPlan(flat) hints = append(hints, hint.ExtractTableHintsFromStmtNode(e.ExecStmt, nil)...) e.Rows = append(e.Rows, []string{hint.RestoreOptimizerHints(hints)}) + case types.ExplainFormatBinary: + flat := FlattenPhysicalPlan(e.TargetPlan, false) + str := BinaryPlanStrFromFlatPlan(e.ctx, flat) + e.Rows = append(e.Rows, []string{str}) default: return errors.Errorf("explain format '%s' is not supported now", e.Format) } return nil } -func (e *Explain) explainPlanInRowFormatCTE() (err error) { - explainedCTEPlan := make(map[int]struct{}) - for i := 0; i < len(e.ctes); i++ { - x := (*CTEDefinition)(e.ctes[i]) - // skip if the CTE has been explained, the same CTE has same IDForStorage - if _, ok := explainedCTEPlan[x.CTE.IDForStorage]; ok { - continue - } - e.prepareOperatorInfo(x, "root", "", "", true) - childIndent := texttree.Indent4Child("", true) - err = e.explainPlanInRowFormat(x.SeedPlan, "root", "(Seed Part)", childIndent, x.RecurPlan == nil) - if x.RecurPlan != nil { - err = e.explainPlanInRowFormat(x.RecurPlan, "root", "(Recursive Part)", childIndent, true) +func (e *Explain) explainFlatPlanInRowFormat(flat *FlatPhysicalPlan) { + if flat == nil || len(flat.Main) == 0 || flat.InExplain { + return + } + for _, flatOp := range flat.Main { + e.explainFlatOpInRowFormat(flatOp) + } + for _, cte := range flat.CTEs { + for _, flatOp := range cte { + e.explainFlatOpInRowFormat(flatOp) } - explainedCTEPlan[x.CTE.IDForStorage] = struct{}{} } - - return } -// explainPlanInRowFormat generates explain information for root-tasks. -func (e *Explain) explainPlanInRowFormat(p Plan, taskType, driverSide, indent string, isLastChild bool) (err error) { - e.prepareOperatorInfo(p, taskType, driverSide, indent, isLastChild) - e.explainedPlans[p.ID()] = true +func (e *Explain) explainFlatOpInRowFormat(flatOp *FlatOperator) { + taskTp := "" + if flatOp.IsRoot { + taskTp = "root" + } else { + taskTp = flatOp.ReqType.Name() + "[" + flatOp.StoreType.Name() + "]" + } + textTreeExplainID := texttree.PrettyIdentifier(flatOp.Origin.ExplainID().String()+flatOp.Label.String(), + flatOp.TextTreeIndent, + flatOp.IsLastChild) + e.prepareOperatorInfo(flatOp.Origin, taskTp, textTreeExplainID) if e.ctx != nil && e.ctx.GetSessionVars() != nil && e.ctx.GetSessionVars().StmtCtx != nil { - if optimInfo, ok := e.ctx.GetSessionVars().StmtCtx.OptimInfo[p.ID()]; ok { + if optimInfo, ok := e.ctx.GetSessionVars().StmtCtx.OptimInfo[flatOp.Origin.ID()]; ok { e.ctx.GetSessionVars().StmtCtx.AppendNote(errors.New(optimInfo)) } } - - // For every child we create a new sub-tree rooted by it. - childIndent := texttree.Indent4Child(indent, isLastChild) - - if physPlan, ok := p.(PhysicalPlan); ok { - // indicate driven side and driving side of 'join' and 'apply' - // See issue https://github.com/pingcap/tidb/issues/14602. - driverSideInfo := make([]string, len(physPlan.Children())) - buildSide := -1 - - switch plan := physPlan.(type) { - case *PhysicalApply: - buildSide = plan.InnerChildIdx ^ 1 - case *PhysicalHashJoin: - if plan.UseOuterToBuild { - buildSide = plan.InnerChildIdx ^ 1 - } else { - buildSide = plan.InnerChildIdx - } - case *PhysicalMergeJoin: - if plan.JoinType == RightOuterJoin { - buildSide = 0 - } else { - buildSide = 1 - } - case *PhysicalIndexJoin: - buildSide = plan.InnerChildIdx ^ 1 - case *PhysicalIndexMergeJoin: - buildSide = plan.InnerChildIdx ^ 1 - case *PhysicalIndexHashJoin: - buildSide = plan.InnerChildIdx ^ 1 - } - - if buildSide != -1 { - driverSideInfo[0], driverSideInfo[1] = "(Build)", "(Probe)" - } else { - buildSide = 0 - } - - // Always put the Build above the Probe. - for i := range physPlan.Children() { - pchild := &physPlan.Children()[i^buildSide] - if e.explainedPlans[(*pchild).ID()] { - continue - } - err = e.explainPlanInRowFormat(*pchild, taskType, driverSideInfo[i], childIndent, i == len(physPlan.Children())-1) - if err != nil { - return - } - } - } - - switch x := p.(type) { - case *PhysicalTableReader: - switch x.StoreType { - case kv.TiKV, kv.TiFlash, kv.TiDB: - // expected do nothing - default: - return errors.Errorf("the store type %v is unknown", x.StoreType) - } - taskName := x.ReadReqType.Name() + "[" + x.StoreType.Name() + "]" - err = e.explainPlanInRowFormat(x.tablePlan, taskName, "", childIndent, true) - case *PhysicalIndexReader: - err = e.explainPlanInRowFormat(x.indexPlan, "cop[tikv]", "", childIndent, true) - case *PhysicalIndexLookUpReader: - err = e.explainPlanInRowFormat(x.indexPlan, "cop[tikv]", "(Build)", childIndent, false) - if err != nil { - return - } - err = e.explainPlanInRowFormat(x.tablePlan, "cop[tikv]", "(Probe)", childIndent, true) - case *PhysicalIndexMergeReader: - for _, pchild := range x.partialPlans { - err = e.explainPlanInRowFormat(pchild, "cop[tikv]", "(Build)", childIndent, false) - if err != nil { - return - } - } - err = e.explainPlanInRowFormat(x.tablePlan, "cop[tikv]", "(Probe)", childIndent, true) - case *Insert: - if x.SelectPlan != nil { - err = e.explainPlanInRowFormat(x.SelectPlan, "root", "", childIndent, true) - } - case *Update: - if x.SelectPlan != nil { - err = e.explainPlanInRowFormat(x.SelectPlan, "root", "", childIndent, true) - } - case *Delete: - if x.SelectPlan != nil { - err = e.explainPlanInRowFormat(x.SelectPlan, "root", "", childIndent, true) - } - case *Execute: - if x.Plan != nil { - err = e.explainPlanInRowFormat(x.Plan, "root", "", indent, true) - } - case *PhysicalCTE: - e.ctes = append(e.ctes, x) - case *PhysicalShuffleReceiverStub: - err = e.explainPlanInRowFormat(x.DataSource, "root", "", childIndent, true) - } - return } -func getRuntimeInfo(ctx sessionctx.Context, p Plan, runtimeStatsColl *execdetails.RuntimeStatsColl) (actRows, analyzeInfo, memoryInfo, diskInfo string) { +func getRuntimeInfoStr(ctx sessionctx.Context, p Plan, runtimeStatsColl *execdetails.RuntimeStatsColl) (actRows, analyzeInfo, memoryInfo, diskInfo string) { if runtimeStatsColl == nil { runtimeStatsColl = ctx.GetSessionVars().StmtCtx.RuntimeStatsColl if runtimeStatsColl == nil { return } } - explainID := p.ID() - - // There maybe some mock information for cop task to let runtimeStatsColl.Exists(p.ExplainID()) is true. - // So check copTaskExecDetail first and print the real cop task information if it's not empty. - if runtimeStatsColl.ExistsRootStats(explainID) { - rootStats := runtimeStatsColl.GetRootStats(explainID) - analyzeInfo = rootStats.String() + rootStats, copStats, memTracker, diskTracker := getRuntimeInfo(ctx, p, runtimeStatsColl) + actRows = "0" + memoryInfo = "N/A" + diskInfo = "N/A" + if rootStats != nil { actRows = strconv.FormatInt(rootStats.GetActRows(), 10) - } else { - actRows = "0" + analyzeInfo = rootStats.String() } - if runtimeStatsColl.ExistsCopStats(explainID) { + if copStats != nil { if len(analyzeInfo) > 0 { analyzeInfo += ", " } - copStats := runtimeStatsColl.GetCopStats(explainID) analyzeInfo += copStats.String() actRows = strconv.FormatInt(copStats.GetActRows(), 10) } - memoryInfo = "N/A" - memTracker := ctx.GetSessionVars().StmtCtx.MemTracker.SearchTrackerWithoutLock(p.ID()) if memTracker != nil { memoryInfo = memTracker.FormatBytes(memTracker.MaxConsumed()) } - - diskInfo = "N/A" - diskTracker := ctx.GetSessionVars().StmtCtx.DiskTracker.SearchTrackerWithoutLock(p.ID()) if diskTracker != nil { diskInfo = diskTracker.FormatBytes(diskTracker.MaxConsumed()) } return } +func getRuntimeInfo(ctx sessionctx.Context, p Plan, runtimeStatsColl *execdetails.RuntimeStatsColl) ( + rootStats *execdetails.RootRuntimeStats, + copStats *execdetails.CopRuntimeStats, + memTracker *memory.Tracker, + diskTracker *memory.Tracker, +) { + if runtimeStatsColl == nil { + runtimeStatsColl = ctx.GetSessionVars().StmtCtx.RuntimeStatsColl + } + explainID := p.ID() + // There maybe some mock information for cop task to let runtimeStatsColl.Exists(p.ExplainID()) is true. + // So check copTaskExecDetail first and print the real cop task information if it's not empty. + if runtimeStatsColl != nil && runtimeStatsColl.ExistsRootStats(explainID) { + rootStats = runtimeStatsColl.GetRootStats(explainID) + } + if runtimeStatsColl != nil && runtimeStatsColl.ExistsCopStats(explainID) { + copStats = runtimeStatsColl.GetCopStats(explainID) + } + memTracker = ctx.GetSessionVars().StmtCtx.MemTracker.SearchTrackerWithoutLock(p.ID()) + diskTracker = ctx.GetSessionVars().StmtCtx.DiskTracker.SearchTrackerWithoutLock(p.ID()) + return +} + // prepareOperatorInfo generates the following information for every plan: // operator id, estimated rows, task type, access object and other operator info. -func (e *Explain) prepareOperatorInfo(p Plan, taskType, driverSide, indent string, isLastChild bool) { +func (e *Explain) prepareOperatorInfo(p Plan, taskType, id string) { if p.ExplainID().String() == "_0" { return } - id := texttree.PrettyIdentifier(p.ExplainID().String()+driverSide, indent, isLastChild) estRows, estCost, accessObject, operatorInfo := e.getOperatorInfo(p, id) var row []string @@ -1465,7 +1372,7 @@ func (e *Explain) prepareOperatorInfo(p Plan, taskType, driverSide, indent strin if strings.ToLower(e.Format) == types.ExplainFormatVerbose || strings.ToLower(e.Format) == types.ExplainFormatTrueCardCost { row = append(row, estCost) } - actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(e.ctx, p, e.RuntimeStatsColl) + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfoStr(e.ctx, p, e.RuntimeStatsColl) row = append(row, actRows, taskType, accessObject, analyzeInfo, operatorInfo, memoryInfo, diskInfo) } else { row = []string{id, estRows} @@ -1513,6 +1420,150 @@ func (e *Explain) getOperatorInfo(p Plan, id string) (string, string, string, st return estRows, estCost, accessObject, operatorInfo } +// BinaryPlanStrFromFlatPlan generates the compressed and encoded binary plan from a FlatPhysicalPlan. +func BinaryPlanStrFromFlatPlan(explainCtx sessionctx.Context, flat *FlatPhysicalPlan) string { + binary := binaryDataFromFlatPlan(explainCtx, flat) + if binary == nil { + return "" + } + proto, err := binary.Marshal() + if err != nil { + return "" + } + str := plancodec.Compress(proto) + return str +} + +func binaryDataFromFlatPlan(explainCtx sessionctx.Context, flat *FlatPhysicalPlan) *tipb.ExplainData { + if len(flat.Main) == 0 { + return nil + } + // Please see comments in EncodeFlatPlan() for this case. + // We keep consistency with EncodeFlatPlan() here. + if flat.InExecute { + return nil + } + res := &tipb.ExplainData{} + for _, op := range flat.Main { + // We assume that runtime stats are available to this plan tree if any operator in the "Main" has runtime stats. + rootStats, copStats, _, _ := getRuntimeInfo(explainCtx, op.Origin, nil) + if rootStats != nil || copStats != nil { + res.WithRuntimeStats = true + break + } + } + res.Main = binaryOpTreeFromFlatOps(explainCtx, flat.Main) + for _, explainedCTE := range flat.CTEs { + res.Ctes = append(res.Ctes, binaryOpTreeFromFlatOps(explainCtx, explainedCTE)) + } + return res +} + +func binaryOpTreeFromFlatOps(explainCtx sessionctx.Context, ops FlatPlanTree) *tipb.ExplainOperator { + s := make([]tipb.ExplainOperator, len(ops)) + for i, op := range ops { + binaryOpFromFlatOp(explainCtx, op, &s[i]) + for _, idx := range op.ChildrenIdx { + s[i].Children = append(s[i].Children, &s[idx]) + } + } + return &s[0] +} + +func binaryOpFromFlatOp(explainCtx sessionctx.Context, op *FlatOperator, out *tipb.ExplainOperator) { + out.Name = op.Origin.ExplainID().String() + switch op.Label { + case BuildSide: + out.Labels = []tipb.OperatorLabel{tipb.OperatorLabel_buildSide} + case ProbeSide: + out.Labels = []tipb.OperatorLabel{tipb.OperatorLabel_probeSide} + case SeedPart: + out.Labels = []tipb.OperatorLabel{tipb.OperatorLabel_seedPart} + case RecursivePart: + out.Labels = []tipb.OperatorLabel{tipb.OperatorLabel_recursivePart} + } + switch op.StoreType { + case kv.TiDB: + out.StoreType = tipb.StoreType_tidb + case kv.TiKV: + out.StoreType = tipb.StoreType_tikv + case kv.TiFlash: + out.StoreType = tipb.StoreType_tiflash + } + if op.IsRoot { + out.TaskType = tipb.TaskType_root + } else { + switch op.ReqType { + case Cop: + out.TaskType = tipb.TaskType_cop + case BatchCop: + out.TaskType = tipb.TaskType_batchCop + case MPP: + out.TaskType = tipb.TaskType_mpp + } + } + + // Runtime info + rootStats, copStats, memTracker, diskTracker := getRuntimeInfo(explainCtx, op.Origin, nil) + if statsInfo := op.Origin.statsInfo(); statsInfo != nil { + out.EstRows = statsInfo.RowCount + } + if op.IsPhysicalPlan { + p := op.Origin.(PhysicalPlan) + if p.SCtx().GetSessionVars().EnableNewCostInterface { + out.Cost, _ = p.GetPlanCost(property.RootTaskType, 0) + } else { + out.Cost = p.Cost() + } + } + if rootStats != nil { + basic, groups := rootStats.MergeStats() + out.RootBasicExecInfo = basic.String() + for _, group := range groups { + str := group.String() + if len(str) > 0 { + out.RootGroupExecInfo = append(out.RootGroupExecInfo, str) + } + } + out.ActRows = uint64(rootStats.GetActRows()) + } + if copStats != nil { + out.CopExecInfo = copStats.String() + out.ActRows = uint64(copStats.GetActRows()) + } + if memTracker != nil { + out.MemoryBytes = memTracker.MaxConsumed() + } else { + out.MemoryBytes = -1 + } + if diskTracker != nil { + out.DiskBytes = diskTracker.MaxConsumed() + } else { + out.DiskBytes = -1 + } + + // Operator info + if plan, ok := op.Origin.(dataAccesser); ok { + out.OperatorInfo = plan.OperatorInfo(false) + } else { + out.OperatorInfo = op.Origin.ExplainInfo() + } + + // Access object + switch p := op.Origin.(type) { + case dataAccesser: + ao := p.AccessObject() + if ao != nil { + ao.SetIntoPB(out) + } + case partitionAccesser: + ao := p.accessObject(explainCtx) + if ao != nil { + ao.SetIntoPB(out) + } + } +} + func (e *Explain) prepareDotInfo(p PhysicalPlan) { buffer := bytes.NewBufferString("") fmt.Fprintf(buffer, "\ndigraph %s {\n", p.ExplainID()) diff --git a/planner/core/encode.go b/planner/core/encode.go index 28ea98cd9936b..cc7b3955ecd9c 100644 --- a/planner/core/encode.go +++ b/planner/core/encode.go @@ -18,6 +18,7 @@ import ( "bytes" "crypto/sha256" "hash" + "strconv" "sync" "github.com/pingcap/failpoint" @@ -26,6 +27,106 @@ import ( "github.com/pingcap/tidb/util/plancodec" ) +// EncodeFlatPlan encodes a FlatPhysicalPlan with compression. +func EncodeFlatPlan(flat *FlatPhysicalPlan) string { + if len(flat.Main) == 0 { + return "" + } + // We won't collect the plan when we're in "EXPLAIN FOR" statement and the plan is from EXECUTE statement (please + // read comments of InExecute for details about the meaning of InExecute) because we are unable to get some + // necessary information when the execution of the plan is finished and some states in the session such as + // PreparedParams are cleaned. + // The behavior in BinaryPlanStrFromFlatPlan() is also the same. + if flat.InExecute { + return "" + } + failpoint.Inject("mockPlanRowCount", func(val failpoint.Value) { + selectPlan := flat.Main.GetSelectPlan() + for _, op := range selectPlan { + op.Origin.statsInfo().RowCount = float64(val.(int)) + } + }) + pn := encoderPool.Get().(*planEncoder) + defer func() { + pn.buf.Reset() + encoderPool.Put(pn) + }() + buf := pn.buf + buf.Reset() + opCount := len(flat.Main) + for _, cte := range flat.CTEs { + opCount += len(cte) + } + // assume an operator costs around 80 bytes, preallocate space for them + buf.Grow(80 * opCount) + encodeFlatPlanTree(flat.Main, 0, &buf) + for _, cte := range flat.CTEs { + op := cte[0] + cteDef := cte[0].Origin.(*CTEDefinition) + id := cteDef.CTE.IDForStorage + tp := plancodec.TypeCTEDefinition + taskTypeInfo := plancodec.EncodeTaskType(op.IsRoot, op.StoreType) + p := op.Origin + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfoStr(p.SCtx(), p, nil) + var estRows float64 + if statsInfo := p.statsInfo(); statsInfo != nil { + estRows = statsInfo.RowCount + } + plancodec.EncodePlanNode( + int(op.Depth), + strconv.Itoa(id)+op.Label.String(), + tp, + estRows, + taskTypeInfo, + op.Origin.ExplainInfo(), + actRows, + analyzeInfo, + memoryInfo, + diskInfo, + &buf, + ) + if len(cte) > 1 { + encodeFlatPlanTree(cte[1:], 1, &buf) + } + } + return plancodec.Compress(buf.Bytes()) +} + +func encodeFlatPlanTree(flatTree FlatPlanTree, offset int, buf *bytes.Buffer) { + for _, op := range flatTree { + taskTypeInfo := plancodec.EncodeTaskType(op.IsRoot, op.StoreType) + p := op.Origin + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfoStr(p.SCtx(), p, nil) + var estRows float64 + if statsInfo := p.statsInfo(); statsInfo != nil { + estRows = statsInfo.RowCount + } + plancodec.EncodePlanNode( + int(op.Depth), + strconv.Itoa(op.Origin.ID())+op.Label.String(), + op.Origin.TP(), + estRows, + taskTypeInfo, + op.Origin.ExplainInfo(), + actRows, + analyzeInfo, + memoryInfo, + diskInfo, + buf, + ) + + // If NeedReverseDriverSide is true, we stop using the order of the slice and switch to recursively + // call encodeFlatPlanTree to keep build side before probe side. + if op.NeedReverseDriverSide { + buildSide := flatTree[op.ChildrenIdx[1]-offset:] + probeSide := flatTree[op.ChildrenIdx[0]-offset : op.ChildrenIdx[1]-offset] + encodeFlatPlanTree(buildSide, op.ChildrenIdx[1], buf) + encodeFlatPlanTree(probeSide, op.ChildrenIdx[0], buf) + break + } + } +} + var encoderPool = sync.Pool{ New: func() interface{} { return &planEncoder{} @@ -40,6 +141,7 @@ type planEncoder struct { } // EncodePlan is used to encodePlan the plan to the plan tree with compressing. +// Deprecated: FlattenPhysicalPlan() + EncodeFlatPlan() is preferred. func EncodePlan(p Plan) string { if explain, ok := p.(*Explain); ok { p = explain.TargetPlan @@ -79,12 +181,12 @@ func (pn *planEncoder) encodeCTEPlan() { continue } taskTypeInfo := plancodec.EncodeTaskType(true, kv.TiKV) - actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(x.SCtx(), x, nil) + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfoStr(x.SCtx(), x, nil) rowCount := 0.0 if statsInfo := x.statsInfo(); statsInfo != nil { rowCount = x.statsInfo().RowCount } - plancodec.EncodePlanNode(0, x.CTE.IDForStorage, plancodec.TypeCTEDefinition, rowCount, taskTypeInfo, x.ExplainInfo(), actRows, analyzeInfo, memoryInfo, diskInfo, &pn.buf) + plancodec.EncodePlanNode(0, strconv.Itoa(x.CTE.IDForStorage), plancodec.TypeCTEDefinition, rowCount, taskTypeInfo, x.ExplainInfo(), actRows, analyzeInfo, memoryInfo, diskInfo, &pn.buf) pn.encodePlan(x.SeedPlan, true, kv.TiKV, 1) if x.RecurPlan != nil { pn.encodePlan(x.RecurPlan, true, kv.TiKV, 1) @@ -95,12 +197,12 @@ func (pn *planEncoder) encodeCTEPlan() { func (pn *planEncoder) encodePlan(p Plan, isRoot bool, store kv.StoreType, depth int) { taskTypeInfo := plancodec.EncodeTaskType(isRoot, store) - actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfo(p.SCtx(), p, nil) + actRows, analyzeInfo, memoryInfo, diskInfo := getRuntimeInfoStr(p.SCtx(), p, nil) rowCount := 0.0 if statsInfo := p.statsInfo(); statsInfo != nil { rowCount = p.statsInfo().RowCount } - plancodec.EncodePlanNode(depth, p.ID(), p.TP(), rowCount, taskTypeInfo, p.ExplainInfo(), actRows, analyzeInfo, memoryInfo, diskInfo, &pn.buf) + plancodec.EncodePlanNode(depth, strconv.Itoa(p.ID()), p.TP(), rowCount, taskTypeInfo, p.ExplainInfo(), actRows, analyzeInfo, memoryInfo, diskInfo, &pn.buf) pn.encodedPlans[p.ID()] = true depth++ @@ -152,23 +254,61 @@ type planDigester struct { hasher hash.Hash } +// NormalizeFlatPlan normalizes a FlatPhysicalPlan and generates plan digest. +func NormalizeFlatPlan(flat *FlatPhysicalPlan) (normalized string, digest *parser.Digest) { + selectPlan := flat.Main.GetSelectPlan() + if len(selectPlan) == 0 || !selectPlan[0].IsPhysicalPlan { + return "", parser.NewDigest(nil) + } + d := digesterPool.Get().(*planDigester) + defer func() { + d.buf.Reset() + d.hasher.Reset() + digesterPool.Put(d) + }() + // assume an operator costs around 30 bytes, preallocate space for them + d.buf.Grow(30 * len(selectPlan)) + depthOffset := len(flat.Main) - len(selectPlan) + for _, op := range selectPlan { + taskTypeInfo := plancodec.EncodeTaskTypeForNormalize(op.IsRoot, op.StoreType) + p := op.Origin.(PhysicalPlan) + plancodec.NormalizePlanNode( + int(op.Depth-uint32(depthOffset)), + op.Origin.TP(), + taskTypeInfo, + p.ExplainNormalizedInfo(), + &d.buf, + ) + } + normalized = d.buf.String() + _, err := d.hasher.Write(d.buf.Bytes()) + if err != nil { + panic(err) + } + digest = parser.NewDigest(d.hasher.Sum(nil)) + return +} + // NormalizePlan is used to normalize the plan and generate plan digest. +// Deprecated: FlattenPhysicalPlan() + NormalizeFlatPlan() is preferred. func NormalizePlan(p Plan) (normalized string, digest *parser.Digest) { selectPlan := getSelectPlan(p) if selectPlan == nil { return "", parser.NewDigest(nil) } d := digesterPool.Get().(*planDigester) - defer digesterPool.Put(d) + defer func() { + d.buf.Reset() + d.hasher.Reset() + digesterPool.Put(d) + }() d.normalizePlanTree(selectPlan) normalized = d.buf.String() _, err := d.hasher.Write(d.buf.Bytes()) if err != nil { panic(err) } - d.buf.Reset() digest = parser.NewDigest(d.hasher.Sum(nil)) - d.hasher.Reset() return } diff --git a/planner/core/enforce_mpp_test.go b/planner/core/enforce_mpp_test.go index dab97226f436e..5b39a08bdd8cb 100644 --- a/planner/core/enforce_mpp_test.go +++ b/planner/core/enforce_mpp_test.go @@ -441,3 +441,55 @@ func TestMPP2PhaseAggPushDown(t *testing.T) { require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) } } + +// Test skewed group distinct aggregate rewrite for MPP mode +func TestMPPSkewedGroupDistinctRewrite(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + // test table + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b bigint not null, c bigint, d date, e varchar(20))") + + // 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, + } + } + } + + var input []string + var output []struct { + SQL string + Plan []string + Warn []string + } + enforceMPPSuiteData := plannercore.GetEnforceMPPSuiteData() + enforceMPPSuiteData.GetTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + }) + if strings.HasPrefix(tt, "set") || strings.HasPrefix(tt, "UPDATE") { + tk.MustExec(tt) + continue + } + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Warn = testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + require.Equal(t, output[i].Warn, testdata.ConvertSQLWarnToStrings(tk.Session().GetSessionVars().StmtCtx.GetWarnings())) + } +} diff --git a/planner/core/exhaust_physical_plans.go b/planner/core/exhaust_physical_plans.go index e70a17e040cd3..ff5265e2f8da7 100644 --- a/planner/core/exhaust_physical_plans.go +++ b/planner/core/exhaust_physical_plans.go @@ -822,7 +822,7 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( } joins = make([]PhysicalPlan, 0, 3) failpoint.Inject("MockOnlyEnableIndexHashJoin", func(val failpoint.Value) { - if val.(bool) { + if val.(bool) && !p.ctx.GetSessionVars().InRestrictedSQL { failpoint.Return(p.constructIndexHashJoin(prop, outerIdx, innerTask, nil, keyOff2IdxOff, path, lastColMng)) } }) @@ -857,7 +857,7 @@ func (p *LogicalJoin) buildIndexJoinInner2IndexScan( } innerTask := p.constructInnerIndexScanTask(ds, helper.chosenPath, helper.chosenRanges.Range(), helper.chosenRemained, outerJoinKeys, us, rangeInfo, false, false, avgInnerRowCnt, maxOneRow) failpoint.Inject("MockOnlyEnableIndexHashJoin", func(val failpoint.Value) { - if val.(bool) { + if val.(bool) && !p.ctx.GetSessionVars().InRestrictedSQL { failpoint.Return(p.constructIndexHashJoin(prop, outerIdx, innerTask, helper.chosenRanges, keyOff2IdxOff, helper.chosenPath, helper.lastColManager)) } }) @@ -1071,6 +1071,7 @@ func (p *LogicalJoin) constructInnerIndexScanTask( Columns: ds.Columns, Table: is.Table, TableAsName: ds.TableAsName, + DBName: ds.DBName, isPartition: ds.isPartition, physicalTableID: ds.physicalTableID, tblCols: ds.TblCols, @@ -1784,7 +1785,7 @@ func (p *LogicalJoin) shouldUseMPPBCJ() bool { // If the hint is not figured, we will pick all candidates. func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool, error) { failpoint.Inject("MockOnlyEnableIndexHashJoin", func(val failpoint.Value) { - if val.(bool) { + if val.(bool) && !p.ctx.GetSessionVars().InRestrictedSQL { indexJoins, _ := p.tryToGetIndexJoin(prop) failpoint.Return(indexJoins, true, nil) } @@ -2291,7 +2292,7 @@ func (lw *LogicalWindow) tryToGetMppWindows(prop *property.PhysicalProperty) []P if len(lw.PartitionBy) > 0 { partitionCols := lw.GetPartitionKeys() - // trying to match the required parititions. + // trying to match the required partitions. if prop.MPPPartitionTp == property.HashType { if matches := prop.IsSubsetOf(partitionCols); len(matches) != 0 { partitionCols = choosePartitionKeys(partitionCols, matches) @@ -2306,6 +2307,10 @@ func (lw *LogicalWindow) tryToGetMppWindows(prop *property.PhysicalProperty) []P childProperty.MPPPartitionTp = property.SinglePartitionType } + if prop.MPPPartitionTp == property.SinglePartitionType && childProperty.MPPPartitionTp != property.SinglePartitionType { + return nil + } + window := PhysicalWindow{ WindowFuncDescs: lw.WindowFuncDescs, PartitionBy: lw.PartitionBy, @@ -2596,7 +2601,7 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert if len(la.GroupByItems) > 0 { partitionCols := la.GetPotentialPartitionKeys() - // trying to match the required parititions. + // trying to match the required partitions. if prop.MPPPartitionTp == property.HashType { if matches := prop.IsSubsetOf(partitionCols); len(matches) != 0 { partitionCols = choosePartitionKeys(partitionCols, matches) @@ -2609,7 +2614,8 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert // 1-phase agg // If there are no available partition cols, but still have group by items, that means group by items are all expressions or constants. // To avoid mess, we don't do any one-phase aggregation in this case. - if len(partitionCols) != 0 { + // If this is a skew distinct group agg, skip generating 1-phase agg, because skew data will cause performance issue + if len(partitionCols) != 0 && !la.ctx.GetSessionVars().EnableSkewDistinctAgg { childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: partitionCols, CanAddEnforcer: true, RejectSort: true} agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) agg.SetSchema(la.schema.Clone()) @@ -2746,11 +2752,37 @@ func (la *LogicalAggregation) exhaustPhysicalPlans(prop *property.PhysicalProper } func (p *LogicalSelection) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool, error) { + newProps := make([]*property.PhysicalProperty, 0, 2) childProp := prop.CloneEssentialFields() - sel := PhysicalSelection{ - Conditions: p.Conditions, - }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, childProp) - return []PhysicalPlan{sel}, true, nil + newProps = append(newProps, childProp) + + if prop.TaskTp != property.MppTaskType && + p.SCtx().GetSessionVars().IsMPPAllowed() && + p.canPushDown(kv.TiFlash) { + childPropMpp := prop.CloneEssentialFields() + childPropMpp.TaskTp = property.MppTaskType + newProps = append(newProps, childPropMpp) + } + + ret := make([]PhysicalPlan, 0, len(newProps)) + for _, newProp := range newProps { + sel := PhysicalSelection{ + Conditions: p.Conditions, + }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, newProp) + ret = append(ret, sel) + } + return ret, true, nil +} + +// utility function to check whether we can push down Selection to TiKV or TiFlash +func (p *LogicalSelection) canPushDown(storeTp kv.StoreType) bool { + return !expression.ContainVirtualColumn(p.Conditions) && + p.canPushToCop(storeTp) && + expression.CanExprsPushDown( + p.SCtx().GetSessionVars().StmtCtx, + p.Conditions, + p.SCtx().GetClient(), + storeTp) } func (p *LogicalLimit) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool, error) { diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index d662020cd50e4..9b27b112f0bda 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -315,7 +315,9 @@ func (er *expressionRewriter) constructBinaryOpFunction(l expression.Expression, } } -func (er *expressionRewriter) buildSubquery(ctx context.Context, subq *ast.SubqueryExpr) (LogicalPlan, error) { +// buildSubquery translates the subquery ast to plan. +// Currently, only the EXIST can apply the rewrite hint(rewrite the semi join to inner join with aggregation). +func (er *expressionRewriter) buildSubquery(ctx context.Context, subq *ast.SubqueryExpr, rewriteHintCanTakeEffect bool) (np LogicalPlan, hasSemiJoinRewriteHint bool, err error) { if er.schema != nil { outerSchema := er.schema.Clone() er.b.outerSchemas = append(er.b.outerSchemas, outerSchema) @@ -325,18 +327,25 @@ func (er *expressionRewriter) buildSubquery(ctx context.Context, subq *ast.Subqu er.b.outerNames = er.b.outerNames[0 : len(er.b.outerNames)-1] }() } + // Store the old value before we enter the subquery and reset they to default value. + oldRewriteHintCanTakeEffect := er.b.checkSemiJoinHint + er.b.checkSemiJoinHint = rewriteHintCanTakeEffect + oldHasHint := er.b.hasValidSemiJoinHint + er.b.hasValidSemiJoinHint = false outerWindowSpecs := er.b.windowSpecs defer func() { er.b.windowSpecs = outerWindowSpecs + er.b.checkSemiJoinHint = oldRewriteHintCanTakeEffect + er.b.hasValidSemiJoinHint = oldHasHint }() - np, err := er.b.buildResultSetNode(ctx, subq.Query) + np, err = er.b.buildResultSetNode(ctx, subq.Query) if err != nil { - return nil, err + return nil, false, err } // Pop the handle map generated by the subquery. er.b.handleHelper.popMap() - return np, nil + return np, er.b.hasValidSemiJoinHint, nil } // Enter implements Visitor interface. @@ -500,7 +509,7 @@ 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) + er.p, er.err = er.b.buildSemiApply(er.p, np, []expression.Expression{condition}, er.asScalar, not, false) } func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast.CompareSubqueryExpr) (ast.Node, bool) { @@ -516,7 +525,7 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. er.err = errors.Errorf("Unknown compare type %T", v.R) return v, true } - np, err := er.buildSubquery(ctx, subq) + np, _, err := er.buildSubquery(ctx, subq, false) if err != nil { er.err = err return v, true @@ -690,7 +699,7 @@ 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) + er.p, er.err = er.b.buildSemiApply(er.p, plan4Agg, []expression.Expression{cond}, false, false, false) 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. @@ -810,14 +819,14 @@ func (er *expressionRewriter) handleExistSubquery(ctx context.Context, v *ast.Ex er.err = errors.Errorf("Unknown exists type %T", v.Sel) return v, true } - np, err := er.buildSubquery(ctx, subq) + np, hasRewriteHint, err := er.buildSubquery(ctx, subq, true) if err != nil { er.err = err return v, true } np = er.popExistsSubPlan(np) if len(ExtractCorrelatedCols4LogicalPlan(np)) > 0 { - er.p, er.err = er.b.buildSemiApply(er.p, np, nil, er.asScalar, v.Not) + er.p, er.err = er.b.buildSemiApply(er.p, np, nil, er.asScalar, v.Not, hasRewriteHint) if er.err != nil || !er.asScalar { return v, true } @@ -884,7 +893,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, err := er.buildSubquery(ctx, subq) + np, _, err := er.buildSubquery(ctx, subq, false) if err != nil { er.err = err return v, true @@ -968,7 +977,7 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte } er.p = join } else { - er.p, er.err = er.b.buildSemiApply(er.p, np, expression.SplitCNFItems(checkCondition), asScalar, v.Not) + er.p, er.err = er.b.buildSemiApply(er.p, np, expression.SplitCNFItems(checkCondition), asScalar, v.Not, false) if er.err != nil { return v, true } @@ -985,7 +994,7 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.SubqueryExpr) (ast.Node, bool) { ci := er.b.prepareCTECheckForSubQuery() defer resetCTECheckForSubQuery(ci) - np, err := er.buildSubquery(ctx, v) + np, _, err := er.buildSubquery(ctx, v, false) if err != nil { er.err = err return v, true @@ -1292,7 +1301,7 @@ func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { } sysVar := variable.GetSysVar(name) if sysVar == nil { - er.err = variable.ErrUnknownSystemVar.GenWithStackByArgs(name) + er.err = variable.ErrUnknownSystemVar.FastGenByArgs(name) if err := variable.CheckSysVarIsRemoved(name); err != nil { // Removed vars still return an error, but we customize it from // "unknown" to an explanation of why it is not supported. diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 13c559d9c66c5..1d97e73cf8541 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -289,30 +289,35 @@ func (p *baseLogicalPlan) enumeratePhysicalPlans4Task(physicalPlans []PhysicalPl // compareTaskCost compares cost of curTask and bestTask and returns whether curTask's cost is smaller than bestTask's. func compareTaskCost(ctx sessionctx.Context, curTask, bestTask task) (curIsBetter bool, err error) { - if curTask.invalid() { + curCost, curInvalid, err := getTaskPlanCost(curTask) + if err != nil { + return false, err + } + bestCost, bestInvalid, err := getTaskPlanCost(bestTask) + if err != nil { + return false, err + } + if curInvalid { return false, nil } - if bestTask.invalid() { + if bestInvalid { return true, nil } - if ctx.GetSessionVars().EnableNewCostInterface { // use the new cost interface - curCost, err := getTaskPlanCost(curTask) - if err != nil { - return false, err - } - bestCost, err := getTaskPlanCost(bestTask) - if err != nil { - return false, err - } - return curCost < bestCost, nil - } - return curTask.cost() < bestTask.cost(), nil + return curCost < bestCost, nil } -func getTaskPlanCost(t task) (float64, error) { +// getTaskPlanCost returns the cost of this task. +// The new cost interface will be used if EnableNewCostInterface is true. +// The second returned value indicates whether this task is valid. +func getTaskPlanCost(t task) (float64, bool, error) { if t.invalid() { - return math.MaxFloat64, nil + return math.MaxFloat64, true, nil } + if !t.plan().SCtx().GetSessionVars().EnableNewCostInterface { + return t.cost(), false, nil + } + + // use the new cost interface var taskType property.TaskType switch t.(type) { case *rootTask: @@ -322,9 +327,10 @@ func getTaskPlanCost(t task) (float64, error) { case *mppTask: taskType = property.MppTaskType default: - return 0, errors.New("unknown task type") + return 0, false, errors.New("unknown task type") } - return t.plan().GetPlanCost(taskType, 0) + cost, err := t.plan().GetPlanCost(taskType, 0) + return cost, false, err } type physicalOptimizeOp struct { @@ -341,30 +347,16 @@ func (op *physicalOptimizeOp) withEnableOptimizeTracer(tracer *tracing.PhysicalO return op } -func (op *physicalOptimizeOp) buildPhysicalOptimizeTraceInfo(p LogicalPlan) { - if op == nil || op.tracer == nil { - return - } - name := tracing.CodecPlanName(p.TP(), p.ID()) - if _, ok := op.tracer.State[name]; !ok { - op.tracer.State[name] = make(map[string]*tracing.PlanTrace) - } -} - func (op *physicalOptimizeOp) appendCandidate(lp LogicalPlan, pp PhysicalPlan, prop *property.PhysicalProperty) { if op == nil || op.tracer == nil || pp == nil { return } - PhysicalPlanTrace := &tracing.PlanTrace{TP: pp.TP(), ID: pp.ID(), - ExplainInfo: pp.ExplainInfo(), Cost: pp.Cost(), ProperType: prop.String()} - name := tracing.CodecPlanName(lp.TP(), lp.ID()) - key := tracing.CodecPlanName(pp.TP(), pp.ID()) - pps := op.tracer.State[name] - if pps == nil { - op.buildPhysicalOptimizeTraceInfo(lp) - } - pps[key] = PhysicalPlanTrace - op.tracer.State[name] = pps + candidate := &tracing.CandidatePlanTrace{ + PlanTrace: &tracing.PlanTrace{TP: pp.TP(), ID: pp.ID(), + ExplainInfo: pp.ExplainInfo(), Cost: pp.Cost(), ProperType: prop.String()}, + MappingLogicalPlan: tracing.CodecPlanName(lp.TP(), lp.ID())} + op.tracer.AppendCandidate(candidate) + pp.appendChildCandidate(op) } // findBestTask implements LogicalPlan interface. @@ -439,7 +431,6 @@ func (p *baseLogicalPlan) findBestTask(prop *property.PhysicalProperty, planCoun var cnt int64 var curTask task - opt.buildPhysicalOptimizeTraceInfo(p) if bestTask, cnt, err = p.enumeratePhysicalPlans4Task(plansFitsProp, newProp, false, planCounter, opt); err != nil { return nil, 0, err } @@ -876,7 +867,6 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter } }() - opt.buildPhysicalOptimizeTraceInfo(ds) cntPlan = 0 for _, candidate := range candidates { path := candidate.path @@ -1401,6 +1391,7 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, Columns: ds.Columns, Table: is.Table, TableAsName: ds.TableAsName, + DBName: ds.DBName, isPartition: ds.isPartition, physicalTableID: ds.physicalTableID, tblCols: ds.TblCols, @@ -1887,7 +1878,8 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid return invalidTask, nil } ts, cost, _ := ds.getOriginalPhysicalTableScan(prop, candidate.path, candidate.isMatchProp) - if ts.KeepOrder && ts.Desc && ts.StoreType == kv.TiFlash { + if ts.KeepOrder && ts.StoreType == kv.TiFlash && (ts.Desc || ts.Table.TiFlashMode == model.TiFlashModeFast) { + // TiFlash fast mode(https://github.com/pingcap/tidb/pull/35851) does not keep order in TableScan return invalidTask, nil } if prop.TaskTp == property.MppTaskType { @@ -1917,7 +1909,7 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid ColumnNames: ds.names, } ts.cost = cost - mppTask = ts.addPushedDownSelectionToMppTask(mppTask, ds.stats) + mppTask = ts.addPushedDownSelectionToMppTask(mppTask, ds.stats.ScaleByExpectCnt(prop.ExpectedCnt)) return mppTask, nil } copTask := &copTask{ @@ -2079,6 +2071,7 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, accessCnt := math.Min(candidate.path.CountAfterAccess, float64(len(candidate.path.Ranges))) batchPointGetPlan := BatchPointGetPlan{ ctx: ds.ctx, + dbName: ds.DBName.L, AccessConditions: candidate.path.AccessConds, TblInfo: ds.TableInfo(), KeepOrder: !prop.IsSortItemEmpty(), @@ -2212,6 +2205,7 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper HandleCols: ds.handleCols, tblCols: ds.TblCols, tblColHists: ds.TblColHists, + prop: prop, }.Init(ds.ctx, ds.blockOffset) ts.filterCondition = make([]expression.Expression, len(path.TableFilters)) copy(ts.filterCondition, path.TableFilters) @@ -2281,6 +2275,7 @@ func (ds *DataSource) getOriginalPhysicalIndexScan(prop *property.PhysicalProper physicalTableID: ds.physicalTableID, tblColHists: ds.TblColHists, pkIsHandleCol: ds.getPKIsHandleCol(), + prop: prop, }.Init(ds.ctx, ds.blockOffset) statsTbl := ds.statisticTable if statsTbl.Indices[idx.ID] != nil { diff --git a/planner/core/flat_plan.go b/planner/core/flat_plan.go new file mode 100644 index 0000000000000..717b1f415c774 --- /dev/null +++ b/planner/core/flat_plan.go @@ -0,0 +1,417 @@ +// 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 + +import ( + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/texttree" +) + +// FlatPhysicalPlan provides an easier structure to traverse a plan and collect needed information. +// Note: Although it's named FlatPhysicalPlan, there also could be Insert, Delete and Update at the beginning of Main. +type FlatPhysicalPlan struct { + Main FlatPlanTree + CTEs []FlatPlanTree + + // InExecute and InExplain are expected to handle some special cases. Usually you don't need to use them. + + // InExecute means if the original plan tree contains Execute operator. + // + // Be careful when trying to use this, InExecute is true doesn't mean we are handling an EXECUTE statement. + // When collecting information from the plan in an EXECUTE statement, usually we directly use the plan + // in Execute.Plan, not Execute itself, so InExecute will be false. + // + // When will InExecute be true? When you're using "EXPLAIN FOR CONNECTION" to get the last plan of + // a connection (usually we will record Explain.TargetPlan for an EXPLAIN statement) and that plan + // is from an EXECUTE statement, we will collect from Execute itself, not directly from Execute.Plan, + // then InExecute will be true. + InExecute bool + + // InExplain means if the original plan tree contains Explain operator. + InExplain bool + + // The fields below are only used when building the FlatPhysicalPlan. + buildSideFirst bool + ctesToFlatten []*PhysicalCTE +} + +// FlatPlanTree is a simplified plan tree. +// It arranges all operators in the tree as a slice, ordered by the order of traversing the tree, which means a +// depth-first traversal plus some special rule for some operators. +type FlatPlanTree []*FlatOperator + +// GetSelectPlan skips Insert, Delete and Update at the beginning of the FlatPlanTree. +// Note: +// It returns a reference to the original FlatPlanTree, please avoid modifying the returned value. +// Since you get a part of the original slice, you need to adjust the FlatOperator.Depth and FlatOperator.ChildrenIdx when using them. +func (e FlatPlanTree) GetSelectPlan() FlatPlanTree { + if len(e) == 0 { + return nil + } + for i, op := range e { + switch op.Origin.(type) { + case *Insert, *Delete, *Update: + default: + return e[i:] + } + } + return nil +} + +// FlatOperator is a simplified operator. +// It contains a reference to the original operator and some usually needed information. +type FlatOperator struct { + // A reference to the original operator. + Origin Plan + + ChildrenIdx []int + + // NeedReverseDriverSide means if we need to reverse the order of children to keep build side before probe side. + // + // Specifically, it means if the below are all true: + // 1. this operator has two children + // 2. the first child's Label is the probe side and the second's is the build side. + // + // If you call FlattenPhysicalPlan with buildSideFirst true, NeedReverseDriverSide will be useless. + NeedReverseDriverSide bool + + Depth uint32 + Label OperatorLabel + IsRoot bool + StoreType kv.StoreType + // ReqType is only meaningful when IsRoot is false. + ReqType ReadReqType + + // The below two fields are mainly for text tree formatting. See texttree.PrettyIdentifier(). + TextTreeIndent string + IsLastChild bool + + IsPhysicalPlan bool +} + +// OperatorLabel acts as some additional information to the name, usually it means its relationship with its parent. +// It's useful for index join, apply, index lookup, cte and so on. +type OperatorLabel uint8 + +const ( + // Empty means OperatorLabel is meaningless for this operator. + Empty OperatorLabel = iota + // BuildSide means this operator is at the build side of its parent + BuildSide + // ProbeSide means this operator is at the probe side of its parent + ProbeSide + // SeedPart means this operator is the seed part of its parent (a cte) + SeedPart + // RecursivePart means this operator is the recursive part of its parent (a cte) + RecursivePart +) + +func (d OperatorLabel) String() string { + switch d { + case Empty: + return "" + case BuildSide: + return "(Build)" + case ProbeSide: + return "(Probe)" + case SeedPart: + return "(Seed Part)" + case RecursivePart: + return "(Recursive Part)" + } + return "" +} + +type operatorCtx struct { + depth uint32 + label OperatorLabel + isRoot bool + storeType kv.StoreType + reqType ReadReqType + indent string + isLastChild bool +} + +// FlattenPhysicalPlan generates a FlatPhysicalPlan from a PhysicalPlan, Insert, Delete, Update, Explain or Execute. +func FlattenPhysicalPlan(p Plan, buildSideFirst bool) *FlatPhysicalPlan { + if p == nil { + return nil + } + res := &FlatPhysicalPlan{ + buildSideFirst: buildSideFirst, + } + initInfo := &operatorCtx{ + depth: 0, + label: Empty, + isRoot: true, + storeType: kv.TiDB, + indent: "", + isLastChild: true, + } + res.Main, _ = res.flattenRecursively(p, initInfo, nil) + + flattenedCTEPlan := make(map[int]struct{}, len(res.ctesToFlatten)) + + // Note that ctesToFlatten may be modified during the loop, so we manually loop over it instead of using for...range. + for i := 0; i < len(res.ctesToFlatten); i++ { + cte := res.ctesToFlatten[i] + cteDef := (*CTEDefinition)(cte) + if _, ok := flattenedCTEPlan[cteDef.CTE.IDForStorage]; ok { + continue + } + cteExplained := res.flattenCTERecursively(cteDef, initInfo, nil) + res.CTEs = append(res.CTEs, cteExplained) + flattenedCTEPlan[cteDef.CTE.IDForStorage] = struct{}{} + } + return res +} + +func (f *FlatPhysicalPlan) flattenSingle(p Plan, info *operatorCtx) *FlatOperator { + // Some operators are not initialized and given an ExplainID. So their explain IDs are "_0" + // (when in EXPLAIN FORMAT = 'brief' it will be ""), we skip such operators. + // Examples: Explain, Execute + if len(p.TP()) == 0 && p.ID() == 0 { + return nil + } + res := &FlatOperator{ + Origin: p, + Label: info.label, + IsRoot: info.isRoot, + StoreType: info.storeType, + Depth: info.depth, + ReqType: info.reqType, + TextTreeIndent: info.indent, + IsLastChild: info.isLastChild, + } + + if _, ok := p.(PhysicalPlan); ok { + res.IsPhysicalPlan = true + } + return res +} + +// Note that info should not be modified in this method. +func (f *FlatPhysicalPlan) flattenRecursively(p Plan, info *operatorCtx, target FlatPlanTree) (res FlatPlanTree, idx int) { + idx = -1 + flat := f.flattenSingle(p, info) + if flat != nil { + target = append(target, flat) + idx = len(target) - 1 + } + childIdxs := make([]int, 0) + var childIdx int + childCtx := &operatorCtx{ + depth: info.depth + 1, + isRoot: info.isRoot, + storeType: info.storeType, + reqType: info.reqType, + indent: texttree.Indent4Child(info.indent, info.isLastChild), + } + // For physical operators, we just enumerate their children and collect their information. + // Note that some physical operators are special, and they are handled below this part. + if physPlan, ok := p.(PhysicalPlan); ok { + label := make([]OperatorLabel, len(physPlan.Children())) + + switch plan := physPlan.(type) { + case *PhysicalApply: + label[plan.InnerChildIdx] = ProbeSide + label[1-plan.InnerChildIdx] = BuildSide + case *PhysicalHashJoin: + if plan.UseOuterToBuild { + label[plan.InnerChildIdx] = ProbeSide + label[1-plan.InnerChildIdx] = BuildSide + } else { + label[plan.InnerChildIdx] = BuildSide + label[1-plan.InnerChildIdx] = ProbeSide + } + case *PhysicalMergeJoin: + if plan.JoinType == RightOuterJoin { + label[0] = BuildSide + label[1] = ProbeSide + } else { + label[0] = ProbeSide + label[1] = BuildSide + } + case *PhysicalIndexJoin: + label[plan.InnerChildIdx] = ProbeSide + label[1-plan.InnerChildIdx] = BuildSide + case *PhysicalIndexMergeJoin: + label[plan.InnerChildIdx] = ProbeSide + label[1-plan.InnerChildIdx] = BuildSide + case *PhysicalIndexHashJoin: + label[plan.InnerChildIdx] = ProbeSide + label[1-plan.InnerChildIdx] = BuildSide + } + + children := make([]PhysicalPlan, len(physPlan.Children())) + copy(children, physPlan.Children()) + if len(label) == 2 && + label[0] == ProbeSide && + label[1] == BuildSide { + if f.buildSideFirst { + // Put the build side before the probe side if buildSideFirst is true. + label[0], label[1] = label[1], label[0] + children[0], children[1] = children[1], children[0] + } else if flat != nil { + // Set NeedReverseDriverSide to true if buildSideFirst is false. + flat.NeedReverseDriverSide = true + } + } + + for i := range children { + childCtx.label = label[i] + childCtx.isLastChild = i == len(children)-1 + target, childIdx = f.flattenRecursively(children[i], childCtx, target) + childIdxs = append(childIdxs, childIdx) + } + } + + // For part of physical operators and some special operators, we need some special logic to get their "children". + // For PhysicalCTE, we need to add the plan tree into flatTree.ctesToFlatten. + switch plan := p.(type) { + case *PhysicalTableReader: + childCtx.isRoot = false + childCtx.storeType = plan.StoreType + childCtx.reqType = plan.ReadReqType + childCtx.label = Empty + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.tablePlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + case *PhysicalIndexReader: + childCtx.isRoot = false + childCtx.reqType = Cop + childCtx.storeType = kv.TiKV + childCtx.label = Empty + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.indexPlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + case *PhysicalIndexLookUpReader: + childCtx.isRoot = false + childCtx.reqType = Cop + childCtx.storeType = kv.TiKV + childCtx.label = BuildSide + childCtx.isLastChild = false + target, childIdx = f.flattenRecursively(plan.indexPlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + childCtx.label = ProbeSide + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.tablePlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + case *PhysicalIndexMergeReader: + childCtx.isRoot = false + childCtx.reqType = Cop + childCtx.storeType = kv.TiKV + for _, pchild := range plan.partialPlans { + childCtx.label = BuildSide + childCtx.isLastChild = false + target, childIdx = f.flattenRecursively(pchild, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } + childCtx.label = ProbeSide + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.tablePlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + case *PhysicalShuffleReceiverStub: + childCtx.isRoot = true + childCtx.label = Empty + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.DataSource, childCtx, target) + childIdxs = append(childIdxs, childIdx) + case *PhysicalCTE: + f.ctesToFlatten = append(f.ctesToFlatten, plan) + case *Insert: + 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 + childCtx.label = Empty + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.SelectPlan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } + case *Delete: + 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 *Execute: + f.InExecute = true + if plan.Plan != nil { + childCtx.isRoot = true + childCtx.indent = info.indent + childCtx.label = Empty + childCtx.isLastChild = true + target, childIdx = f.flattenRecursively(plan.Plan, childCtx, target) + childIdxs = append(childIdxs, childIdx) + } + case *Explain: + f.InExplain = true + // Explain is ignored in flattenSingle(). We start to explain its TargetPlan from a new operatorCtx. + if plan.TargetPlan != nil { + initInfo := &operatorCtx{ + depth: 0, + label: Empty, + isRoot: true, + storeType: kv.TiDB, + indent: "", + isLastChild: true, + } + target, childIdx = f.flattenRecursively(plan.TargetPlan, initInfo, target) + childIdxs = append(childIdxs, childIdx) + } + } + if flat != nil { + flat.ChildrenIdx = childIdxs + } + return target, idx +} + +func (f *FlatPhysicalPlan) flattenCTERecursively(cteDef *CTEDefinition, info *operatorCtx, target FlatPlanTree) FlatPlanTree { + flat := f.flattenSingle(cteDef, info) + if flat != nil { + target = append(target, flat) + } + childIdxs := make([]int, 0) + var childIdx int + childInfo := &operatorCtx{ + depth: info.depth + 1, + label: SeedPart, + isRoot: true, + storeType: kv.TiDB, + indent: texttree.Indent4Child(info.indent, info.isLastChild), + isLastChild: cteDef.RecurPlan == nil, + } + target, childIdx = f.flattenRecursively(cteDef.SeedPlan, childInfo, target) + childIdxs = append(childIdxs, childIdx) + if cteDef.RecurPlan != nil { + childInfo.label = RecursivePart + childInfo.isLastChild = true + target, childIdx = f.flattenRecursively(cteDef.RecurPlan, childInfo, target) + childIdxs = append(childIdxs, childIdx) + } + if flat != nil { + flat.ChildrenIdx = childIdxs + } + return target +} diff --git a/planner/core/flat_plan_test.go b/planner/core/flat_plan_test.go new file mode 100644 index 0000000000000..574b230efdb67 --- /dev/null +++ b/planner/core/flat_plan_test.go @@ -0,0 +1,105 @@ +// 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 ( + "context" + "fmt" + "testing" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/planner" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/stretchr/testify/require" +) + +// FlatPhysicalOperatorForTest contains fields of FlatOperator that is needed for tests. +type FlatPhysicalOperatorForTest struct { + Depth uint32 + Label core.OperatorLabel + IsRoot bool + StoreType kv.StoreType + ReqType core.ReadReqType + IsPhysicalPlan bool + TextTreeIndent string + IsLastChild bool +} + +func simplifyFlatPhysicalOperator(e *core.FlatOperator) *FlatPhysicalOperatorForTest { + return &FlatPhysicalOperatorForTest{ + Depth: e.Depth, + Label: e.Label, + IsRoot: e.IsRoot, + StoreType: e.StoreType, + ReqType: e.ReqType, + TextTreeIndent: e.TextTreeIndent, + IsLastChild: e.IsLastChild, + IsPhysicalPlan: e.IsPhysicalPlan, + } +} + +func simplifyFlatPlan(p []*core.FlatOperator) []*FlatPhysicalOperatorForTest { + res := make([]*FlatPhysicalOperatorForTest, 0, len(p)) + for _, op := range p { + res = append(res, simplifyFlatPhysicalOperator(op)) + } + return res +} + +func TestFlatPhysicalPlan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + var input []string + var output []struct { + SQL string + Main []*FlatPhysicalOperatorForTest + CTEs [][]*FlatPhysicalOperatorForTest + } + planSuiteData := core.GetFlatPlanSuiteData() + planSuiteData.GetTestCases(t, &input, &output) + p := parser.New() + is := infoschema.MockInfoSchema([]*model.TableInfo{core.MockSignedTable(), core.MockUnsignedTable()}) + + for i, test := range input { + comment := fmt.Sprintf("case:%v sql:%s", i, test) + stmt, err := p.ParseOneStmt(test, "", "") + require.NoError(t, err, comment) + p, _, err := planner.Optimize(context.Background(), tk.Session(), stmt, is) + require.NoError(t, err, comment) + + explained := core.FlattenPhysicalPlan(p, false) + main := simplifyFlatPlan(explained.Main) + var ctes [][]*FlatPhysicalOperatorForTest + for _, cte := range explained.CTEs { + ctes = append(ctes, simplifyFlatPlan(cte)) + } + + testdata.OnRecord(func() { + output[i].SQL = test + output[i].Main = main + output[i].CTEs = ctes + }) + require.Equal(t, output[i].Main, main) + require.Equal(t, output[i].CTEs, ctes) + } +} diff --git a/planner/core/hints.go b/planner/core/hints.go index b4ad15042ef43..241b95f1c47dd 100644 --- a/planner/core/hints.go +++ b/planner/core/hints.go @@ -22,7 +22,44 @@ import ( utilhint "github.com/pingcap/tidb/util/hint" ) +// GenHintsFromFlatPlan generates hints from a FlatPhysicalPlan. +func GenHintsFromFlatPlan(flat *FlatPhysicalPlan) []*ast.TableOptimizerHint { + if len(flat.Main) == 0 { + return nil + } + nodeTp := utilhint.TypeSelect + switch flat.Main[0].Origin.(type) { + case *Update: + nodeTp = utilhint.TypeUpdate + case *Delete: + nodeTp = utilhint.TypeDelete + } + var hints []*ast.TableOptimizerHint + selectPlan := flat.Main.GetSelectPlan() + if len(selectPlan) == 0 || !selectPlan[0].IsPhysicalPlan { + return nil + } + for _, op := range selectPlan { + if !op.IsRoot { + continue + } + p := op.Origin.(PhysicalPlan) + hints = genHintsFromSingle(p, nodeTp, hints) + } + for _, cte := range flat.CTEs { + for i, op := range cte { + if i == 0 || !op.IsRoot { + continue + } + p := op.Origin.(PhysicalPlan) + hints = genHintsFromSingle(p, nodeTp, hints) + } + } + return hints +} + // GenHintsFromPhysicalPlan generates hints from physical plan. +// Deprecated: FlattenPhysicalPlan() + GenHintsFromFlatPlan() is preferred. func GenHintsFromPhysicalPlan(p Plan) []*ast.TableOptimizerHint { var hints []*ast.TableOptimizerHint switch pp := p.(type) { @@ -127,6 +164,10 @@ func genHintsFromPhysicalPlan(p PhysicalPlan, nodeType utilhint.NodeType) (res [ res = append(res, genHintsFromPhysicalPlan(phCte.CTE.recursivePartPhysicalPlan, nodeType)...) } + return genHintsFromSingle(p, nodeType, res) +} + +func genHintsFromSingle(p PhysicalPlan, nodeType utilhint.NodeType, res []*ast.TableOptimizerHint) []*ast.TableOptimizerHint { qbName, err := utilhint.GenerateQBName(nodeType, p.SelectBlockOffset()) if err != nil { return res diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 63e9d118507a3..b8bdec71a621f 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -555,6 +555,48 @@ func TestPushDownToTiFlashWithKeepOrder(t *testing.T) { } } +func TestPushDownToTiFlashWithKeepOrderInFastMode(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + 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, b varchar(20))") + tk.MustExec("alter table t set tiflash mode fast") + + // 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, + } + } + } + + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") + tk.MustExec("set @@session.tidb_allow_mpp = 0") + var input []string + var output []struct { + SQL string + Plan []string + } + integrationSuiteData := core.GetIntegrationSuiteData() + integrationSuiteData.GetTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + func TestMPPJoin(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -2726,6 +2768,76 @@ func TestIssue18984(t *testing.T) { "3 3 3 2 4 3 5")) } +func TestTimeToSecPushDownToTiFlash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a time(4))") + tk.MustExec("insert into t values('700:10:10.123456')") + tk.MustExec("insert into t values('20:20:20')") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // 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, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "10000.00", "root", " data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "10000.00", "mpp[tiflash]", " ExchangeType: PassThrough"}, + {" └─Projection_4", "10000.00", "mpp[tiflash]", " time_to_sec(test.t.a)->Column#3"}, + {" └─TableFullScan_7", "10000.00", "mpp[tiflash]", "table:t", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select time_to_sec(a) from t;").Check(rows) +} + +func TestRightShiftPushDownToTiFlash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + 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)") + tk.MustExec("insert into t values(2147483647, 32)") + tk.MustExec("insert into t values(12, 2)") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // 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, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "rightshift(test.t.a, test.t.b)->Column#4"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select a >> b from t;").CheckAt([]int{0, 2, 4}, rows) +} + func TestBitColumnPushDown(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -3142,6 +3254,76 @@ func TestDistinctScalarFunctionPushDown(t *testing.T) { )) } +func TestReverseUTF8PushDownToTiFlash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(256))") + tk.MustExec("insert into t values('pingcap')") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // 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, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "reverse(test.t.a)->Column#3"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + + tk.MustQuery("explain select reverse(a) from t;").CheckAt([]int{0, 2, 4}, rows) +} + +func TestReversePushDownToTiFlash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a binary(32))") + tk.MustExec("insert into t values('pingcap')") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // 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, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "reverse(test.t.a)->Column#3"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + + tk.MustQuery("explain select reverse(a) from t;").CheckAt([]int{0, 2, 4}, rows) +} + func TestExplainAnalyzePointGet(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -4236,6 +4418,48 @@ func TestPushDownProjectionForTiFlash(t *testing.T) { } } +func TestPushDownSelectionForMPP(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, value decimal(6,3), name char(128))") + 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, + } + } + } + + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + + var input []string + var output []struct { + SQL string + Plan []string + } + integrationSuiteData := core.GetIntegrationSuiteData() + integrationSuiteData.GetTestCases(t, &input, &output) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + func TestPushDownProjectionForMPP(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -5436,24 +5660,24 @@ func TestIndexJoinCost(t *testing.T) { `│ └─Selection_17 9990.00 465000.00 cop[tikv] not(isnull(test.t_outer.a))`, `│ └─TableFullScan_16 10000.00 435000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, `└─TableReader_8(Probe) 1.00 3.88 root data:TableRangeScan_7`, - ` └─TableRangeScan_7 1.00 0.00 cop[tikv] table:t_inner_pk range: decided by [test.t_outer.a], keep order:false, stats:pseudo`)) + ` └─TableRangeScan_7 1.00 30.00 cop[tikv] table:t_inner_pk range: decided by [test.t_outer.a], keep order:false, stats:pseudo`)) tk.MustQuery(`explain format=verbose select /*+ TIDB_INLJ(t_outer, t_inner_idx) */ t_inner_idx.a from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a`).Check(testkit.Rows( // IndexJoin with inner IndexScan `IndexJoin_10 12487.50 235192.19 root inner join, inner:IndexReader_9, outer key:test.t_outer.a, inner key:test.t_inner_idx.a, equal cond:eq(test.t_outer.a, test.t_inner_idx.a)`, `├─TableReader_20(Build) 9990.00 36412.58 root data:Selection_19`, `│ └─Selection_19 9990.00 465000.00 cop[tikv] not(isnull(test.t_outer.a))`, `│ └─TableFullScan_18 10000.00 435000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, `└─IndexReader_9(Probe) 1.25 5.89 root index:Selection_8`, - ` └─Selection_8 1.25 0.00 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` └─IndexRangeScan_7 1.25 0.00 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`)) + ` └─Selection_8 1.25 58.18 cop[tikv] not(isnull(test.t_inner_idx.a))`, + ` └─IndexRangeScan_7 1.25 54.43 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`)) tk.MustQuery(`explain format=verbose select /*+ TIDB_INLJ(t_outer, t_inner_idx) */ * from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a`).Check(testkit.Rows( // IndexJoin with inner IndexLookup `IndexJoin_11 12487.50 531469.38 root inner join, inner:IndexLookUp_10, outer key:test.t_outer.a, inner key:test.t_inner_idx.a, equal cond:eq(test.t_outer.a, test.t_inner_idx.a)`, `├─TableReader_23(Build) 9990.00 36412.58 root data:Selection_22`, `│ └─Selection_22 9990.00 465000.00 cop[tikv] not(isnull(test.t_outer.a))`, `│ └─TableFullScan_21 10000.00 435000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, `└─IndexLookUp_10(Probe) 1.25 35.55 root `, - ` ├─Selection_9(Build) 1.25 0.00 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` │ └─IndexRangeScan_7 1.25 0.00 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`, - ` └─TableRowIDScan_8(Probe) 1.25 0.00 cop[tikv] table:t_inner_idx keep order:false, stats:pseudo`)) + ` ├─Selection_9(Build) 1.25 75.08 cop[tikv] not(isnull(test.t_inner_idx.a))`, + ` │ └─IndexRangeScan_7 1.25 71.32 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`, + ` └─TableRowIDScan_8(Probe) 1.25 71.25 cop[tikv] table:t_inner_idx keep order:false, stats:pseudo`)) tk.MustQuery("explain format=verbose select /*+ inl_hash_join(t_outer, t_inner_idx) */ t_inner_idx.a from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a").Check(testkit.Rows( `IndexHashJoin_12 12487.50 235192.19 root inner join, inner:IndexReader_9, outer key:test.t_outer.a, inner key:test.t_inner_idx.a, equal cond:eq(test.t_outer.a, test.t_inner_idx.a)`, @@ -5461,16 +5685,16 @@ func TestIndexJoinCost(t *testing.T) { `│ └─Selection_19 9990.00 465000.00 cop[tikv] not(isnull(test.t_outer.a))`, `│ └─TableFullScan_18 10000.00 435000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, `└─IndexReader_9(Probe) 1.25 5.89 root index:Selection_8`, - ` └─Selection_8 1.25 0.00 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` └─IndexRangeScan_7 1.25 0.00 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`)) + ` └─Selection_8 1.25 58.18 cop[tikv] not(isnull(test.t_inner_idx.a))`, + ` └─IndexRangeScan_7 1.25 54.43 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:false, stats:pseudo`)) tk.MustQuery("explain format=verbose select /*+ inl_merge_join(t_outer, t_inner_idx) */ t_inner_idx.a from t_outer, t_inner_idx where t_outer.a=t_inner_idx.a").Check(testkit.Rows( `IndexMergeJoin_17 12487.50 229210.68 root inner join, inner:IndexReader_15, outer key:test.t_outer.a, inner key:test.t_inner_idx.a`, `├─TableReader_20(Build) 9990.00 36412.58 root data:Selection_19`, `│ └─Selection_19 9990.00 465000.00 cop[tikv] not(isnull(test.t_outer.a))`, `│ └─TableFullScan_18 10000.00 435000.00 cop[tikv] table:t_outer keep order:false, stats:pseudo`, `└─IndexReader_15(Probe) 1.25 5.89 root index:Selection_14`, - ` └─Selection_14 1.25 0.00 cop[tikv] not(isnull(test.t_inner_idx.a))`, - ` └─IndexRangeScan_13 1.25 0.00 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:true, stats:pseudo`)) + ` └─Selection_14 1.25 58.18 cop[tikv] not(isnull(test.t_inner_idx.a))`, + ` └─IndexRangeScan_13 1.25 54.43 cop[tikv] table:t_inner_idx, index:a(a) range: decided by [eq(test.t_inner_idx.a, test.t_outer.a)], keep order:true, stats:pseudo`)) } func TestHeuristicIndexSelection(t *testing.T) { @@ -6849,3 +7073,139 @@ func TestIssue25813(t *testing.T) { " └─TableReader(Probe) 10000.00 root data:TableFullScan", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo")) } + +func TestRepeatPushDownToTiFlash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + 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)") + tk.MustExec("insert into t values(2147483647, 2)") + tk.MustExec("insert into t values(12, 2)") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // 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, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "repeat(cast(test.t.a, var_string(20)), test.t.b)->Column#4"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select repeat(a,b) from t;").CheckAt([]int{0, 2, 4}, rows) +} + +func TestIssue36194(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + // create virtual tiflash replica. + 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, + } + } + } + tk.MustQuery("explain format = 'brief' select * from t where a + 1 > 20 limit 100;;").Check(testkit.Rows( + "Limit 100.00 root offset:0, count:100", + "└─TableReader 100.00 root data:ExchangeSender", + " └─ExchangeSender 100.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Limit 100.00 mpp[tiflash] offset:0, count:100", + " └─Selection 100.00 mpp[tiflash] gt(plus(test.t.a, 1), 20)", + " └─TableFullScan 125.00 mpp[tiflash] table:t keep order:false, stats:pseudo")) +} + +func TestGetFormatPushDownToTiFlash(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("create table t(location varchar(10));") + tk.MustExec("insert into t values('USA'), ('JIS'), ('ISO'), ('EUR'), ('INTERNAL')") + tk.MustExec("set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash';") + + tbl, err := dom.InfoSchema().TableByName(model.CIStr{O: "test", L: "test"}, model.CIStr{O: "t", L: "t"}) + require.NoError(t, err) + // Set the hacked TiFlash replica for explain tests. + tbl.Meta().TiFlashReplica = &model.TiFlashReplicaInfo{Count: 1, Available: true} + + tk.MustQuery("explain format = 'brief' select GET_FORMAT(DATE, location) from t;").Check(testkit.Rows( + "TableReader 10000.00 root data:ExchangeSender", + "└─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 10000.00 mpp[tiflash] get_format(DATE, test.t.location)->Column#3", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo")) +} + +func TestAggWithJsonPushDownToTiFlash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a json);") + tk.MustExec("insert into t values(null);") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // 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, + } + } + } + + rows := [][]interface{}{ + {"HashAgg_6", "root", "funcs:avg(Column#4)->Column#3"}, + {"└─Projection_19", "root", "cast(test.t.a, double BINARY)->Column#4"}, + {" └─TableReader_12", "root", "data:TableFullScan_11"}, + {" └─TableFullScan_11", "cop[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select avg(a) from t;").CheckAt([]int{0, 2, 4}, rows) + + rows = [][]interface{}{ + {"HashAgg_6", "root", "funcs:sum(Column#4)->Column#3"}, + {"└─Projection_19", "root", "cast(test.t.a, double BINARY)->Column#4"}, + {" └─TableReader_12", "root", "data:TableFullScan_11"}, + {" └─TableFullScan_11", "cop[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select sum(a) from t;").CheckAt([]int{0, 2, 4}, rows) + + rows = [][]interface{}{ + {"HashAgg_6", "root", "funcs:group_concat(Column#4 separator \",\")->Column#3"}, + {"└─Projection_13", "root", "cast(test.t.a, var_string(4294967295))->Column#4"}, + {" └─TableReader_10", "root", "data:TableFullScan_9"}, + {" └─TableFullScan_9", "cop[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select /*+ hash_agg() */ group_concat(a) from t;").CheckAt([]int{0, 2, 4}, rows) +} diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 92c2a3dbcfd80..cf85a237c4449 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -117,6 +117,10 @@ const ( 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" ) const ( @@ -187,6 +191,10 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu b.optFlag |= flagEliminateAgg b.optFlag |= flagEliminateProjection + if b.ctx.GetSessionVars().EnableSkewDistinctAgg { + b.optFlag |= flagSkewDistinctAgg + } + plan4Agg := LogicalAggregation{AggFuncs: make([]*aggregation.AggFuncDesc, 0, len(aggFuncList))}.Init(b.ctx, b.getSelectOffset()) if hint := b.TableHints(); hint != nil { plan4Agg.aggHints = hint.aggHints @@ -1757,7 +1765,6 @@ func (b *PlanBuilder) buildUnion(ctx context.Context, selects []LogicalPlan, aft if err != nil { return nil, err } - unionDistinctPlan, err := b.buildUnionAll(ctx, distinctSelectPlans) if err != nil { return nil, err @@ -3517,6 +3524,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev aggHints aggHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo + MergeHints MergeHintInfo leadingJoinOrder []hintTableInfo leadingHintCnt int ) @@ -3621,11 +3629,23 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev timeRangeHint = hint.HintData.(ast.HintTimeRange) case HintLimitToCop: limitHints.preferLimitToCop = true + case 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.")) + continue + } + MergeHints.preferMerge = true case HintLeading: if leadingHintCnt == 0 { leadingJoinOrder = append(leadingJoinOrder, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) } leadingHintCnt++ + case HintSemiJoinRewrite: + if !b.checkSemiJoinHint { + 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.")) + continue + } + b.hasValidSemiJoinHint = true default: // ignore hints that not implemented } @@ -3651,6 +3671,7 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev indexMergeHintList: indexMergeHintList, timeRangeHint: timeRangeHint, limitHints: limitHints, + MergeHints: MergeHints, leadingJoinOrder: leadingJoinOrder, }) } @@ -3776,6 +3797,13 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L b.isForUpdateRead = true } + // Determines whether to use the Merge hint in a CTE query. + if b.buildingCTE { + if hints := b.TableHints(); hints != nil { + b.outerCTEs[len(b.outerCTEs)-1].isInline = hints.MergeHints.preferMerge + } + } + if sel.With != nil { l := len(b.outerCTEs) defer func() { @@ -3992,6 +4020,11 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } } + // If Merge hint is using in outer query, we will not apply this hint. + if hints := b.TableHints(); hints.MergeHints.preferMerge && !b.buildingCTE && len(b.tableHintInfo) == 1 { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("Hint merge() is inapplicable. Please check whether the hint is using in outer query, you should use this hint in CTE inner query.")) + } + sel.Fields.Fields = originalFields if oldLen != p.Schema().Len() { proj := LogicalProjection{Exprs: expression.Column2Exprs(p.Schema().Columns[:oldLen])}.Init(b.ctx, b.getSelectOffset()) @@ -4154,6 +4187,23 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName lp := LogicalCTE{cteAsName: tn.Name, cte: cte.cteClass, seedStat: cte.seedStat, isOuterMostCTE: !b.buildingCTE}.Init(b.ctx, b.getSelectOffset()) prevSchema := cte.seedLP.Schema().Clone() lp.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) + + if cte.recurLP != nil && cte.isInline { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("Hint merge() is inapplicable. Please check whether the CTE use recursive.")) + } + if cte.recurLP == nil && cte.isInline { + lp.MergeHints.preferMerge = cte.isInline + saveCte := b.outerCTEs[i:] + b.outerCTEs = b.outerCTEs[:i] + o := b.buildingCTE + b.buildingCTE = false + defer func() { + b.outerCTEs = append(b.outerCTEs, saveCte...) + b.buildingCTE = o + }() + return b.buildDataSourceFromCTEMerge(ctx, cte.def) + } + for i, col := range lp.schema.Columns { lp.cte.ColumnMap[string(col.HashCode(nil))] = prevSchema.Columns[i] } @@ -4176,6 +4226,29 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName return nil, nil } +func (b *PlanBuilder) buildDataSourceFromCTEMerge(ctx context.Context, cte *ast.CommonTableExpression) (LogicalPlan, error) { + p, err := b.buildResultSetNode(ctx, cte.Query.Query) + if err != nil { + return nil, err + } + outPutNames := p.OutputNames() + for _, name := range outPutNames { + name.TblName = cte.Name + name.DBName = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB) + } + + if len(cte.ColNameList) > 0 { + if len(cte.ColNameList) != len(p.OutputNames()) { + return nil, errors.New("CTE columns length is not consistent") + } + for i, n := range cte.ColNameList { + outPutNames[i].ColName = n + } + } + p.SetOutputNames(outPutNames) + return p, nil +} + func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, asName *model.CIStr) (LogicalPlan, error) { dbName := tn.Schema sessionVars := b.ctx.GetSessionVars() @@ -4866,10 +4939,10 @@ func (b *PlanBuilder) buildApplyWithJoinType(outerPlan, innerPlan LogicalPlan, t } // buildSemiApply builds apply plan with outerPlan and innerPlan, which apply semi-join for every row from outerPlan and the whole innerPlan. -func (b *PlanBuilder) buildSemiApply(outerPlan, innerPlan LogicalPlan, condition []expression.Expression, asScalar, not bool) (LogicalPlan, error) { +func (b *PlanBuilder) buildSemiApply(outerPlan, innerPlan LogicalPlan, condition []expression.Expression, asScalar, not, considerRewrite bool) (LogicalPlan, error) { b.optFlag = b.optFlag | flagPredicatePushDown | flagBuildKeyInfo | flagDecorrelate - join, err := b.buildSemiJoin(outerPlan, innerPlan, condition, asScalar, not) + join, err := b.buildSemiJoin(outerPlan, innerPlan, condition, asScalar, not, considerRewrite) if err != nil { return nil, err } @@ -4905,7 +4978,7 @@ func (b *PlanBuilder) buildMaxOneRow(p LogicalPlan) LogicalPlan { return maxOneRow } -func (b *PlanBuilder) buildSemiJoin(outerPlan, innerPlan LogicalPlan, onCondition []expression.Expression, asScalar bool, not bool) (*LogicalJoin, error) { +func (b *PlanBuilder) buildSemiJoin(outerPlan, innerPlan LogicalPlan, onCondition []expression.Expression, asScalar, not, forceRewrite bool) (*LogicalJoin, error) { joinPlan := LogicalJoin{}.Init(b.ctx, b.getSelectOffset()) for i, expr := range onCondition { onCondition[i] = expr.Decorrelate(outerPlan.Schema()) @@ -4959,6 +5032,10 @@ func (b *PlanBuilder) buildSemiJoin(outerPlan, innerPlan LogicalPlan, onConditio return nil, errors.New("Join hints are conflict, you can only specify one type of join") } } + if forceRewrite { + joinPlan.preferJoinType |= preferRewriteSemiJoin + b.optFlag |= flagSemiJoinRewrite + } return joinPlan, nil } diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 0a73522baa9a3..7b616411b3e2c 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -506,7 +506,7 @@ func TestSubquery(t *testing.T) { p, _, err := BuildLogicalPlanForTest(ctx, s.ctx, stmt, s.is) require.NoError(t, err) if lp, ok := p.(LogicalPlan); ok { - p, err = logicalOptimize(context.TODO(), flagBuildKeyInfo|flagDecorrelate|flagPrunColumns|flagPrunColumnsAgain, lp) + p, err = logicalOptimize(context.TODO(), flagBuildKeyInfo|flagDecorrelate|flagPrunColumns|flagPrunColumnsAgain|flagSemiJoinRewrite, lp) require.NoError(t, err) } testdata.OnRecord(func() { diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 48b4da2e96cd6..27315d316f45f 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -117,6 +117,7 @@ const ( preferHashJoin preferMergeJoin preferBCJoin + preferRewriteSemiJoin preferHashAgg preferStreamAgg ) @@ -1880,6 +1881,7 @@ type LogicalCTE struct { cteAsName model.CIStr seedStat *property.StatsInfo isOuterMostCTE bool + MergeHints MergeHintInfo } // LogicalCTETable is for CTE table diff --git a/planner/core/main_test.go b/planner/core/main_test.go index 916d1943aa1f4..97247f7766e0d 100644 --- a/planner/core/main_test.go +++ b/planner/core/main_test.go @@ -48,6 +48,8 @@ func TestMain(m *testing.M) { testDataMap.LoadTestSuiteData("testdata", "window_push_down_suite") testDataMap.LoadTestSuiteData("testdata", "plan_suite_unexported") testDataMap.LoadTestSuiteData("testdata", "join_reorder_suite") + testDataMap.LoadTestSuiteData("testdata", "flat_plan_suite") + testDataMap.LoadTestSuiteData("testdata", "binary_plan_suite") indexMergeSuiteData = testDataMap["index_merge_suite"] planSuiteUnexportedData = testDataMap["plan_suite_unexported"] @@ -56,6 +58,7 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("github.com/golang/glog.(*loggingT).flushDaemon"), goleak.IgnoreTopFunction("go.etcd.io/etcd/client/pkg/v3/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), } callback := func(i int) int { @@ -117,3 +120,11 @@ func GetAnalyzeSuiteData() testdata.TestData { func GetWindowPushDownSuiteData() testdata.TestData { return testDataMap["window_push_down_suite"] } + +func GetFlatPlanSuiteData() testdata.TestData { + return testDataMap["flat_plan_suite"] +} + +func GetBinaryPlanSuiteData() testdata.TestData { + return testDataMap["binary_plan_suite"] +} diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index 20d4fd598e701..d69a9d99ece0b 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -58,7 +58,9 @@ const ( flagStabilizeResults flagBuildKeyInfo flagDecorrelate + flagSemiJoinRewrite flagEliminateAgg + flagSkewDistinctAgg flagEliminateProjection flagMaxMinEliminate flagPredicatePushDown @@ -78,7 +80,9 @@ var optRuleList = []logicalOptRule{ &resultReorder{}, &buildKeySolver{}, &decorrelateSolver{}, + &semiJoinRewriter{}, &aggregationEliminator{}, + &skewDistinctAggRewriter{}, &projectionEliminator{}, &maxMinEliminator{}, &ppdSolver{}, @@ -625,7 +629,7 @@ func physicalOptimize(logic LogicalPlan, planCounter *PlanCounterTp) (plan Physi opt := defaultPhysicalOptimizeOption() stmtCtx := logic.SCtx().GetSessionVars().StmtCtx if stmtCtx.EnableOptimizeTrace { - tracer := &tracing.PhysicalOptimizeTracer{State: make(map[string]map[string]*tracing.PlanTrace)} + tracer := &tracing.PhysicalOptimizeTracer{Candidates: make(map[int]*tracing.CandidatePlanTrace)} opt = opt.withEnableOptimizeTracer(tracer) defer func() { if err == nil { diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index fe5c5cba7da00..7bf48209077c0 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -278,6 +278,18 @@ func TestDAGPlanTopN(t *testing.T) { } } +func assertSameHints(t *testing.T, expected, actual []*ast.TableOptimizerHint) { + expectedStr := make([]string, 0, len(expected)) + actualStr := make([]string, 0, len(actual)) + for _, h := range expected { + expectedStr = append(expectedStr, hint.RestoreTableOptimizerHint(h)) + } + for _, h := range actual { + actualStr = append(actualStr, hint.RestoreTableOptimizerHint(h)) + } + require.ElementsMatch(t, expectedStr, actualStr) +} + func TestDAGPlanBuilderBasePhysicalPlan(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -312,7 +324,14 @@ func TestDAGPlanBuilderBasePhysicalPlan(t *testing.T) { output[i].Hints = hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)) }) require.Equal(t, output[i].Best, core.ToString(p), fmt.Sprintf("input: %s", tt)) - require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)), fmt.Sprintf("input: %s", tt)) + hints := core.GenHintsFromPhysicalPlan(p) + + // test the new genHints code + flat := core.FlattenPhysicalPlan(p, false) + newHints := core.GenHintsFromFlatPlan(flat) + assertSameHints(t, hints, newHints) + + require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(hints), fmt.Sprintf("input: %s", tt)) } } @@ -852,8 +871,14 @@ func TestJoinHints(t *testing.T) { require.Equal(t, stmtctx.WarnLevelWarning, warnings[0].Level) require.Equal(t, output[i].Warning, warnings[0].Err.Error()) } + hints := core.GenHintsFromPhysicalPlan(p) - require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)), comment) + // test the new genHints code + flat := core.FlattenPhysicalPlan(p, false) + newHints := core.GenHintsFromFlatPlan(flat) + assertSameHints(t, hints, newHints) + + require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(hints), comment) } } @@ -911,6 +936,57 @@ func TestAggregationHints(t *testing.T) { } } +func TestSemiJoinRewriteHints(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int, c int)") + + sessionVars := tk.Session().GetSessionVars() + sessionVars.SetHashAggFinalConcurrency(1) + sessionVars.SetHashAggPartialConcurrency(1) + + var input []string + var output []struct { + SQL string + Plan []string + Warning string + } + planSuiteData := core.GetPlanSuiteData() + planSuiteData.GetTestCases(t, &input, &output) + ctx := context.Background() + p := parser.New() + is := infoschema.MockInfoSchema([]*model.TableInfo{core.MockSignedTable(), core.MockUnsignedTable()}) + for i, test := range input { + comment := fmt.Sprintf("case: %v sql: %v", i, test) + tk.Session().GetSessionVars().StmtCtx.SetWarnings(nil) + + stmt, err := p.ParseOneStmt(test, "", "") + require.NoError(t, err, comment) + + _, _, err = planner.Optimize(ctx, tk.Session(), stmt, is) + require.NoError(t, err) + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + + testdata.OnRecord(func() { + output[i].SQL = test + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief'" + test).Rows()) + if len(warnings) > 0 { + output[i].Warning = warnings[0].Err.Error() + } + }) + tk.MustQuery("explain format = 'brief'" + test).Check(testkit.Rows(output[i].Plan...)) + if output[i].Warning == "" { + require.Len(t, warnings, 0) + } else { + require.Len(t, warnings, 1, fmt.Sprintf("%v", warnings)) + require.Equal(t, stmtctx.WarnLevelWarning, warnings[0].Level) + require.Equal(t, output[i].Warning, warnings[0].Err.Error()) + } + } +} + func TestExplainJoinHints(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -919,10 +995,10 @@ func TestExplainJoinHints(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int, c int, key(b), key(c))") tk.MustQuery("explain format='hint' select /*+ inl_merge_join(t2) */ * from t t1 inner join t t2 on t1.b = t2.b and t1.c = 1").Check(testkit.Rows( - "use_index(@`sel_1` `test`.`t1` `c`), use_index(@`sel_1` `test`.`t2` `b`), inl_merge_join(@`sel_1` `test`.`t2`), inl_merge_join(`t2`)", + "inl_merge_join(@`sel_1` `test`.`t2`), use_index(@`sel_1` `test`.`t1` `c`), use_index(@`sel_1` `test`.`t2` `b`), inl_merge_join(`t2`)", )) tk.MustQuery("explain format='hint' select /*+ inl_hash_join(t2) */ * from t t1 inner join t t2 on t1.b = t2.b and t1.c = 1").Check(testkit.Rows( - "use_index(@`sel_1` `test`.`t1` `c`), use_index(@`sel_1` `test`.`t2` `b`), inl_hash_join(@`sel_1` `test`.`t2`), inl_hash_join(`t2`)", + "inl_hash_join(@`sel_1` `test`.`t2`), use_index(@`sel_1` `test`.`t1` `c`), use_index(@`sel_1` `test`.`t2` `b`), inl_hash_join(`t2`)", )) } @@ -1034,6 +1110,76 @@ func TestLimitToCopHint(t *testing.T) { } } +func TestCTEMergeHint(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tc") + tk.MustExec("drop table if exists te") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t3") + tk.MustExec("drop table if exists t4") + tk.MustExec("create table tc(a int)") + tk.MustExec("create table te(c int)") + tk.MustExec("create table t1(a int)") + tk.MustExec("create table t2(b int)") + tk.MustExec("create table t3(c int)") + tk.MustExec("create table t4(d int)") + tk.MustExec("insert into tc values (1), (5), (10), (15), (20), (30), (50);") + tk.MustExec("insert into te values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t1 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t2 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t3 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("insert into t4 values (1), (5), (10), (25), (40), (60), (100);") + tk.MustExec("analyze table tc;") + tk.MustExec("analyze table te;") + tk.MustExec("analyze table t1;") + tk.MustExec("analyze table t2;") + tk.MustExec("analyze table t3;") + tk.MustExec("analyze table t4;") + var ( + input []string + output []struct { + SQL string + Plan []string + Warning []string + } + ) + + planSuiteData := core.GetPlanSuiteData() + planSuiteData.GetTestCases(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...)) + + comment := fmt.Sprintf("case:%v sql:%s", i, ts) + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + testdata.OnRecord(func() { + if len(warnings) > 0 { + output[i].Warning = make([]string, len(warnings)) + for j, warning := range warnings { + output[i].Warning[j] = warning.Err.Error() + } + } + }) + if len(output[i].Warning) == 0 { + require.Len(t, warnings, 0) + } else { + require.Len(t, warnings, len(output[i].Warning), comment) + for j, warning := range warnings { + require.Equal(t, stmtctx.WarnLevelWarning, warning.Level, comment) + require.Equal(t, output[i].Warning[j], warning.Err.Error(), comment) + } + } + } +} + func TestPushdownDistinctEnable(t *testing.T) { var ( input []string @@ -1268,7 +1414,14 @@ func TestIndexHint(t *testing.T) { } else { require.Len(t, warnings, 0, comment) } - require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)), comment) + hints := core.GenHintsFromPhysicalPlan(p) + + // test the new genHints code + flat := core.FlattenPhysicalPlan(p, false) + newHints := core.GenHintsFromFlatPlan(flat) + assertSameHints(t, hints, newHints) + + require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(hints), comment) } } @@ -1315,7 +1468,14 @@ func TestIndexMergeHint(t *testing.T) { } else { require.Len(t, warnings, 0, comment) } - require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)), comment) + hints := core.GenHintsFromPhysicalPlan(p) + + // test the new genHints code + flat := core.FlattenPhysicalPlan(p, false) + newHints := core.GenHintsFromFlatPlan(flat) + assertSameHints(t, hints, newHints) + + require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(hints), comment) } } @@ -1351,7 +1511,14 @@ func TestQueryBlockHint(t *testing.T) { output[i].Hints = hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)) }) require.Equal(t, output[i].Plan, core.ToString(p), comment) - require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)), comment) + hints := core.GenHintsFromPhysicalPlan(p) + + // test the new genHints code + flat := core.FlattenPhysicalPlan(p, false) + newHints := core.GenHintsFromFlatPlan(flat) + assertSameHints(t, hints, newHints) + + require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(hints), comment) } } @@ -1391,7 +1558,14 @@ func TestInlineProjection(t *testing.T) { output[i].Hints = hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)) }) require.Equal(t, output[i].Plan, core.ToString(p), comment) - require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(core.GenHintsFromPhysicalPlan(p)), comment) + hints := core.GenHintsFromPhysicalPlan(p) + + // test the new genHints code + flat := core.FlattenPhysicalPlan(p, false) + newHints := core.GenHintsFromFlatPlan(flat) + assertSameHints(t, hints, newHints) + + require.Equal(t, output[i].Hints, hint.RestoreOptimizerHints(hints), comment) } } @@ -1817,6 +1991,57 @@ func TestIssue30965(t *testing.T) { " └─TableRowIDScan 10.00 cop[tikv] table:t30965 keep order:false, stats:pseudo")) } +func TestSkewDistinctAgg(t *testing.T) { + var ( + input []string + output []struct { + SQL string + Plan []string + } + ) + planSuiteData := core.GetPlanSuiteData() + planSuiteData.GetTestCases(t, &input, &output) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE `t` (`a` int(11), `b` int(11), `c` int(11), `d` date)") + tk.MustExec("insert into t (a,b,c,d) value(1,4,5,'2019-06-01')") + tk.MustExec("insert into t (a,b,c,d) value(2,null,1,'2019-07-01')") + tk.MustExec("insert into t (a,b,c,d) value(3,4,5,'2019-08-01')") + tk.MustExec("insert into t (a,b,c,d) value(3,6,2,'2019-09-01')") + tk.MustExec("insert into t (a,b,c,d) value(10,4,null,'2020-06-01')") + tk.MustExec("insert into t (a,b,c,d) value(20,null,1,'2020-07-01')") + tk.MustExec("insert into t (a,b,c,d) value(30,4,5,'2020-08-01')") + tk.MustExec("insert into t (a,b,c,d) value(30,6,5,'2020-09-01')") + tk.MustQuery("select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) " + + "from t group by date_format(d,'%Y') order by df;").Check( + testkit.Rows("2019 9 3 3", "2020 90 3 2")) + tk.MustExec("set @@tidb_opt_skew_distinct_agg=1") + tk.MustQuery("select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) " + + "from t group by date_format(d,'%Y') order by df;").Check( + testkit.Rows("2019 9 3 3", "2020 90 3 2")) + tk.MustQuery("select count(distinct b), sum(c) from t group by a order by 1,2;").Check( + testkit.Rows("0 1", "0 1", "1 ", "1 5", "2 7", "2 10")) + tk.MustQuery("select count(distinct b) from t group by date_format(d,'%Y') order by 1;").Check( + testkit.Rows("2", "2")) + tk.MustQuery("select count(a), count(distinct b), max(b) from t group by date_format(d,'%Y') order by 1,2,3;").Check( + testkit.Rows("4 2 6", "4 2 6")) + tk.MustQuery("select count(a), count(distinct b), max(b) from t group by date_format(d,'%Y'),c order by 1,2,3;").Check( + testkit.Rows("1 0 ", "1 0 ", "1 1 4", "1 1 6", "2 1 4", "2 2 6")) + tk.MustQuery("select avg(distinct b), count(a), sum(b) from t group by date_format(d,'%Y'),c order by 1,2,3;").Check( + testkit.Rows(" 1 ", " 1 ", "4.0000 1 4", "4.0000 2 8", "5.0000 2 10", "6.0000 1 6")) + + 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 TestMPPSinglePartitionType(t *testing.T) { var ( input []string diff --git a/planner/core/physical_plan_trace_test.go b/planner/core/physical_plan_trace_test.go index 9988fb6cacfa9..d9a99d7210619 100644 --- a/planner/core/physical_plan_trace_test.go +++ b/planner/core/physical_plan_trace_test.go @@ -41,33 +41,19 @@ func TestPhysicalOptimizeWithTraceEnabled(t *testing.T) { tk.MustExec("create table t(a int, primary key (a))") testcases := []struct { sql string - logicalList []string physicalList []string - bests []string }{ { sql: "select * from t", - logicalList: []string{ - "DataSource_1", "Projection_2", - }, physicalList: []string{ - "Projection_3", "TableReader_5", - }, - bests: []string{ - "Projection_3", "TableReader_5", + "Projection_3", "TableFullScan_4", "TableReader_5", }, }, { sql: "select * from t where a = 1", - logicalList: []string{ - "DataSource_1", "Projection_3", - }, physicalList: []string{ "Point_Get_5", "Projection_4", }, - bests: []string{ - "Point_Get_5", "Projection_4", - }, }, } @@ -83,14 +69,11 @@ func TestPhysicalOptimizeWithTraceEnabled(t *testing.T) { domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(dom.InfoSchema()) plan, err := builder.Build(context.TODO(), stmt) require.NoError(t, err) - flag := uint64(0) - flag = flag | 1<<3 | 1<<8 - _, _, err = core.DoOptimize(context.TODO(), sctx, flag, plan.(core.LogicalPlan)) + _, _, err = core.DoOptimize(context.TODO(), sctx, builder.GetOptFlag(), plan.(core.LogicalPlan)) require.NoError(t, err) otrace := sctx.GetSessionVars().StmtCtx.OptimizeTracer.Physical require.NotNil(t, otrace) - logicalList, physicalList := getList(otrace) - require.True(t, checkList(logicalList, testcase.logicalList)) + physicalList := getList(otrace) require.True(t, checkList(physicalList, testcase.physicalList)) } } @@ -107,14 +90,82 @@ func checkList(d []string, s []string) bool { return true } -func getList(otrace *tracing.PhysicalOptimizeTracer) (ll []string, pl []string) { - for logicalPlan, v := range otrace.State { - ll = append(ll, logicalPlan) - for physicalPlanKey := range v { - pl = append(pl, physicalPlanKey) - } +func getList(otrace *tracing.PhysicalOptimizeTracer) (pl []string) { + for _, v := range otrace.Candidates { + pl = append(pl, tracing.CodecPlanName(v.TP, v.ID)) } - sort.Strings(ll) sort.Strings(pl) - return ll, pl + return pl +} + +// assert the case in https://github.com/pingcap/tidb/issues/34863 +func TestPhysicalOptimizerTrace(t *testing.T) { + p := parser.New() + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + ctx := tk.Session().(sessionctx.Context) + tk.MustExec("use test") + tk.MustExec("create table customer2(c_id bigint);") + tk.MustExec("create table orders2(o_id bigint, c_id bigint);") + tk.MustExec("insert into customer2 values(1),(2),(3),(4),(5);") + tk.MustExec("insert into orders2 values(1,1),(2,1),(3,2),(4,2),(5,2);") + tk.MustExec("set @@tidb_opt_agg_push_down=1;") + + sql := "select count(*) from customer2 c left join orders2 o on c.c_id=o.c_id;" + + stmt, err := p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + err = core.Preprocess(ctx, stmt, core.WithPreprocessorReturn(&core.PreprocessorReturn{InfoSchema: dom.InfoSchema()})) + require.NoError(t, err) + sctx := core.MockContext() + sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true + sctx.GetSessionVars().AllowAggPushDown = true + builder, _ := core.NewPlanBuilder().Init(sctx, dom.InfoSchema(), &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(dom.InfoSchema()) + plan, err := builder.Build(context.TODO(), stmt) + require.NoError(t, err) + flag := uint64(0) + flag = flag | 1<<1 | 1<<3 | 1<<8 | 1<<12 | 1<<15 + _, _, err = core.DoOptimize(context.TODO(), sctx, flag, plan.(core.LogicalPlan)) + require.NoError(t, err) + otrace := sctx.GetSessionVars().StmtCtx.OptimizeTracer.Physical + require.NotNil(t, otrace) + elements := map[int]string{ + 12: "TableReader", + 14: "TableReader", + 13: "TableFullScan", + 15: "HashJoin", + 6: "Projection", + 11: "TableFullScan", + 9: "HashJoin", + 10: "HashJoin", + 7: "HashAgg", + 16: "HashJoin", + 8: "StreamAgg", + } + final := map[int]struct{}{ + 11: {}, + 12: {}, + 13: {}, + 14: {}, + 9: {}, + 7: {}, + 6: {}, + } + for _, c := range otrace.Candidates { + tp, ok := elements[c.ID] + if !ok || tp != c.TP { + t.FailNow() + } + } + require.Len(t, otrace.Candidates, len(elements)) + for _, p := range otrace.Final { + _, ok := final[p.ID] + if !ok { + t.FailNow() + } + } + require.Len(t, otrace.Final, len(final)) } diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index d867f0029a6bf..0bbb8ef285657 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/stringutil" + "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tipb/go-tipb" ) @@ -73,11 +74,12 @@ type tableScanAndPartitionInfo struct { partitionInfo PartitionInfo } -type readReqType uint8 +// ReadReqType is the read request type of the operator. Currently, only PhysicalTableReader uses this. +type ReadReqType uint8 const ( // Cop means read from storage by cop request. - Cop readReqType = iota + Cop ReadReqType = iota // BatchCop means read from storage by BatchCop request, only used for TiFlash BatchCop // MPP means read from storage by MPP request, only used for TiFlash @@ -85,7 +87,7 @@ const ( ) // Name returns the name of read request type. -func (r readReqType) Name() string { +func (r ReadReqType) Name() string { switch r { case BatchCop: return "batchCop" @@ -110,7 +112,7 @@ type PhysicalTableReader struct { // ReadReqType is the read request type for current physical table reader, there are 3 kinds of read request: Cop, // BatchCop and MPP, currently, the latter two are only used in TiFlash - ReadReqType readReqType + ReadReqType ReadReqType IsCommonHandle bool @@ -154,6 +156,11 @@ func (p *PhysicalTableReader) GetTableScan() (*PhysicalTableScan, error) { return tableScans[0], nil } +// GetAvgRowSize return the average row size of this plan. +func (p *PhysicalTableReader) GetAvgRowSize() float64 { + return getTblStats(p.tablePlan).GetAvgRowSize(p.ctx, p.tablePlan.Schema().Columns, false, false) +} + // setMppOrBatchCopForTableScan set IsMPPOrBatchCop for all TableScan. func setMppOrBatchCopForTableScan(curPlan PhysicalPlan) { if ts, ok := curPlan.(*PhysicalTableScan); ok { @@ -223,6 +230,30 @@ func (p *PhysicalTableReader) ExtractCorrelatedCols() (corCols []*expression.Cor return corCols } +func (p *PhysicalTableReader) buildPlanTrace() *tracing.PlanTrace { + rp := p.basePhysicalPlan.buildPlanTrace() + if p.tablePlan != nil { + rp.Children = append(rp.Children, p.tablePlan.buildPlanTrace()) + } + return rp +} + +func (p *PhysicalTableReader) appendChildCandidate(op *physicalOptimizeOp) { + p.basePhysicalPlan.appendChildCandidate(op) + if p.tablePlan != nil { + candidate := &tracing.CandidatePlanTrace{ + PlanTrace: &tracing.PlanTrace{ + ID: p.tablePlan.ID(), + TP: p.tablePlan.TP(), + Cost: p.tablePlan.Cost(), + ExplainInfo: p.tablePlan.ExplainInfo(), + }, + } + op.tracer.AppendCandidate(candidate) + p.tablePlan.appendChildCandidate(op) + } +} + // PhysicalIndexReader is the index reader in tidb. type PhysicalIndexReader struct { physicalSchemaProducer @@ -364,6 +395,16 @@ func (p *PhysicalIndexLookUpReader) ExtractCorrelatedCols() (corCols []*expressi return corCols } +// GetIndexNetDataSize return the estimated total size in bytes via network transfer. +func (p *PhysicalIndexLookUpReader) GetIndexNetDataSize() float64 { + return getTblStats(p.indexPlan).GetAvgRowSize(p.ctx, p.indexPlan.Schema().Columns, true, false) * p.indexPlan.StatsCount() +} + +// GetAvgTableRowSize return the average row size of each final row. +func (p *PhysicalIndexLookUpReader) GetAvgTableRowSize() float64 { + return getTblStats(p.tablePlan).GetAvgRowSize(p.ctx, p.tablePlan.Schema().Columns, false, false) +} + // PhysicalIndexMergeReader is the reader using multiple indexes in tidb. type PhysicalIndexMergeReader struct { physicalSchemaProducer @@ -381,6 +422,11 @@ type PhysicalIndexMergeReader struct { PartitionInfo PartitionInfo } +// GetAvgTableRowSize return the average row size of table plan. +func (p *PhysicalIndexMergeReader) GetAvgTableRowSize() float64 { + return getTblStats(p.TablePlans[len(p.TablePlans)-1]).GetAvgRowSize(p.SCtx(), p.Schema().Columns, false, false) +} + // ExtractCorrelatedCols implements PhysicalPlan interface. func (p *PhysicalIndexMergeReader) ExtractCorrelatedCols() (corCols []*expression.CorrelatedColumn) { for _, child := range p.TablePlans { @@ -427,7 +473,7 @@ type PhysicalIndexScan struct { // The index scan may be on a partition. physicalTableID int64 - GenExprs map[model.TableColumnID]expression.Expression + GenExprs map[model.TableItemID]expression.Expression isPartition bool Desc bool @@ -442,6 +488,7 @@ type PhysicalIndexScan struct { // tblColHists contains all columns before pruning, which are used to calculate row-size tblColHists *statistics.HistColl pkIsHandleCol *expression.Column + prop *property.PhysicalProperty } // Clone implements PhysicalPlan interface. @@ -543,6 +590,7 @@ type PhysicalTableScan struct { // tblCols and tblColHists contains all columns before pruning, which are used to calculate row-size tblCols []*expression.Column tblColHists *statistics.HistColl + prop *property.PhysicalProperty } // Clone implements PhysicalPlan interface. @@ -1269,6 +1317,11 @@ type PhysicalSelection struct { basePhysicalPlan Conditions []expression.Expression + + // The flag indicates whether this Selection is from a DataSource. + // The flag is only used by cost model for compatibility and will be removed later. + // Please see https://github.com/pingcap/tidb/issues/36243 for more details. + fromDataSource bool } // Clone implements PhysicalPlan interface. diff --git a/planner/core/plan.go b/planner/core/plan.go index 1dedfd05cf7e2..5eede1314c5ab 100644 --- a/planner/core/plan.go +++ b/planner/core/plan.go @@ -375,6 +375,10 @@ type PhysicalPlan interface { // Clone clones this physical plan. Clone() (PhysicalPlan, error) + + // appendChildCandidate append child physicalPlan into tracer in order to track each child physicalPlan which can't + // be tracked during findBestTask or enumeratePhysicalPlans4Task + appendChildCandidate(op *physicalOptimizeOp) } type baseLogicalPlan struct { @@ -771,3 +775,20 @@ func (p *basePlan) buildPlanTrace() *tracing.PlanTrace { planTrace := &tracing.PlanTrace{ID: p.ID(), TP: p.TP()} return planTrace } + +func (p *basePhysicalPlan) appendChildCandidate(op *physicalOptimizeOp) { + if len(p.Children()) < 1 { + return + } + childrenID := make([]int, 0) + for _, child := range p.Children() { + childCandidate := &tracing.CandidatePlanTrace{ + PlanTrace: &tracing.PlanTrace{TP: child.TP(), ID: child.ID(), + ExplainInfo: child.ExplainInfo(), Cost: child.Cost()}, + } + op.tracer.AppendCandidate(childCandidate) + child.appendChildCandidate(op) + childrenID = append(childrenID, child.ID()) + } + op.tracer.Candidates[p.ID()].PlanTrace.ChildrenID = childrenID +} diff --git a/planner/core/plan_cost.go b/planner/core/plan_cost.go index 73758b562536a..250f01dfdacba 100644 --- a/planner/core/plan_cost.go +++ b/planner/core/plan_cost.go @@ -81,6 +81,9 @@ func (p *PhysicalSelection) GetPlanCost(taskType property.TaskType, costFlag uin return 0, errors.Errorf("unknown task type %v", taskType) } selfCost = getCardinality(p.children[0], costFlag) * cpuFactor + if p.fromDataSource { + selfCost = 0 // for compatibility, see https://github.com/pingcap/tidb/issues/36243 + } case modelVer2: // selection cost: rows * num-filters * cpu-factor var cpuFactor float64 switch taskType { @@ -277,6 +280,13 @@ func (p *PhysicalIndexReader) GetPlanCost(taskType property.TaskType, costFlag u return p.planCost, nil } +// GetNetDataSize calculates the cost of the plan in network data transfer. +func (p *PhysicalIndexReader) GetNetDataSize() float64 { + tblStats := getTblStats(p.indexPlan) + rowSize := tblStats.GetAvgRowSize(p.ctx, p.indexPlan.Schema().Columns, true, false) + return p.indexPlan.StatsCount() * rowSize +} + // GetPlanCost calculates the cost of the plan if it has not been calculated yet and returns the cost. func (p *PhysicalTableReader) GetPlanCost(taskType property.TaskType, costFlag uint64) (float64, error) { if p.planCostInit && !hasCostFlag(costFlag, CostFlagRecalculate) { @@ -345,6 +355,12 @@ func (p *PhysicalTableReader) GetPlanCost(taskType property.TaskType, costFlag u return p.planCost, nil } +// GetNetDataSize calculates the estimated total data size fetched from storage. +func (p *PhysicalTableReader) GetNetDataSize() float64 { + rowSize := getTblStats(p.tablePlan).GetAvgRowSize(p.ctx, p.tablePlan.Schema().Columns, false, false) + return p.tablePlan.StatsCount() * rowSize +} + // GetPlanCost calculates the cost of the plan if it has not been calculated yet and returns the cost. func (p *PhysicalIndexMergeReader) GetPlanCost(taskType property.TaskType, costFlag uint64) (float64, error) { if p.planCostInit && !hasCostFlag(costFlag, CostFlagRecalculate) { @@ -391,6 +407,12 @@ func (p *PhysicalIndexMergeReader) GetPlanCost(taskType property.TaskType, costF return p.planCost, nil } +// GetPartialReaderNetDataSize returns the estimated total response data size of a partial read. +func (p *PhysicalIndexMergeReader) GetPartialReaderNetDataSize(plan PhysicalPlan) float64 { + _, isIdxScan := plan.(*PhysicalIndexScan) + return plan.StatsCount() * getTblStats(plan).GetAvgRowSize(p.ctx, plan.Schema().Columns, isIdxScan, false) +} + // GetPlanCost calculates the cost of the plan if it has not been calculated yet and returns the cost. func (p *PhysicalTableScan) GetPlanCost(taskType property.TaskType, costFlag uint64) (float64, error) { if p.planCostInit && !hasCostFlag(costFlag, CostFlagRecalculate) { @@ -401,7 +423,7 @@ func (p *PhysicalTableScan) GetPlanCost(taskType property.TaskType, costFlag uin switch p.ctx.GetSessionVars().CostModelVersion { case modelVer1: // scan cost: rows * row-size * scan-factor scanFactor := p.ctx.GetSessionVars().GetScanFactor(p.Table) - if p.Desc { + if p.Desc && p.prop != nil && p.prop.ExpectedCnt >= smallScanThreshold { scanFactor = p.ctx.GetSessionVars().GetDescScanFactor(p.Table) } selfCost = getCardinality(p, costFlag) * p.getScanRowSize() * scanFactor @@ -438,7 +460,7 @@ func (p *PhysicalIndexScan) GetPlanCost(taskType property.TaskType, costFlag uin switch p.ctx.GetSessionVars().CostModelVersion { case modelVer1: // scan cost: rows * row-size * scan-factor scanFactor := p.ctx.GetSessionVars().GetScanFactor(p.Table) - if p.Desc { + if p.Desc && p.prop != nil && p.prop.ExpectedCnt >= smallScanThreshold { scanFactor = p.ctx.GetSessionVars().GetDescScanFactor(p.Table) } selfCost = getCardinality(p, costFlag) * p.getScanRowSize() * scanFactor @@ -1150,6 +1172,18 @@ func (p *BatchPointGetPlan) GetPlanCost(taskType property.TaskType, costFlag uin return p.planCost, nil } +// GetAvgRowSize return the average row size. +func (p *BatchPointGetPlan) GetAvgRowSize() float64 { + cols := p.accessCols + if cols == nil { + return 0 // the cost of BatchGet generated in fast plan optimization is always 0 + } + if p.IndexInfo == nil { + return p.stats.HistColl.GetTableAvgRowSize(p.ctx, cols, kv.TiKV, true) + } + return p.stats.HistColl.GetIndexAvgRowSize(p.ctx, cols, p.IndexInfo.Unique) +} + // GetCost returns cost of the PointGetPlan. func (p *PointGetPlan) GetCost() float64 { cols := p.accessCols @@ -1180,6 +1214,18 @@ func (p *PointGetPlan) GetPlanCost(taskType property.TaskType, costFlag uint64) return p.planCost, nil } +// GetAvgRowSize return the average row size. +func (p *PointGetPlan) GetAvgRowSize() float64 { + cols := p.accessCols + if cols == nil { + return 0 // the cost of PointGet generated in fast plan optimization is always 0 + } + if p.IndexInfo == nil { + return p.stats.HistColl.GetTableAvgRowSize(p.ctx, cols, kv.TiKV, true) + } + return p.stats.HistColl.GetIndexAvgRowSize(p.ctx, cols, p.IndexInfo.Unique) +} + // GetPlanCost calculates the cost of the plan if it has not been calculated yet and returns the cost. func (p *PhysicalUnionAll) GetPlanCost(taskType property.TaskType, costFlag uint64) (float64, error) { if p.planCostInit && !hasCostFlag(costFlag, CostFlagRecalculate) { diff --git a/planner/core/plan_cost_test.go b/planner/core/plan_cost_test.go index d8bf5833412ce..3bc86b0231971 100644 --- a/planner/core/plan_cost_test.go +++ b/planner/core/plan_cost_test.go @@ -16,6 +16,7 @@ package core_test import ( "fmt" + "strconv" "strings" "testing" @@ -967,3 +968,39 @@ func TestTrueCardCost(t *testing.T) { checkPlanCost(`select * from t where a>10 limit 10`) checkPlanCost(`select sum(a), b*2 from t use index(b) group by b order by sum(a) limit 10`) } + +func TestIssue36243(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec(`create table t (a int)`) + tk.MustExec(`insert into mysql.expr_pushdown_blacklist values ('>','tikv','')`) + tk.MustExec(`admin reload expr_pushdown_blacklist`) + tk.MustExec(`set @@tidb_enable_new_cost_interface=1`) + + getCost := func() (selCost, readerCost float64) { + res := tk.MustQuery(`explain format=verbose select * from t where a>0`).Rows() + // TableScan -> TableReader -> Selection + require.Equal(t, len(res), 3) + require.Contains(t, res[0][0], "Selection") + require.Contains(t, res[1][0], "TableReader") + require.Contains(t, res[2][0], "Scan") + var err error + selCost, err = strconv.ParseFloat(res[0][2].(string), 64) + require.NoError(t, err) + readerCost, err = strconv.ParseFloat(res[1][2].(string), 64) + require.NoError(t, err) + return + } + + tk.MustExec(`set @@tidb_cost_model_version=1`) + // Selection has the same cost with TableReader, ignore Selection cost for compatibility in cost model ver1. + selCost, readerCost := getCost() + require.Equal(t, selCost, readerCost) + + tk.MustExec(`set @@tidb_cost_model_version=2`) + selCost, readerCost = getCost() + require.True(t, selCost > readerCost) +} diff --git a/planner/core/plan_stats.go b/planner/core/plan_stats.go index b990314fd94da..8636dec9f9180 100644 --- a/planner/core/plan_stats.go +++ b/planner/core/plan_stats.go @@ -19,7 +19,9 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" @@ -40,8 +42,10 @@ func (c collectPredicateColumnsPoint) optimize(ctx context.Context, plan Logical if len(predicateColumns) > 0 { plan.SCtx().UpdateColStatsUsage(predicateColumns) } - if histNeeded && len(histNeededColumns) > 0 { - err := RequestLoadColumnStats(plan.SCtx(), histNeededColumns, syncWait) + histNeededIndices := collectSyncIndices(plan.SCtx(), histNeededColumns) + histNeededItems := collectHistNeededItems(histNeededColumns, histNeededIndices) + if histNeeded && len(histNeededItems) > 0 { + err := RequestLoadStats(plan.SCtx(), histNeededItems, syncWait) return plan, err } return plan, nil @@ -67,8 +71,8 @@ func (s syncWaitStatsLoadPoint) name() string { const maxDuration = 1<<63 - 1 -// RequestLoadColumnStats send requests to stats handle -func RequestLoadColumnStats(ctx sessionctx.Context, neededColumns []model.TableColumnID, syncWait int64) error { +// RequestLoadStats send load column/index stats requests to stats handle +func RequestLoadStats(ctx sessionctx.Context, neededHistItems []model.TableItemID, syncWait int64) error { stmtCtx := ctx.GetSessionVars().StmtCtx hintMaxExecutionTime := int64(stmtCtx.MaxExecutionTime) if hintMaxExecutionTime <= 0 { @@ -80,7 +84,7 @@ func RequestLoadColumnStats(ctx sessionctx.Context, neededColumns []model.TableC } waitTime := mathutil.Min(syncWait, hintMaxExecutionTime, sessMaxExecutionTime) var timeout = time.Duration(waitTime) - err := domain.GetDomain(ctx).StatsHandle().SendLoadRequests(stmtCtx, neededColumns, timeout) + err := domain.GetDomain(ctx).StatsHandle().SendLoadRequests(stmtCtx, neededHistItems, timeout) if err != nil { return handleTimeout(stmtCtx) } @@ -110,3 +114,51 @@ func handleTimeout(stmtCtx *stmtctx.StatementContext) error { } return err } + +// collectSyncIndices will collect the indices which includes following conditions: +// 1. the indices contained the any one of histNeededColumns, eg: histNeededColumns contained A,B columns, and idx_a is +// composed up by A column, then we thought the idx_a should be collected +// 2. The stats condition of idx_a can't meet IsFullLoad, which means its stats was evicted previously +func collectSyncIndices(ctx sessionctx.Context, histNeededColumns []model.TableItemID) map[model.TableItemID]struct{} { + histNeededIndices := make(map[model.TableItemID]struct{}) + stats := domain.GetDomain(ctx).StatsHandle() + for _, column := range histNeededColumns { + if column.IsIndex { + continue + } + tbl, ok := ctx.GetDomainInfoSchema().(infoschema.InfoSchema).TableByID(column.TableID) + if !ok { + continue + } + colName := tbl.Meta().FindColumnNameByID(column.ID) + if colName == "" { + continue + } + for _, idx := range tbl.Indices() { + if idx.Meta().State != model.StatePublic { + continue + } + idxCol := ddl.FindColumnIndexCols(colName, idx.Meta().Columns) + idxID := idx.Meta().ID + if idxCol != nil { + tblStats := stats.GetTableStats(tbl.Meta()) + if tblStats == nil || tblStats.Pseudo { + continue + } + idxStats, ok := tblStats.Indices[idx.Meta().ID] + if !ok || idxStats == nil || !idxStats.IsFullLoad() { + histNeededIndices[model.TableItemID{TableID: column.TableID, ID: idxID, IsIndex: true}] = struct{}{} + } + } + } + } + return histNeededIndices +} + +func collectHistNeededItems(histNeededColumns []model.TableItemID, histNeededIndices map[model.TableItemID]struct{}) (histNeededItems []model.TableItemID) { + for idx := range histNeededIndices { + histNeededItems = append(histNeededItems, idx) + } + histNeededItems = append(histNeededItems, histNeededColumns...) + return +} diff --git a/planner/core/plan_stats_test.go b/planner/core/plan_stats_test.go index 51a303922fe32..22454a20cc2ee 100644 --- a/planner/core/plan_stats_test.go +++ b/planner/core/plan_stats_test.go @@ -183,6 +183,16 @@ func TestPlanStatsLoad(t *testing.T) { require.Greater(t, countFullStats(reader.Stats().HistColl, tableInfo.Columns[2].ID), 0) }, }, + { // check idx(b) + sql: "select * from t USE INDEX(idx) where b >= 10", + check: func(p plannercore.Plan, tableInfo *model.TableInfo) { + pr, ok := p.(*plannercore.PhysicalIndexLookUpReader) + require.True(t, ok) + pis, ok := pr.IndexPlans[0].(*plannercore.PhysicalIndexScan) + require.True(t, ok) + require.True(t, pis.Stats().HistColl.Indices[1].IsEssentialStatsLoaded()) + }, + }, } for _, testCase := range testCases { if testCase.skip { @@ -250,10 +260,10 @@ func TestPlanStatsLoadTimeout(t *testing.T) { tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) require.NoError(t, err) tableInfo := tbl.Meta() - neededColumn := model.TableColumnID{TableID: tableInfo.ID, ColumnID: tableInfo.Columns[0].ID} - resultCh := make(chan model.TableColumnID, 1) + neededColumn := model.TableItemID{TableID: tableInfo.ID, ID: tableInfo.Columns[0].ID, IsIndex: false} + resultCh := make(chan model.TableItemID, 1) timeout := time.Duration(1<<63 - 1) - dom.StatsHandle().AppendNeededColumn(neededColumn, resultCh, timeout) // make channel queue full + dom.StatsHandle().AppendNeededItem(neededColumn, resultCh, timeout) // make channel queue full stmt, err := p.ParseOneStmt("select * from t where c>1", "", "") require.NoError(t, err) tk.MustExec("set global tidb_stats_load_pseudo_timeout=false") diff --git a/planner/core/plan_test.go b/planner/core/plan_test.go index 003ca690a206d..8b3c61f7a2316 100644 --- a/planner/core/plan_test.go +++ b/planner/core/plan_test.go @@ -81,7 +81,14 @@ func TestPreferRangeScan(t *testing.T) { require.NotNil(t, info) p, ok := info.Plan.(core.Plan) require.True(t, ok) - normalized, _ := core.NormalizePlan(p) + normalized, digest := core.NormalizePlan(p) + + // test the new normalization code + flat := core.FlattenPhysicalPlan(p, false) + newNormalized, newDigest := core.NormalizeFlatPlan(flat) + require.Equal(t, normalized, newNormalized) + require.Equal(t, digest, newDigest) + normalizedPlan, err := plancodec.DecodeNormalizedPlan(normalized) normalizedPlanRows := getPlanRows(normalizedPlan) require.NoError(t, err) @@ -118,7 +125,14 @@ func TestNormalizedPlan(t *testing.T) { require.NotNil(t, info) p, ok := info.Plan.(core.Plan) require.True(t, ok) - normalized, _ := core.NormalizePlan(p) + normalized, digest := core.NormalizePlan(p) + + // test the new normalization code + flat := core.FlattenPhysicalPlan(p, false) + newNormalized, newDigest := core.NormalizeFlatPlan(flat) + require.Equal(t, normalized, newNormalized) + require.Equal(t, digest, newDigest) + normalizedPlan, err := plancodec.DecodeNormalizedPlan(normalized) normalizedPlanRows := getPlanRows(normalizedPlan) require.NoError(t, err) @@ -159,6 +173,13 @@ func TestNormalizedPlanForDiffStore(t *testing.T) { ep, ok := info.Plan.(*core.Explain) require.True(t, ok) normalized, digest := core.NormalizePlan(ep.TargetPlan) + + // test the new normalization code + flat := core.FlattenPhysicalPlan(ep.TargetPlan, false) + newNormalized, newPlanDigest := core.NormalizeFlatPlan(flat) + require.Equal(t, digest, newPlanDigest) + require.Equal(t, normalized, newNormalized) + normalizedPlan, err := plancodec.DecodeNormalizedPlan(normalized) normalizedPlanRows := getPlanRows(normalizedPlan) require.NoError(t, err) @@ -184,7 +205,7 @@ func TestEncodeDecodePlan(t *testing.T) { tk.MustExec("set tidb_partition_prune_mode='static';") tk.Session().GetSessionVars().PlanID = 0 - getPlanTree := func() string { + getPlanTree := func() (str1, str2 string) { info := tk.Session().ShowProcess() require.NotNil(t, info) p, ok := info.Plan.(core.Plan) @@ -192,41 +213,89 @@ func TestEncodeDecodePlan(t *testing.T) { encodeStr := core.EncodePlan(p) planTree, err := plancodec.DecodePlan(encodeStr) require.NoError(t, err) - return planTree + + // test the new encoding method + flat := core.FlattenPhysicalPlan(p, true) + newEncodeStr := core.EncodeFlatPlan(flat) + newPlanTree, err := plancodec.DecodePlan(newEncodeStr) + require.NoError(t, err) + + return planTree, newPlanTree } tk.MustExec("select max(a) from t1 where a>0;") - planTree := getPlanTree() + planTree, newplanTree := getPlanTree() require.Contains(t, planTree, "time") require.Contains(t, planTree, "loops") - - tk.MustExec("insert into t1 values (1,1,1);") - planTree = getPlanTree() + require.Contains(t, newplanTree, "time") + require.Contains(t, newplanTree, "loops") + + tk.MustExec("prepare stmt from \"select max(a) from t1 where a > ?\";") + tk.MustExec("set @a = 1;") + tk.MustExec("execute stmt using @a;") + planTree, newplanTree = getPlanTree() + require.Empty(t, planTree) + require.Empty(t, newplanTree) + + tk.MustExec("insert into t1 values (1,1,1), (2,2,2);") + planTree, newplanTree = getPlanTree() require.Contains(t, planTree, "Insert") require.Contains(t, planTree, "time") require.Contains(t, planTree, "loops") + require.Contains(t, newplanTree, "Insert") + require.Contains(t, newplanTree, "time") + require.Contains(t, newplanTree, "loops") + + tk.MustExec("update t1 set b = 3 where c = 1;") + planTree, newplanTree = getPlanTree() + require.Contains(t, planTree, "Update") + require.Contains(t, planTree, "time") + require.Contains(t, planTree, "loops") + require.Contains(t, newplanTree, "Update") + require.Contains(t, newplanTree, "time") + require.Contains(t, newplanTree, "loops") + + tk.MustExec("delete from t1 where b = 3;") + planTree, newplanTree = getPlanTree() + require.Contains(t, planTree, "Delete") + require.Contains(t, planTree, "time") + require.Contains(t, planTree, "loops") + require.Contains(t, newplanTree, "Delete") + require.Contains(t, newplanTree, "time") + require.Contains(t, newplanTree, "loops") tk.MustExec("with cte(a) as (select 1) select * from cte") - planTree = getPlanTree() + planTree, newplanTree = getPlanTree() require.Contains(t, planTree, "CTE") require.Contains(t, planTree, "1->Column#1") require.Contains(t, planTree, "time") require.Contains(t, planTree, "loops") + require.Contains(t, newplanTree, "CTE") + require.Contains(t, newplanTree, "1->Column#1") + require.Contains(t, newplanTree, "time") + require.Contains(t, newplanTree, "loops") tk.MustExec("with cte(a) as (select 2) select * from cte") - planTree = getPlanTree() + planTree, newplanTree = getPlanTree() require.Contains(t, planTree, "CTE") require.Contains(t, planTree, "2->Column#1") require.Contains(t, planTree, "time") require.Contains(t, planTree, "loops") + require.Contains(t, newplanTree, "CTE") + require.Contains(t, newplanTree, "2->Column#1") + require.Contains(t, newplanTree, "time") + require.Contains(t, newplanTree, "loops") tk.MustExec("select * from tp") - planTree = getPlanTree() + planTree, newplanTree = getPlanTree() require.Contains(t, planTree, "PartitionUnion") + require.Contains(t, newplanTree, "PartitionUnion") tk.MustExec("select row_number() over (partition by c) from t1;") - planTree = getPlanTree() + planTree, newplanTree = getPlanTree() require.Contains(t, planTree, "Shuffle") require.Contains(t, planTree, "ShuffleReceiver") + require.Contains(t, newplanTree, "Shuffle") + require.Contains(t, newplanTree, "ShuffleReceiver") } func TestNormalizedDigest(t *testing.T) { @@ -419,12 +488,25 @@ func testNormalizeDigest(tk *testkit.TestKit, t *testing.T, sql1, sql2 string, i require.True(t, ok) normalized1, digest1 := core.NormalizePlan(physicalPlan) + // test the new normalization code + flat := core.FlattenPhysicalPlan(physicalPlan, false) + newNormalized, newPlanDigest := core.NormalizeFlatPlan(flat) + require.Equal(t, digest1, newPlanDigest) + require.Equal(t, normalized1, newNormalized) + tk.MustQuery(sql2) info = tk.Session().ShowProcess() require.NotNil(t, info) physicalPlan, ok = info.Plan.(core.PhysicalPlan) require.True(t, ok) normalized2, digest2 := core.NormalizePlan(physicalPlan) + + // test the new normalization code + flat = core.FlattenPhysicalPlan(physicalPlan, false) + newNormalized, newPlanDigest = core.NormalizeFlatPlan(flat) + require.Equal(t, digest2, newPlanDigest) + require.Equal(t, normalized2, newNormalized) + comment := fmt.Sprintf("sql1: %v, sql2: %v\n%v !=\n%v\n", sql1, sql2, normalized1, normalized2) if isSame { require.Equal(t, normalized1, normalized2, comment) @@ -455,8 +537,12 @@ func TestExplainFormatHint(t *testing.T) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (c1 int not null, c2 int not null, key idx_c2(c2)) partition by range (c2) (partition p0 values less than (10), partition p1 values less than (20))") - tk.MustQuery("explain format='hint' select /*+ use_index(@`sel_2` `test`.`t2` `idx_c2`), hash_agg(@`sel_2`), use_index(@`sel_1` `test`.`t1` `idx_c2`), hash_agg(@`sel_1`) */ count(1) from t t1 where c2 in (select c2 from t t2 where t2.c2 < 15 and t2.c2 > 12)").Check(testkit.Rows( - "use_index(@`sel_2` `test`.`t2` `idx_c2`), hash_agg(@`sel_2`), use_index(@`sel_1` `test`.`t1` `idx_c2`), hash_agg(@`sel_1`)")) + tk.MustQuery("explain format='hint'" + + "select " + + "/*+ use_index(@`sel_2` `test`.`t2` `idx_c2`), hash_agg(@`sel_2`), use_index(@`sel_1` `test`.`t1` `idx_c2`), hash_agg(@`sel_1`) */ " + + "count(1) from t t1 " + + "where c2 in (select c2 from t t2 where t2.c2 < 15 and t2.c2 > 12)").Check(testkit.Rows( + "hash_agg(@`sel_1`), hash_agg(@`sel_2`), use_index(@`sel_2` `test`.`t2` `idx_c2`), use_index(@`sel_1` `test`.`t1` `idx_c2`)")) } func TestExplainFormatHintRecoverableForTiFlashReplica(t *testing.T) { @@ -609,6 +695,32 @@ func BenchmarkEncodePlan(b *testing.B) { } } +func BenchmarkEncodeFlatPlan(b *testing.B) { + store, clean := testkit.CreateMockStore(b) + defer clean() + tk := testkit.NewTestKit(b, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists th") + tk.MustExec("set @@session.tidb_enable_table_partition = 1") + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) + tk.MustExec("create table th (i int, a int,b int, c int, index (a)) partition by hash (a) partitions 8192;") + tk.MustExec("set @@tidb_slow_log_threshold=200000") + + query := "select count(*) from th t1 join th t2 join th t3 join th t4 join th t5 join th t6 where t1.i=t2.a and t1.i=t3.i and t3.i=t4.i and t4.i=t5.i and t5.i=t6.i" + tk.Session().GetSessionVars().PlanID = 0 + tk.MustExec(query) + info := tk.Session().ShowProcess() + require.NotNil(b, info) + p, ok := info.Plan.(core.PhysicalPlan) + require.True(b, ok) + tk.Session().GetSessionVars().StmtCtx.RuntimeStatsColl = nil + b.ResetTimer() + for i := 0; i < b.N; i++ { + flat := core.FlattenPhysicalPlan(p, false) + core.EncodeFlatPlan(flat) + } +} + // Close issue 25729 func TestIssue25729(t *testing.T) { config.UpdateGlobal(func(conf *config.Config) { diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index dbea51006c1dd..fbff431562545 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -189,6 +189,8 @@ func (p *PhysicalTableScan) ToPB(ctx sessionctx.Context, storeType kv.StoreType) } tsExec := tables.BuildTableScanFromInfos(p.Table, p.Columns) tsExec.Desc = p.Desc + keepOrder := p.KeepOrder + tsExec.KeepOrder = &keepOrder if p.isPartition { tsExec.TableId = p.physicalTableID } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 4f574a6010b63..b5c923ff6dd27 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -97,6 +97,7 @@ type tableHintInfo struct { indexMergeHintList []indexHintInfo timeRangeHint ast.HintTimeRange limitHints limitHintInfo + MergeHints MergeHintInfo leadingJoinOrder []hintTableInfo } @@ -104,6 +105,11 @@ 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 @@ -427,6 +433,8 @@ type cteInfo struct { seedStat *property.StatsInfo // The LogicalCTEs that reference the same table should share the same CteClass. cteClass *CTEClass + + isInline bool } // PlanBuilder builds Plan from an ast.Node. @@ -501,6 +509,15 @@ type PlanBuilder struct { allocIDForCTEStorage int buildingRecursivePartForCTE bool buildingCTE bool + + // checkSemiJoinHint checks whether the SEMI_JOIN_REWRITE hint is possible to be applied on the current SELECT stmt. + // We need this variable for the hint since the hint is set in subquery, but we check its availability in its outer scope. + // e.g. select * from t where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t1 where t.a=t1.a) + // Whether the hint can be applied or not is checked after the subquery is fully built. + checkSemiJoinHint bool + // hasValidSemijoinHint would tell the outer APPLY/JOIN operator that there's valid hint to be checked later + // if there's SEMI_JOIN_REWRITE hint and we find checkSemiJoinHint is true. + hasValidSemiJoinHint bool } type handleColHelper struct { @@ -1477,6 +1494,7 @@ func (b *PlanBuilder) buildPhysicalIndexLookUpReader(ctx context.Context, dbName Columns: idxColInfos, Table: tblInfo, TableAsName: &tblInfo.Name, + DBName: dbName, physicalTableID: physicalID, isPartition: isPartition, tblColHists: &(statistics.PseudoTable(tblInfo)).HistColl, diff --git a/planner/core/point_get_plan.go b/planner/core/point_get_plan.go index 85e120de5f340..79771c927f66b 100644 --- a/planner/core/point_get_plan.go +++ b/planner/core/point_get_plan.go @@ -222,6 +222,8 @@ func (p *PointGetPlan) SetOutputNames(names types.NameSlice) { p.outputNames = names } +func (p *PointGetPlan) appendChildCandidate(op *physicalOptimizeOp) {} + // BatchPointGetPlan represents a physical plan which contains a bunch of // keys reference the same table and use the same `unique key` type BatchPointGetPlan struct { @@ -374,6 +376,8 @@ func (p *BatchPointGetPlan) SetOutputNames(names types.NameSlice) { p.names = names } +func (p *BatchPointGetPlan) appendChildCandidate(op *physicalOptimizeOp) {} + // PointPlanKey is used to get point plan that is pre-built for multi-statement query. const PointPlanKey = stringutil.StringerStr("pointPlanKey") diff --git a/planner/core/rule_aggregation_skew_rewrite.go b/planner/core/rule_aggregation_skew_rewrite.go new file mode 100644 index 0000000000000..034347bd14725 --- /dev/null +++ b/planner/core/rule_aggregation_skew_rewrite.go @@ -0,0 +1,295 @@ +// 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 + +import ( + "context" + "fmt" + + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/parser/ast" + fd "github.com/pingcap/tidb/planner/funcdep" +) + +type skewDistinctAggRewriter struct { +} + +// skewDistinctAggRewriter will rewrite group distinct aggregate into 2 level aggregates, e.g.: +// select S_NATIONKEY as s, count(S_SUPPKEY), count(distinct S_NAME) from supplier group by s; +// will be rewritten to +// select S_NATIONKEY as s, sum(c), count(S_NAME) from ( +// select S_NATIONKEY, S_NAME, count(S_SUPPKEY) c from supplier group by S_NATIONKEY, S_NAME +// ) as T group by s; +// +// If the group key is highly skewed and the distinct key has large number of distinct values +// (a.k.a. high cardinality), the query execution will be slow. This rule may help to ease the +// skew issue. +// +// The rewrite rule only applies to query that satisfies: +// - The aggregate has at least 1 group by column (the group key can be columns or expressions) +// - The aggregate has 1 and only 1 distinct aggregate function (limited to count, avg, sum) +// +// This rule is disabled by default. Use tidb_opt_skew_distinct_agg to enable the rule. +func (a *skewDistinctAggRewriter) rewriteSkewDistinctAgg(agg *LogicalAggregation, opt *logicalOptimizeOp) LogicalPlan { + // only group aggregate is applicable + if len(agg.GroupByItems) == 0 { + return nil + } + + // the number of distinct aggregate functions + nDistinct := 0 + // distinct columns collected from original aggregate + distinctCols := make([]expression.Expression, 0, 3 /* arbitrary value*/) + + for _, aggFunc := range agg.AggFuncs { + if aggFunc.HasDistinct { + nDistinct++ + distinctCols = append(distinctCols, aggFunc.Args...) + } + // TODO: support multiple DQA on same column, e.g. count(distinct x), sum(distinct x) + if nDistinct > 1 { + return nil + } + if !a.isQualifiedAgg(aggFunc) { + return nil + } + } + + // we only deal with single distinct aggregate for now, no more, no less + if nDistinct != 1 { + return nil + } + + // count(distinct a,b,c) group by d + // will generate a bottom agg with group by a,b,c,d + bottomAggGroupbyItems := make([]expression.Expression, 0, len(agg.GroupByItems)+len(distinctCols)) + bottomAggGroupbyItems = append(bottomAggGroupbyItems, agg.GroupByItems...) + bottomAggGroupbyItems = append(bottomAggGroupbyItems, distinctCols...) + + // aggregate functions for top aggregate + topAggFuncs := make([]*aggregation.AggFuncDesc, 0, len(agg.AggFuncs)) + // aggregate functions for bottom aggregate + bottomAggFuncs := make([]*aggregation.AggFuncDesc, 0, len(agg.AggFuncs)) + // output schema for top aggregate + topAggSchema := agg.schema.Clone() + // output schema for bottom aggregate + bottomAggSchema := expression.NewSchema(make([]*expression.Column, 0, agg.schema.Len())...) + + // columns used by group by items in the original aggregate + groupCols := make([]*expression.Column, 0, 3) + // columns that should be used by firstrow(), which will be appended to + // bottomAgg schema and aggregate functions + firstRowCols := fd.NewFastIntSet() + for _, groupByItem := range agg.GroupByItems { + usedCols := expression.ExtractColumns(groupByItem) + groupCols = append(groupCols, usedCols...) + for _, col := range usedCols { + firstRowCols.Insert(int(col.UniqueID)) + } + } + + // we only care about non-distinct count() agg function + cntIndexes := make([]int, 0, 3) + + // now decompose original aggregate functions into 2 level aggregate functions, + // except distinct function. each agg function is in COMPLETE mode. + for i, aggFunc := range agg.AggFuncs { + // have to clone it to avoid unexpected modification by others, (︶︹︺) + newAggFunc := aggFunc.Clone() + if aggFunc.HasDistinct { + // TODO: support count(distinct a,b,c) + if len(aggFunc.Args) != 1 { + return nil + } + + for _, arg := range aggFunc.Args { + firstRow, err := aggregation.NewAggFuncDesc(agg.ctx, ast.AggFuncFirstRow, + []expression.Expression{arg}, false) + if err != nil { + return nil + } + bottomAggFuncs = append(bottomAggFuncs, firstRow) + bottomAggSchema.Append(arg.(*expression.Column)) + } + + // now the distinct is not needed anymore + newAggFunc.HasDistinct = false + topAggFuncs = append(topAggFuncs, newAggFunc) + } else { + // only count() will be decomposed to sum() + count(), the others will keep same + // original aggregate functions will go to bottom aggregate without any change + bottomAggFuncs = append(bottomAggFuncs, newAggFunc) + + // cast to Column, if failed, we know it is Constant, ignore the error message, + // we will later create a new schema column + aggCol, ok := newAggFunc.Args[0].(*expression.Column) + + // firstrow() doesn't change the input value and type + if newAggFunc.Name == ast.AggFuncFirstRow { + if ok { + firstRowCols.Remove(int(aggCol.UniqueID)) + } + } else { + aggCol = &expression.Column{ + UniqueID: agg.ctx.GetSessionVars().AllocPlanColumnID(), + RetType: newAggFunc.RetTp, + } + } + bottomAggSchema.Append(aggCol) + + if newAggFunc.Name == ast.AggFuncCount { + cntIndexes = append(cntIndexes, i) + sumAggFunc, err := aggregation.NewAggFuncDesc(agg.ctx, ast.AggFuncSum, + []expression.Expression{aggCol}, false) + if err != nil { + return nil + } + topAggFuncs = append(topAggFuncs, sumAggFunc) + topAggSchema.Columns[i] = &expression.Column{ + UniqueID: agg.ctx.GetSessionVars().AllocPlanColumnID(), + RetType: sumAggFunc.RetTp, + } + } else { + topAggFunc := aggFunc.Clone() + topAggFunc.Args = make([]expression.Expression, 0, len(aggFunc.Args)) + topAggFunc.Args = append(topAggFunc.Args, aggCol) + topAggFuncs = append(topAggFuncs, topAggFunc) + } + } + } + + for _, col := range groupCols { + // the col is used by GROUP BY clause, but not in the output schema, e.g. + // SELECT count(DISTINCT a) FROM t GROUP BY b; + // column b is not in the output schema, we have to add it to the bottom agg schema + if firstRowCols.Has(int(col.UniqueID)) { + firstRow, err := aggregation.NewAggFuncDesc(agg.ctx, ast.AggFuncFirstRow, + []expression.Expression{col}, false) + if err != nil { + return nil + } + bottomAggFuncs = append(bottomAggFuncs, firstRow) + bottomAggSchema.Append(col) + } + } + + // now create the bottom and top aggregate operators + bottomAgg := LogicalAggregation{ + AggFuncs: bottomAggFuncs, + GroupByItems: bottomAggGroupbyItems, + aggHints: agg.aggHints, + }.Init(agg.ctx, agg.blockOffset) + bottomAgg.SetChildren(agg.children...) + bottomAgg.SetSchema(bottomAggSchema) + + topAgg := LogicalAggregation{ + AggFuncs: topAggFuncs, + GroupByItems: agg.GroupByItems, + aggHints: agg.aggHints, + }.Init(agg.ctx, agg.blockOffset) + topAgg.SetChildren(bottomAgg) + topAgg.SetSchema(topAggSchema) + + if len(cntIndexes) == 0 { + appendSkewDistinctAggRewriteTraceStep(agg, topAgg, opt) + return topAgg + } + + // it has count(), we have split it into sum()+count(), since sum() returns decimal + // we have to return a project operator that casts decimal to bigint + proj := LogicalProjection{ + Exprs: make([]expression.Expression, 0, len(agg.AggFuncs)), + }.Init(agg.ctx, agg.blockOffset) + for _, column := range topAggSchema.Columns { + proj.Exprs = append(proj.Exprs, column.Clone()) + } + + // wrap sum() with cast function to keep output data type same + for _, index := range cntIndexes { + exprType := proj.Exprs[index].GetType() + targetType := agg.schema.Columns[index].GetType() + if !exprType.Equal(targetType) { + proj.Exprs[index] = expression.BuildCastFunction(agg.ctx, proj.Exprs[index], targetType) + } + } + proj.SetSchema(agg.schema.Clone()) + proj.SetChildren(topAgg) + appendSkewDistinctAggRewriteTraceStep(agg, proj, opt) + return proj +} + +func (a *skewDistinctAggRewriter) isQualifiedAgg(aggFunc *aggregation.AggFuncDesc) bool { + if aggFunc.Mode != aggregation.CompleteMode { + return false + } + if len(aggFunc.OrderByItems) > 0 || len(aggFunc.Args) > 1 { + return false + } + + for _, arg := range aggFunc.Args { + if _, ok := arg.(*expression.Column); !ok { + if _, ok := arg.(*expression.Constant); !ok { + return false + } + } + } + + switch aggFunc.Name { + case ast.AggFuncFirstRow, ast.AggFuncCount, ast.AggFuncSum, ast.AggFuncMax, ast.AggFuncMin: + return true + case ast.AggFuncBitAnd, ast.AggFuncBitOr, ast.AggFuncBitXor: + return false + case ast.AggFuncAvg: + return aggFunc.HasDistinct + default: + return false + } +} + +func appendSkewDistinctAggRewriteTraceStep(agg *LogicalAggregation, result LogicalPlan, opt *logicalOptimizeOp) { + reason := func() string { + return fmt.Sprintf("%v_%v has a distinct agg function", agg.TP(), agg.ID()) + } + action := func() string { + return fmt.Sprintf("%v_%v is rewritten to a %v_%v", agg.TP(), agg.ID(), result.TP(), result.ID()) + } + + opt.appendStepToCurrent(agg.ID(), agg.TP(), reason, action) +} + +func (a *skewDistinctAggRewriter) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + newChildren := make([]LogicalPlan, 0, len(p.Children())) + for _, child := range p.Children() { + newChild, err := a.optimize(ctx, child, opt) + if err != nil { + return nil, err + } + newChildren = append(newChildren, newChild) + } + p.SetChildren(newChildren...) + agg, ok := p.(*LogicalAggregation) + if !ok { + return p, nil + } + if newAgg := a.rewriteSkewDistinctAgg(agg, opt); newAgg != nil { + return newAgg, nil + } + return p, nil +} + +func (*skewDistinctAggRewriter) name() string { + return "skew_distinct_agg_rewrite" +} diff --git a/planner/core/rule_build_key_info.go b/planner/core/rule_build_key_info.go index 22ec84d150bc4..361a821c8f2cd 100644 --- a/planner/core/rule_build_key_info.go +++ b/planner/core/rule_build_key_info.go @@ -48,6 +48,10 @@ func (la *LogicalAggregation) BuildKeyInfo(selfSchema *expression.Schema, childS return } la.logicalSchemaProducer.BuildKeyInfo(selfSchema, childSchema) + la.buildSelfKeyInfo(selfSchema) +} + +func (la *LogicalAggregation) buildSelfKeyInfo(selfSchema *expression.Schema) { groupByCols := la.GetGroupByCols() if len(groupByCols) == len(la.GroupByItems) && len(la.GroupByItems) > 0 { indices := selfSchema.ColumnsIndices(groupByCols) diff --git a/planner/core/rule_decorrelate.go b/planner/core/rule_decorrelate.go index 7626f5863f2c2..a09c55f1dac3e 100644 --- a/planner/core/rule_decorrelate.go +++ b/planner/core/rule_decorrelate.go @@ -154,7 +154,9 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan, opt *lo return s.optimize(ctx, p, opt) } } else if proj, ok := innerPlan.(*LogicalProjection); ok { - allConst := true + // After the column pruning, some expressions in the projection operator may be pruned. + // In this situation, we can decorrelate the apply operator. + allConst := len(proj.Exprs) > 0 for _, expr := range proj.Exprs { if len(expression.ExtractCorColumns(expr)) > 0 || !expression.ExtractColumnSet(expr).IsEmpty() { allConst = false diff --git a/planner/core/rule_join_reorder_test.go b/planner/core/rule_join_reorder_test.go index 4c15c6052eafd..3d6aed01a52c3 100644 --- a/planner/core/rule_join_reorder_test.go +++ b/planner/core/rule_join_reorder_test.go @@ -214,6 +214,9 @@ func TestJoinOrderHint4StaticPartitionTable(t *testing.T) { tk.MustExec(`create table t1(a int, b int) partition by hash(a) partitions 4`) tk.MustExec(`create table t2(a int, b int) partition by hash(a) partitions 5`) tk.MustExec(`create table t3(a int, b int) partition by hash(b) partitions 3`) + tk.MustExec(`create table t4(a int, b int) partition by hash(a) partitions 4`) + tk.MustExec(`create table t5(a int, b int) partition by hash(a) partitions 5`) + tk.MustExec(`create table t6(a int, b int) partition by hash(b) partitions 3`) tk.MustExec(`set @@tidb_partition_prune_mode="static"`) runJoinReorderTestData(t, tk, "TestJoinOrderHint4StaticPartitionTable") @@ -230,6 +233,9 @@ func TestJoinOrderHint4DynamicPartitionTable(t *testing.T) { tk.MustExec(`create table t1(a int, b int) partition by hash(a) partitions 4`) tk.MustExec(`create table t2(a int, b int) partition by hash(a) partitions 5`) tk.MustExec(`create table t3(a int, b int) partition by hash(b) partitions 3`) + tk.MustExec(`create table t4(a int, b int) partition by hash(a) partitions 4`) + tk.MustExec(`create table t5(a int, b int) partition by hash(a) partitions 5`) + tk.MustExec(`create table t6(a int, b int) partition by hash(b) partitions 3`) tk.MustExec(`set @@tidb_partition_prune_mode="dynamic"`) runJoinReorderTestData(t, tk, "TestJoinOrderHint4DynamicPartitionTable") @@ -265,6 +271,9 @@ func TestJoinOrderHint4TiFlash(t *testing.T) { 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 table t4(a int, b int, key(a));") + tk.MustExec("create table t5(a int, b int, key(a));") + tk.MustExec("create table t6(a int, b int, key(a));") // Create virtual tiflash replica info. dom := domain.GetDomain(tk.Session()) @@ -273,7 +282,7 @@ func TestJoinOrderHint4TiFlash(t *testing.T) { require.True(t, exists) for _, tblInfo := range db.Tables { tableName := tblInfo.Name.L - if tableName == "t" || tableName == "t1" || tableName == "t2" || tableName == "t3" { + if tableName == "t" || tableName == "t1" || tableName == "t2" || tableName == "t3" || tableName == "t4" || tableName == "t5" || tableName == "t6" { tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ Count: 1, Available: true, diff --git a/planner/core/rule_semi_join_rewrite.go b/planner/core/rule_semi_join_rewrite.go new file mode 100644 index 0000000000000..0bce68183b59e --- /dev/null +++ b/planner/core/rule_semi_join_rewrite.go @@ -0,0 +1,115 @@ +// 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 + +import ( + "context" + + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/parser/ast" +) + +type semiJoinRewriter struct { +} + +func (smj *semiJoinRewriter) optimize(_ context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + return smj.recursivePlan(p) +} + +func (smj *semiJoinRewriter) name() string { + return "semi_join_rewrite" +} + +func (smj *semiJoinRewriter) recursivePlan(p LogicalPlan) (LogicalPlan, error) { + newChildren := make([]LogicalPlan, 0, len(p.Children())) + for _, child := range p.Children() { + newChild, err := smj.recursivePlan(child) + if err != nil { + return nil, err + } + newChildren = append(newChildren, newChild) + } + p.SetChildren(newChildren...) + 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) { + return p, nil + } + + if join.JoinType == LeftOuterSemiJoin { + p.SCtx().GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack("SEMI_JOIN_REWRITE() is inapplicable for LeftOuterSemiJoin.")) + return p, nil + } + + // If we have jumped the above if condition. We can make sure that the current join is a non-correlated one. + + // 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.")) + return p, nil + } + + innerChild := join.Children()[1] + + // If there's right conditions: + // - If it's semi join, then right condition should be pushed. + // - If it's outer semi join, then it still should be pushed since the outer join should not remain any cond of the inner side. + // 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()) + copy(sel.Conditions, join.RightConditions) + sel.SetChildren(innerChild) + innerChild = sel + } + + 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()) + + aggOutputCols := make([]*expression.Column, 0, len(join.EqualConditions)) + for i := range join.EqualConditions { + innerCol := join.EqualConditions[i].GetArgs()[1].(*expression.Column) + firstRow, err := aggregation.NewAggFuncDesc(join.SCtx(), ast.AggFuncFirstRow, []expression.Expression{innerCol}, false) + if err != nil { + return nil, err + } + subAgg.AggFuncs = append(subAgg.AggFuncs, firstRow) + subAgg.GroupByItems = append(subAgg.GroupByItems, innerCol) + aggOutputCols = append(aggOutputCols, innerCol) + } + subAgg.SetChildren(innerChild) + subAgg.SetSchema(expression.NewSchema(aggOutputCols...)) + subAgg.buildSelfKeyInfo(subAgg.Schema()) + + innerJoin := LogicalJoin{ + JoinType: InnerJoin, + EqualConditions: make([]*expression.ScalarFunction, 0, len(join.EqualConditions)), + }.Init(p.SCtx(), p.SelectBlockOffset()) + 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()) + proj.SetChildren(innerJoin) + proj.SetSchema(join.Children()[0].Schema()) + + return proj, nil +} diff --git a/planner/core/task.go b/planner/core/task.go index 7d88aac896812..8181f985cc61f 100644 --- a/planner/core/task.go +++ b/planner/core/task.go @@ -809,6 +809,7 @@ func (t *copTask) handleRootTaskConds(ctx sessionctx.Context, newTask *rootTask) selectivity = SelectionFactor } sel := PhysicalSelection{Conditions: t.rootTaskConds}.Init(ctx, newTask.p.statsInfo().Scale(selectivity), newTask.p.SelectBlockOffset()) + sel.fromDataSource = true sel.SetChildren(newTask.p) newTask.p = sel sel.cost = newTask.cost() diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index 71a54e4d86f28..32924912e9848 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -17,7 +17,7 @@ { "SQL": "explain format = 'hint' select * from t1, t2 where t1.a = t2.a", "Plan": [ - "use_index(@`sel_1` `test`.`t1` ), use_index(@`sel_1` `test`.`t2` ), hash_join(@`sel_1` `test`.`t1`)" + "hash_join(@`sel_1` `test`.`t1`), use_index(@`sel_1` `test`.`t1` ), use_index(@`sel_1` `test`.`t2` )" ] } ] diff --git a/planner/core/testdata/binary_plan_suite_in.json b/planner/core/testdata/binary_plan_suite_in.json new file mode 100644 index 0000000000000..b2d81b30a5c1f --- /dev/null +++ b/planner/core/testdata/binary_plan_suite_in.json @@ -0,0 +1,22 @@ +[ + { + "name": "TestBinaryPlanInExplainAndSlowLog", + "cases": [ + "create table t(a int, b int, index ia(a))", + "create table t2(a int, b int)", + "insert into t value(1,1), (3,3)", + "explain analyze format = 'binary' insert into t2 value(2,2), (4,4)", + "explain analyze format = 'binary' replace into t2 value(2,2), (4,4)", + "explain analyze format = 'binary' select * from t", + "explain analyze format = 'binary' select sum(t.a) from t join t2", + "explain analyze format = 'binary' select a from t use index (ia) where a > 100", + "explain analyze format = 'binary' select a from t use index () where a > 100", + "explain analyze format = 'binary' with cte1 as (select a, b from t), cte2 as (select a, b from t2) select * from cte1 join cte2 on cte1.a = cte2.a", + "explain analyze format = 'binary' WITH RECURSIVE cte (n) AS( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte", + "explain analyze format = 'binary' update t2 set a = a + 1 where b > 10", + "explain analyze format = 'binary' insert into t2 value(2,2), (4,4)", + "explain analyze format = 'binary' insert into t2 select * from t", + "explain analyze format = 'binary' delete from t2" + ] + } +] diff --git a/planner/core/testdata/binary_plan_suite_out.json b/planner/core/testdata/binary_plan_suite_out.json new file mode 100644 index 0000000000000..35738707d9258 --- /dev/null +++ b/planner/core/testdata/binary_plan_suite_out.json @@ -0,0 +1,567 @@ +[ + { + "Name": "TestBinaryPlanInExplainAndSlowLog", + "Cases": [ + { + "SQL": "create table t(a int, b int, index ia(a))", + "BinaryPlan": null + }, + { + "SQL": "create table t2(a int, b int)", + "BinaryPlan": null + }, + { + "SQL": "insert into t value(1,1), (3,3)", + "BinaryPlan": null + }, + { + "SQL": "explain analyze format = 'binary' insert into t2 value(2,2), (4,4)", + "BinaryPlan": { + "main": { + "name": "Insert_1", + "task_type": 1, + "store_type": 1, + "operator_info": "N/A" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' replace into t2 value(2,2), (4,4)", + "BinaryPlan": { + "main": { + "name": "Insert_1", + "task_type": 1, + "store_type": 1, + "operator_info": "N/A" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' select * from t", + "BinaryPlan": { + "main": { + "name": "TableReader_5", + "children": [ + { + "name": "TableFullScan_4", + "cost": 570000, + "est_rows": 10000, + "act_rows": 2, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 48834.666666666664, + "est_rows": 10000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "data:TableFullScan_4" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' select sum(t.a) from t join t2", + "BinaryPlan": { + "main": { + "name": "HashAgg_8", + "children": [ + { + "name": "Projection_20", + "children": [ + { + "name": "HashJoin_10", + "children": [ + { + "name": "IndexReader_15", + "children": [ + { + "name": "IndexFullScan_14", + "cost": 435000, + "est_rows": 10000, + "act_rows": 2, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "labels": [ + 2 + ], + "cost": 34418, + "est_rows": 10000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "index:IndexFullScan_14" + }, + { + "name": "TableReader_17", + "children": [ + { + "name": "TableFullScan_16", + "cost": 570000, + "est_rows": 10000, + "act_rows": 4, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "labels": [ + 1 + ], + "cost": 43418, + "est_rows": 10000, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "data:TableFullScan_16" + } + ], + "cost": 60107864, + "est_rows": 100000000, + "act_rows": 8, + "task_type": 1, + "store_type": 1, + "operator_info": "CARTESIAN inner join" + } + ], + "cost": 120107882, + "est_rows": 100000000, + "act_rows": 8, + "task_type": 1, + "store_type": 1, + "operator_info": "cast(test.t.a, decimal(10,0) BINARY)->Column#8" + } + ], + "cost": 120107897.001, + "est_rows": 1, + "act_rows": 1, + "task_type": 1, + "store_type": 1, + "operator_info": "funcs:sum(Column#8)->Column#7" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' select a from t use index (ia) where a > 100", + "BinaryPlan": { + "main": { + "name": "IndexReader_6", + "children": [ + { + "name": "IndexRangeScan_5", + "cost": 145000, + "est_rows": 3333.3333333333335, + "task_type": 2, + "store_type": 2, + "operator_info": "range:(100,+inf], keep order:false, stats:pseudo" + } + ], + "cost": 11473.555555555557, + "est_rows": 3333.3333333333335, + "task_type": 1, + "store_type": 1, + "operator_info": "index:IndexRangeScan_5" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' select a from t use index () where a > 100", + "BinaryPlan": { + "main": { + "name": "TableReader_7", + "children": [ + { + "name": "Selection_6", + "children": [ + { + "name": "TableFullScan_5", + "cost": 570000, + "est_rows": 10000, + "act_rows": 2, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 600000, + "est_rows": 3333.3333333333335, + "task_type": 2, + "store_type": 2, + "operator_info": "gt(test.t.a, 100)" + } + ], + "cost": 41806.88888888889, + "est_rows": 3333.3333333333335, + "task_type": 1, + "store_type": 1, + "operator_info": "data:Selection_6" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' with cte1 as (select a, b from t), cte2 as (select a, b from t2) select * from cte1 join cte2 on cte1.a = cte2.a", + "BinaryPlan": { + "main": { + "name": "HashJoin_24", + "children": [ + { + "name": "Selection_26", + "children": [ + { + "name": "CTEFullScan_27", + "est_rows": 8000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "data:CTE_0" + } + ], + "labels": [ + 2 + ], + "cost": 24000, + "est_rows": 6400, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "not(isnull(test.t.a))" + }, + { + "name": "Selection_28", + "children": [ + { + "name": "CTEFullScan_29", + "est_rows": 8000, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "data:CTE_1" + } + ], + "labels": [ + 1 + ], + "cost": 24000, + "est_rows": 6400, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "not(isnull(test.t2.a))" + } + ], + "cost": 72024.4, + "est_rows": 8000, + "task_type": 1, + "store_type": 1, + "operator_info": "inner join, equal:[eq(test.t.a, test.t2.a)]" + }, + "ctes": [ + { + "name": "CTE_0", + "children": [ + { + "name": "Selection_13", + "children": [ + { + "name": "TableReader_16", + "children": [ + { + "name": "TableFullScan_15", + "cost": 570000, + "est_rows": 10000, + "act_rows": 2, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 48834.666666666664, + "est_rows": 10000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "data:TableFullScan_15" + } + ], + "labels": [ + 3 + ], + "cost": 84852.66666666666, + "est_rows": 8000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "not(isnull(test.t.a))" + } + ], + "est_rows": 8000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "Non-Recursive CTE" + }, + { + "name": "CTE_1", + "children": [ + { + "name": "Selection_18", + "children": [ + { + "name": "TableReader_21", + "children": [ + { + "name": "TableFullScan_20", + "cost": 570000, + "est_rows": 10000, + "act_rows": 4, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 48834.666666666664, + "est_rows": 10000, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "data:TableFullScan_20" + } + ], + "labels": [ + 3 + ], + "cost": 84852.66666666666, + "est_rows": 8000, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "not(isnull(test.t2.a))" + } + ], + "est_rows": 8000, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "Non-Recursive CTE" + } + ], + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' WITH RECURSIVE cte (n) AS( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte", + "BinaryPlan": { + "main": { + "name": "CTEFullScan_17", + "est_rows": 1.8, + "act_rows": 5, + "task_type": 1, + "store_type": 1, + "operator_info": "data:CTE_0" + }, + "ctes": [ + { + "name": "CTE_0", + "children": [ + { + "name": "Projection_11", + "children": [ + { + "name": "TableDual_12", + "est_rows": 1, + "act_rows": 1, + "task_type": 1, + "store_type": 1, + "operator_info": "rows:1" + } + ], + "labels": [ + 3 + ], + "cost": 18.6, + "est_rows": 1, + "act_rows": 1, + "task_type": 1, + "store_type": 1, + "operator_info": "1->Column#2" + }, + { + "name": "Projection_13", + "children": [ + { + "name": "Selection_14", + "children": [ + { + "name": "CTETable_15", + "est_rows": 1, + "act_rows": 5, + "task_type": 1, + "store_type": 1, + "operator_info": "Scan on CTE_0" + } + ], + "cost": 3, + "est_rows": 0.8, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "lt(Column#3, 5)" + } + ], + "labels": [ + 4 + ], + "cost": 21.48, + "est_rows": 0.8, + "act_rows": 4, + "task_type": 1, + "store_type": 1, + "operator_info": "cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5" + } + ], + "est_rows": 1.8, + "act_rows": 5, + "task_type": 1, + "store_type": 1, + "operator_info": "Recursive CTE" + } + ], + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' update t2 set a = a + 1 where b > 10", + "BinaryPlan": { + "main": { + "name": "Update_4", + "children": [ + { + "name": "TableReader_8", + "children": [ + { + "name": "Selection_7", + "children": [ + { + "name": "TableFullScan_6", + "cost": 570000, + "est_rows": 10000, + "act_rows": 4, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 600000, + "est_rows": 3333.3333333333335, + "task_type": 2, + "store_type": 2, + "operator_info": "gt(test.t2.b, 10)" + } + ], + "cost": 45418, + "est_rows": 3333.3333333333335, + "task_type": 1, + "store_type": 1, + "operator_info": "data:Selection_7" + } + ], + "task_type": 1, + "store_type": 1, + "operator_info": "N/A" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' insert into t2 value(2,2), (4,4)", + "BinaryPlan": { + "main": { + "name": "Insert_1", + "task_type": 1, + "store_type": 1, + "operator_info": "N/A" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' insert into t2 select * from t", + "BinaryPlan": { + "main": { + "name": "Insert_1", + "children": [ + { + "name": "TableReader_7", + "children": [ + { + "name": "TableFullScan_6", + "cost": 570000, + "est_rows": 10000, + "act_rows": 2, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 48834.666666666664, + "est_rows": 10000, + "act_rows": 2, + "task_type": 1, + "store_type": 1, + "operator_info": "data:TableFullScan_6" + } + ], + "task_type": 1, + "store_type": 1, + "operator_info": "N/A" + }, + "with_runtime_stats": true + } + }, + { + "SQL": "explain analyze format = 'binary' delete from t2", + "BinaryPlan": { + "main": { + "name": "Delete_3", + "children": [ + { + "name": "TableReader_6", + "children": [ + { + "name": "TableFullScan_5", + "cost": 570000, + "est_rows": 10000, + "act_rows": 8, + "task_type": 2, + "store_type": 2, + "operator_info": "keep order:false, stats:pseudo" + } + ], + "cost": 54251.333333333336, + "est_rows": 10000, + "act_rows": 8, + "task_type": 1, + "store_type": 1, + "operator_info": "data:TableFullScan_5" + } + ], + "task_type": 1, + "store_type": 1, + "operator_info": "N/A" + }, + "with_runtime_stats": true + } + } + ] + } +] diff --git a/planner/core/testdata/enforce_mpp_suite_in.json b/planner/core/testdata/enforce_mpp_suite_in.json index 3c70fa18e5a5f..208799941da5c 100644 --- a/planner/core/testdata/enforce_mpp_suite_in.json +++ b/planner/core/testdata/enforce_mpp_suite_in.json @@ -94,5 +94,24 @@ "EXPLAIN select o.o_id, count(*) from c, o where c.c_id=o.c_id group by o.o_id; -- 2. test agg push down, group by non-join column", "EXPLAIN select o.c_id, count(*) from c, o where c.c_id=o.c_id group by o.c_id; -- 3. test agg push down, group by join column" ] + }, + { + "name": "TestMPPSkewedGroupDistinctRewrite", + "cases": [ + "set @@tidb_allow_mpp=1;set @@tidb_enforce_mpp=1;set @@tidb_opt_skew_distinct_agg=1;", + "EXPLAIN select count(distinct c) from t group by d;", + "EXPLAIN select count(distinct c), count(a) from t group by d;", + "EXPLAIN select count(distinct c) from t group by b+d;", + "EXPLAIN select count(distinct c) from t group by b+d, a+b;", + "EXPLAIN select count(distinct c), count(*) from t group by date_format(d,'%Y');", + "EXPLAIN select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) from t group by date_format(d,'%Y');", + "EXPLAIN select d, count(distinct c), sum(a), max(b), count(*) from t group by d;", + "EXPLAIN select date_format(d,'%Y') as df, count(distinct c) from t group by date_format(d,'%Y');", + "EXPLAIN select date_format(d,'%Y') as df, a, count(b), count(distinct c) from t group by date_format(d,'%Y'), a;", + "EXPLAIN select date_format(d,'%Y') as df, a, count(b), avg(distinct c) from t group by date_format(d,'%Y'), a;", + "EXPLAIN select d,e, min(b), count(distinct c), bit_or(a) from t group by e,d; -- bit agg func can't be pushed to TiFlash", + "EXPLAIN select a, count(b), avg(distinct c), count(distinct c) from t group by a; -- multi distinct funcs, bail out", + "EXPLAIN select count(b), count(distinct c) from t; -- single distinct func but no group key, bail out" + ] } ] diff --git a/planner/core/testdata/enforce_mpp_suite_out.json b/planner/core/testdata/enforce_mpp_suite_out.json index 4ef7f843bf651..5a751c2158014 100644 --- a/planner/core/testdata/enforce_mpp_suite_out.json +++ b/planner/core/testdata/enforce_mpp_suite_out.json @@ -592,30 +592,30 @@ { "SQL": "explain select a from t where t.a>1 or t.a in (select a from t); -- 7. left outer semi join", "Plan": [ - "TableReader_48 8000.00 root data:ExchangeSender_47", - "└─ExchangeSender_47 8000.00 mpp[tiflash] ExchangeType: PassThrough", + "TableReader_51 8000.00 root data:ExchangeSender_50", + "└─ExchangeSender_50 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] test.t.a", - " └─Selection_45 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#3)", + " └─Selection_49 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#3)", " └─HashJoin_46 10000.00 mpp[tiflash] left outer semi join, equal:[eq(test.t.a, test.t.a)]", - " ├─ExchangeReceiver_26(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender_25 10000.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan_24 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", - " └─TableFullScan_23(Probe) 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + " ├─ExchangeReceiver_27(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan_25 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan_24(Probe) 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain select a from t where t.a>1 or t.a not in (select a from t); -- now it's supported -- 8. anti left outer semi join", "Plan": [ - "TableReader_48 8000.00 root data:ExchangeSender_47", - "└─ExchangeSender_47 8000.00 mpp[tiflash] ExchangeType: PassThrough", + "TableReader_51 8000.00 root data:ExchangeSender_50", + "└─ExchangeSender_50 8000.00 mpp[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 mpp[tiflash] test.t.a", - " └─Selection_45 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#3)", + " └─Selection_49 8000.00 mpp[tiflash] or(gt(test.t.a, 1), Column#3)", " └─HashJoin_46 10000.00 mpp[tiflash] anti left outer semi join, equal:[eq(test.t.a, test.t.a)]", - " ├─ExchangeReceiver_26(Build) 10000.00 mpp[tiflash] ", - " │ └─ExchangeSender_25 10000.00 mpp[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan_24 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", - " └─TableFullScan_23(Probe) 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + " ├─ExchangeReceiver_27(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender_26 10000.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan_25 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan_24(Probe) 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, @@ -709,5 +709,270 @@ "Warn": null } ] + }, + { + "Name": "TestMPPSkewedGroupDistinctRewrite", + "Cases": [ + { + "SQL": "set @@tidb_allow_mpp=1;set @@tidb_enforce_mpp=1;set @@tidb_opt_skew_distinct_agg=1;", + "Plan": null, + "Warn": null + }, + { + "SQL": "EXPLAIN select count(distinct c) from t group by d;", + "Plan": [ + "TableReader_56 8000.00 root data:ExchangeSender_55", + "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_51 8000.00 mpp[tiflash] Column#7", + " └─HashAgg_52 8000.00 mpp[tiflash] group by:test.t.d, funcs:sum(Column#18)->Column#7", + " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary]", + " └─HashAgg_50 8000.00 mpp[tiflash] group by:test.t.d, funcs:count(test.t.c)->Column#18", + " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.d", + " └─HashAgg_38 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.d)->test.t.d", + " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg_36 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, ", + " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select count(distinct c), count(a) from t group by d;", + "Plan": [ + "TableReader_57 8000.00 root data:ExchangeSender_56", + "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_8 8000.00 mpp[tiflash] Column#7, cast(Column#10, bigint(21) BINARY)->Column#8", + " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#10", + " └─HashAgg_53 8000.00 mpp[tiflash] group by:test.t.d, funcs:sum(Column#27)->Column#7, funcs:sum(Column#28)->Column#10", + " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary]", + " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#31, funcs:count(Column#29)->Column#27, funcs:sum(Column#30)->Column#28", + " └─Projection_58 8000.00 mpp[tiflash] test.t.c, cast(Column#9, decimal(20,0) BINARY)->Column#30, test.t.d", + " └─Projection_38 8000.00 mpp[tiflash] test.t.c, Column#9, test.t.d", + " └─HashAgg_39 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:firstrow(test.t.c)->test.t.c, funcs:sum(Column#21)->Column#9, funcs:firstrow(test.t.d)->test.t.d", + " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg_37 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:count(test.t.a)->Column#21", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select count(distinct c) from t group by b+d;", + "Plan": [ + "TableReader_56 8000.00 root data:ExchangeSender_55", + "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_51 8000.00 mpp[tiflash] Column#7", + " └─HashAgg_52 8000.00 mpp[tiflash] group by:Column#28, funcs:sum(Column#29)->Column#7", + " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#28, collate: binary]", + " └─HashAgg_50 8000.00 mpp[tiflash] group by:Column#35, funcs:count(Column#34)->Column#29", + " └─Projection_58 8000.00 mpp[tiflash] test.t.c, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#35", + " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.b, test.t.d", + " └─HashAgg_38 8000.00 mpp[tiflash] group by:Column#20, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#22)->test.t.b, funcs:firstrow(Column#23)->test.t.d", + " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─HashAgg_36 8000.00 mpp[tiflash] group by:Column#32, Column#33, funcs:firstrow(Column#30)->Column#22, funcs:firstrow(Column#31)->Column#23", + " └─Projection_57 10000.00 mpp[tiflash] test.t.b, test.t.d, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#32, test.t.c", + " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select count(distinct c) from t group by b+d, a+b;", + "Plan": [ + "TableReader_56 8000.00 root data:ExchangeSender_55", + "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_51 8000.00 mpp[tiflash] Column#7", + " └─HashAgg_52 8000.00 mpp[tiflash] group by:Column#42, Column#43, funcs:sum(Column#44)->Column#7", + " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#42, collate: binary], [name: Column#43, collate: binary]", + " └─HashAgg_50 8000.00 mpp[tiflash] group by:Column#53, Column#54, funcs:count(Column#52)->Column#44", + " └─Projection_58 8000.00 mpp[tiflash] test.t.c, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#53, plus(test.t.a, test.t.b)->Column#54", + " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.b, test.t.d, test.t.a, test.t.b", + " └─HashAgg_38 8000.00 mpp[tiflash] group by:Column#29, Column#30, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#32)->test.t.b, funcs:firstrow(Column#33)->test.t.d, funcs:firstrow(Column#34)->test.t.a, funcs:firstrow(Column#35)->test.t.b", + " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─HashAgg_36 8000.00 mpp[tiflash] group by:Column#49, Column#50, Column#51, funcs:firstrow(Column#45)->Column#32, funcs:firstrow(Column#46)->Column#33, funcs:firstrow(Column#47)->Column#34, funcs:firstrow(Column#48)->Column#35", + " └─Projection_57 10000.00 mpp[tiflash] test.t.b, test.t.d, test.t.a, test.t.b, plus(test.t.b, cast(test.t.d, bigint(10) BINARY))->Column#49, plus(test.t.a, test.t.b)->Column#50, test.t.c", + " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select count(distinct c), count(*) from t group by date_format(d,'%Y');", + "Plan": [ + "TableReader_57 8000.00 root data:ExchangeSender_56", + "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_8 8000.00 mpp[tiflash] Column#7, cast(Column#10, bigint(21) BINARY)->Column#8", + " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#10", + " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#33, funcs:sum(Column#34)->Column#7, funcs:sum(Column#35)->Column#10", + " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#33, collate: utf8mb4_bin]", + " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#41, funcs:count(Column#39)->Column#34, funcs:sum(Column#40)->Column#35", + " └─Projection_59 8000.00 mpp[tiflash] test.t.c, cast(Column#9, decimal(20,0) BINARY)->Column#40, date_format(test.t.d, %Y)->Column#41", + " └─Projection_38 8000.00 mpp[tiflash] test.t.c, Column#9, test.t.d", + " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#23, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:sum(Column#25)->Column#9, funcs:firstrow(Column#26)->test.t.d", + " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#37, Column#38, funcs:count(1)->Column#25, funcs:firstrow(Column#36)->Column#26", + " └─Projection_58 10000.00 mpp[tiflash] test.t.d, date_format(test.t.d, %Y)->Column#37, test.t.c", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) from t group by date_format(d,'%Y');", + "Plan": [ + "TableReader_57 8000.00 root data:ExchangeSender_56", + "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_8 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#10, Column#7, cast(Column#14, bigint(21) BINARY)->Column#8, Column#9", + " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#14, Column#9, test.t.d", + " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#45, funcs:sum(Column#46)->Column#7, funcs:sum(Column#47)->Column#14, funcs:sum(Column#48)->Column#9, funcs:firstrow(Column#49)->test.t.d", + " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#45, collate: utf8mb4_bin]", + " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#59, funcs:sum(Column#55)->Column#46, funcs:sum(Column#56)->Column#47, funcs:count(Column#57)->Column#48, funcs:firstrow(Column#58)->Column#49", + " └─Projection_59 8000.00 mpp[tiflash] Column#12, cast(Column#13, decimal(20,0) BINARY)->Column#56, test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#59", + " └─Projection_38 8000.00 mpp[tiflash] Column#12, Column#13, test.t.c, test.t.d", + " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#30, test.t.c, funcs:sum(Column#31)->Column#12, funcs:sum(Column#32)->Column#13, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#34)->test.t.d", + " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#53, Column#54, funcs:sum(Column#50)->Column#31, funcs:count(Column#51)->Column#32, funcs:firstrow(Column#52)->Column#34", + " └─Projection_58 10000.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#50, test.t.b, test.t.d, date_format(test.t.d, %Y)->Column#53, test.t.c", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select d, count(distinct c), sum(a), max(b), count(*) from t group by d;", + "Plan": [ + "TableReader_57 8000.00 root data:ExchangeSender_56", + "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_8 8000.00 mpp[tiflash] test.t.d, Column#7, Column#8, Column#9, cast(Column#14, bigint(21) BINARY)->Column#10", + " └─Projection_52 8000.00 mpp[tiflash] Column#7, Column#8, Column#9, Column#14, test.t.d", + " └─HashAgg_53 8000.00 mpp[tiflash] group by:test.t.d, funcs:sum(Column#45)->Column#7, funcs:sum(Column#46)->Column#8, funcs:max(Column#47)->Column#9, funcs:sum(Column#48)->Column#14, funcs:firstrow(test.t.d)->test.t.d", + " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary]", + " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#58, funcs:count(Column#54)->Column#45, funcs:sum(Column#55)->Column#46, funcs:max(Column#56)->Column#47, funcs:sum(Column#57)->Column#48", + " └─Projection_59 8000.00 mpp[tiflash] test.t.c, Column#11, Column#12, cast(Column#13, decimal(20,0) BINARY)->Column#57, test.t.d", + " └─Projection_38 8000.00 mpp[tiflash] test.t.c, Column#11, Column#12, Column#13, test.t.d", + " └─HashAgg_39 8000.00 mpp[tiflash] group by:test.t.c, test.t.d, funcs:firstrow(test.t.c)->test.t.c, funcs:sum(Column#31)->Column#11, funcs:max(Column#32)->Column#12, funcs:sum(Column#33)->Column#13, funcs:firstrow(test.t.d)->test.t.d", + " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.d, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#52, Column#53, funcs:sum(Column#50)->Column#31, funcs:max(Column#51)->Column#32, funcs:count(1)->Column#33", + " └─Projection_58 10000.00 mpp[tiflash] cast(test.t.a, decimal(10,0) BINARY)->Column#50, test.t.b, test.t.d, test.t.c", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select date_format(d,'%Y') as df, count(distinct c) from t group by date_format(d,'%Y');", + "Plan": [ + "TableReader_56 8000.00 root data:ExchangeSender_55", + "└─ExchangeSender_55 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_7 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#8, Column#7", + " └─Projection_51 8000.00 mpp[tiflash] Column#7, test.t.d", + " └─HashAgg_52 8000.00 mpp[tiflash] group by:Column#28, funcs:sum(Column#29)->Column#7, funcs:firstrow(Column#30)->test.t.d", + " └─ExchangeReceiver_54 8000.00 mpp[tiflash] ", + " └─ExchangeSender_53 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#28, collate: utf8mb4_bin]", + " └─HashAgg_50 8000.00 mpp[tiflash] group by:Column#36, funcs:count(Column#34)->Column#29, funcs:firstrow(Column#35)->Column#30", + " └─Projection_58 8000.00 mpp[tiflash] test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#36", + " └─Projection_37 8000.00 mpp[tiflash] test.t.c, test.t.d", + " └─HashAgg_38 8000.00 mpp[tiflash] group by:Column#19, test.t.c, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(Column#21)->test.t.d", + " └─ExchangeReceiver_40 8000.00 mpp[tiflash] ", + " └─ExchangeSender_39 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.c, collate: binary]", + " └─HashAgg_36 8000.00 mpp[tiflash] group by:Column#32, Column#33, funcs:firstrow(Column#31)->Column#21", + " └─Projection_57 10000.00 mpp[tiflash] test.t.d, date_format(test.t.d, %Y)->Column#32, test.t.c", + " └─TableFullScan_26 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select date_format(d,'%Y') as df, a, count(b), count(distinct c) from t group by date_format(d,'%Y'), a;", + "Plan": [ + "TableReader_57 8000.00 root data:ExchangeSender_56", + "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_8 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#9, test.t.a, cast(Column#12, bigint(21) BINARY)->Column#7, Column#8", + " └─Projection_52 8000.00 mpp[tiflash] Column#12, Column#8, test.t.a, test.t.d", + " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#43, test.t.a, funcs:sum(Column#44)->Column#12, funcs:sum(Column#45)->Column#8, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#47)->test.t.d", + " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#56, Column#57, funcs:sum(Column#53)->Column#44, funcs:count(Column#54)->Column#45, funcs:firstrow(Column#55)->Column#47", + " └─Projection_59 8000.00 mpp[tiflash] cast(Column#11, decimal(20,0) BINARY)->Column#53, test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#56, test.t.a", + " └─Projection_38 8000.00 mpp[tiflash] Column#11, test.t.c, test.t.a, test.t.d", + " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#28, test.t.a, test.t.c, funcs:sum(Column#29)->Column#11, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#32)->test.t.d", + " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#50, Column#51, Column#52, funcs:count(Column#48)->Column#29, funcs:firstrow(Column#49)->Column#32", + " └─Projection_58 10000.00 mpp[tiflash] test.t.b, test.t.d, date_format(test.t.d, %Y)->Column#50, test.t.a, test.t.c", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select date_format(d,'%Y') as df, a, count(b), avg(distinct c) from t group by date_format(d,'%Y'), a;", + "Plan": [ + "TableReader_57 8000.00 root data:ExchangeSender_56", + "└─ExchangeSender_56 8000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_8 8000.00 mpp[tiflash] date_format(test.t.d, %Y)->Column#9, test.t.a, cast(Column#12, bigint(21) BINARY)->Column#7, Column#8", + " └─Projection_52 8000.00 mpp[tiflash] Column#12, div(Column#8, cast(case(eq(Column#46, 0), 1, Column#46), decimal(20,0) BINARY))->Column#8, test.t.a, test.t.d", + " └─HashAgg_53 8000.00 mpp[tiflash] group by:Column#47, test.t.a, funcs:sum(Column#48)->Column#12, funcs:sum(Column#49)->Column#46, funcs:sum(Column#50)->Column#8, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#52)->test.t.d", + " └─ExchangeReceiver_55 8000.00 mpp[tiflash] ", + " └─ExchangeSender_54 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " └─HashAgg_51 8000.00 mpp[tiflash] group by:Column#62, Column#63, funcs:sum(Column#58)->Column#48, funcs:count(Column#59)->Column#49, funcs:sum(Column#60)->Column#50, funcs:firstrow(Column#61)->Column#52", + " └─Projection_59 8000.00 mpp[tiflash] cast(Column#11, decimal(20,0) BINARY)->Column#58, test.t.c, cast(test.t.c, decimal(24,4) BINARY)->Column#60, test.t.d, date_format(test.t.d, %Y)->Column#62, test.t.a", + " └─Projection_38 8000.00 mpp[tiflash] Column#11, test.t.c, test.t.a, test.t.d", + " └─HashAgg_39 8000.00 mpp[tiflash] group by:Column#28, test.t.a, test.t.c, funcs:sum(Column#29)->Column#11, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(Column#32)->test.t.d", + " └─ExchangeReceiver_41 8000.00 mpp[tiflash] ", + " └─ExchangeSender_40 8000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary], [name: test.t.c, collate: binary]", + " └─HashAgg_37 8000.00 mpp[tiflash] group by:Column#55, Column#56, Column#57, funcs:count(Column#53)->Column#29, funcs:firstrow(Column#54)->Column#32", + " └─Projection_58 10000.00 mpp[tiflash] test.t.b, test.t.d, date_format(test.t.d, %Y)->Column#55, test.t.a, test.t.c", + " └─TableFullScan_27 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + }, + { + "SQL": "EXPLAIN select d,e, min(b), count(distinct c), bit_or(a) from t group by e,d; -- bit agg func can't be pushed to TiFlash", + "Plan": [ + "Projection_4 8000.00 root test.t.d, test.t.e, Column#7, Column#8, Column#9", + "└─HashAgg_6 8000.00 root group by:test.t.d, test.t.e, funcs:min(test.t.b)->Column#7, funcs:count(distinct test.t.c)->Column#8, funcs:bit_or(test.t.a)->Column#9, funcs:firstrow(test.t.d)->test.t.d, funcs:firstrow(test.t.e)->test.t.e", + " └─TableReader_10 10000.00 root data:TableFullScan_9", + " └─TableFullScan_9 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "Aggregation can not be pushed to tiflash because AggFunc `bit_or` is not supported now", + "Aggregation can not be pushed to tiflash because AggFunc `bit_or` is not supported now" + ] + }, + { + "SQL": "EXPLAIN select a, count(b), avg(distinct c), count(distinct c) from t group by a; -- multi distinct funcs, bail out", + "Plan": [ + "Projection_4 8000.00 root test.t.a, Column#7, Column#8, Column#9", + "└─HashAgg_6 8000.00 root group by:Column#14, funcs:count(Column#10)->Column#7, funcs:avg(distinct Column#11)->Column#8, funcs:count(distinct Column#12)->Column#9, funcs:firstrow(Column#13)->test.t.a", + " └─Projection_11 10000.00 root test.t.b, cast(test.t.c, decimal(24,4) BINARY)->Column#11, test.t.c, test.t.a, test.t.a", + " └─TableReader_10 10000.00 root data:TableFullScan_9", + " └─TableFullScan_9 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "Aggregation can not be pushed to storage layer in mpp mode because it contains agg function with distinct", + "Aggregation can not be pushed to storage layer in mpp mode because it contains agg function with distinct" + ] + }, + { + "SQL": "EXPLAIN select count(b), count(distinct c) from t; -- single distinct func but no group key, bail out", + "Plan": [ + "TableReader_30 1.00 root data:ExchangeSender_29", + "└─ExchangeSender_29 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_25 1.00 mpp[tiflash] Column#7, Column#8", + " └─HashAgg_26 1.00 mpp[tiflash] funcs:sum(Column#10)->Column#7, funcs:count(distinct test.t.c)->Column#8", + " └─ExchangeReceiver_28 1.00 mpp[tiflash] ", + " └─ExchangeSender_27 1.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashAgg_24 1.00 mpp[tiflash] group by:test.t.c, funcs:count(test.t.b)->Column#10", + " └─TableFullScan_13 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": null + } + ] } ] diff --git a/planner/core/testdata/flat_plan_suite_in.json b/planner/core/testdata/flat_plan_suite_in.json new file mode 100644 index 0000000000000..72a4bb6fac429 --- /dev/null +++ b/planner/core/testdata/flat_plan_suite_in.json @@ -0,0 +1,13 @@ +[ + { + "name": "TestFlatPhysicalPlan", + "cases": [ + "select * from t", + "select sum(t.a) from t join t2", + "select a from t use index (f) where f > 100", + "select a from t use index () where f > 100", + "with cte1 as (select a, b from t), cte2 as (select a, b from t2) select * from cte1 join cte2 on cte1.a = cte2.a", + "WITH RECURSIVE cte (n) AS( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;" + ] + } +] diff --git a/planner/core/testdata/flat_plan_suite_out.json b/planner/core/testdata/flat_plan_suite_out.json new file mode 100644 index 0000000000000..dd3827fa16924 --- /dev/null +++ b/planner/core/testdata/flat_plan_suite_out.json @@ -0,0 +1,411 @@ +[ + { + "Name": "TestFlatPhysicalPlan", + "Cases": [ + { + "SQL": "select * from t", + "Main": [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + } + ], + "CTEs": null + }, + { + "SQL": "select sum(t.a) from t join t2", + "Main": [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + }, + { + "Depth": 3, + "Label": 2, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": false + }, + { + "Depth": 4, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ │ ", + "IsLastChild": true + }, + { + "Depth": 3, + "Label": 1, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + }, + { + "Depth": 4, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ], + "CTEs": null + }, + { + "SQL": "select a from t use index (f) where f > 100", + "Main": [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ], + "CTEs": null + }, + { + "SQL": "select a from t use index () where f > 100", + "Main": [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + }, + { + "Depth": 3, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ], + "CTEs": null + }, + { + "SQL": "with cte1 as (select a, b from t), cte2 as (select a, b from t2) select * from cte1 join cte2 on cte1.a = cte2.a", + "Main": [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 2, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": false + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ │ ", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 1, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ], + "CTEs": [ + [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 3, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + }, + { + "Depth": 3, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ], + [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 3, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + }, + { + "Depth": 3, + "Label": 0, + "IsRoot": false, + "StoreType": 0, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ] + ] + }, + { + "SQL": "WITH RECURSIVE cte (n) AS( SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 5)SELECT * FROM cte;", + "Main": [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + } + ], + "CTEs": [ + [ + { + "Depth": 0, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 3, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": false + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ │ ", + "IsLastChild": true + }, + { + "Depth": 1, + "Label": 4, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": "│ ", + "IsLastChild": true + }, + { + "Depth": 2, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + }, + { + "Depth": 3, + "Label": 0, + "IsRoot": true, + "StoreType": 2, + "ReqType": 0, + "IsPhysicalPlan": true, + "TextTreeIndent": " │ ", + "IsLastChild": true + } + ] + ] + } + ] + } +] diff --git a/planner/core/testdata/integration_suite_in.json b/planner/core/testdata/integration_suite_in.json index dc2b7b07239e1..ac9347d4acba9 100644 --- a/planner/core/testdata/integration_suite_in.json +++ b/planner/core/testdata/integration_suite_in.json @@ -285,7 +285,9 @@ "cases": [ // Query with WHERE or ON should have the same plan, i.e, the Apply has been decorrelated. "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 where t1.a = t2.a and t1.a = t.a)", - "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 on t1.a = t2.a and t1.a = t.a)" + "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 on t1.a = t2.a and t1.a = t.a)", + "explain format = 'brief' select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 join t t2 where t1.a = t2.a and t1.a = t.a)", + "explain format = 'brief' select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 join t t2 on t1.a = t2.a and t1.a = t.a)" ] }, { @@ -494,6 +496,13 @@ "explain format = 'brief' select min(a) from t" ] }, + { + "name": "TestPushDownToTiFlashWithKeepOrderInFastMode", + "cases": [ + "explain format = 'brief' select max(a) from t", + "explain format = 'brief' select min(a) from t" + ] + }, { "name": "TestMPPJoin", "cases": [ @@ -509,6 +518,8 @@ "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "explain format = 'brief' select count(*) from fact_t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select count(*) from fact_t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k > d1_t.d1_k", @@ -765,6 +776,13 @@ "desc format = 'brief' SELECT FROM_UNIXTIME(name,'%Y-%m-%d') FROM t;" ] }, + { + "name": "TestPushDownSelectionForMPP", + "cases": [ + "desc format = 'brief' select /*+ hash_agg()*/ count(*) c, id from t group by id having id >c", + "desc format = 'brief' select * from t where id < 2" + ] + }, { "name": "TestMppUnionAll", "cases": [ diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index aeff80fd103ea..169e84f602275 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -1535,6 +1535,34 @@ "└─TableReader(Probe) 10000.00 root data:TableFullScan", " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] + }, + { + "SQL": "explain format = 'brief' select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 join t t2 where t1.a = t2.a and t1.a = t.a)", + "Plan": [ + "HashJoin 10000.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─HashAgg(Build) 8000.00 root group by:test.t.a, funcs:firstrow(test.t.a)->test.t.a", + "│ └─HashJoin 12500.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "│ ├─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", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 join t t2 on t1.a = t2.a and t1.a = t.a)", + "Plan": [ + "HashJoin 10000.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─HashAgg(Build) 8000.00 root group by:test.t.a, funcs:firstrow(test.t.a)->test.t.a", + "│ └─HashJoin 12500.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "│ ├─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", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] } ] }, @@ -1782,7 +1810,7 @@ "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 8.60 root eq(test.t2.b, 2), in(test.t2.c, 1, 2, 3, 4, 5)", - "└─Point_Get_5 1.00 0.00 root table:t2, index:idx_a(a) " + "└─Point_Get_5 1.00 5.60 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" @@ -1839,7 +1867,7 @@ "Plan": [ "Delete_4 N/A N/A root N/A", "└─Selection_7 2.00 9.80 root in(test.t1.g, 3, 4)", - " └─Point_Get_6 1.00 0.00 root table:t1, index:f(f) " + " └─Point_Get_6 1.00 6.80 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" @@ -1875,9 +1903,9 @@ "SQL": "select * from t where a > 1 order by f", "Plan": [ "IndexLookUp_14 3333.33 136747.00 root ", - "├─Selection_13(Build) 3333.33 0.00 cop[tikv] gt(test.t.a, 1)", + "├─Selection_13(Build) 3333.33 585000.00 cop[tikv] gt(test.t.a, 1)", "│ └─IndexFullScan_11 10000.00 555000.00 cop[tikv] table:t, index:f(f) keep order:true, stats:pseudo", - "└─TableRowIDScan_12(Probe) 3333.33 555000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "└─TableRowIDScan_12(Probe) 3333.33 370000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ "Note 1105 [t,f,f_g] remain after pruning paths for t given Prop{SortItems: [{test.t.f asc}], TaskTp: rootTask}" @@ -1888,7 +1916,7 @@ "Plan": [ "IndexLookUp_10 3333.33 86674.83 root ", "├─IndexRangeScan_8(Build) 3333.33 185000.00 cop[tikv] table:t, index:f(f) range:(1,+inf], keep order:false, stats:pseudo", - "└─TableRowIDScan_9(Probe) 3333.33 185000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "└─TableRowIDScan_9(Probe) 3333.33 370000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ "Note 1105 [t,f,f_g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}" @@ -1909,8 +1937,8 @@ "Plan": [ "IndexLookUp_15 3.33 206.74 root ", "├─IndexRangeScan_12(Build) 10.00 570.00 cop[tikv] table:t, index:g(g) range:[5,5], keep order:false, stats:pseudo", - "└─Selection_14(Probe) 3.33 0.00 cop[tikv] gt(test.t.f, 3)", - " └─TableRowIDScan_13 10.00 570.00 cop[tikv] table:t keep order:false, stats:pseudo" + "└─Selection_14(Probe) 3.33 1140.00 cop[tikv] gt(test.t.f, 3)", + " └─TableRowIDScan_13 10.00 1110.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ "Note 1105 [t,f_g,g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}" @@ -1922,7 +1950,7 @@ "Sort_5 10.00 353.68 root test.t.f", "└─IndexLookUp_13 10.00 230.01 root ", " ├─IndexRangeScan_11(Build) 10.00 570.00 cop[tikv] table:t, index:g(g) range:[5,5], keep order:false, stats:pseudo", - " └─TableRowIDScan_12(Probe) 10.00 570.00 cop[tikv] table:t keep order:false, stats:pseudo" + " └─TableRowIDScan_12(Probe) 10.00 1110.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ "Note 1105 [t,g] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}" @@ -1932,9 +1960,9 @@ "SQL": "select * from t where d = 3 order by c, e", "Plan": [ "IndexLookUp_15 10.00 57222.78 root ", - "├─Selection_14(Build) 10.00 0.00 cop[tikv] eq(test.t.d, 3)", + "├─Selection_14(Build) 10.00 855000.00 cop[tikv] eq(test.t.d, 3)", "│ └─IndexFullScan_12 10000.00 825000.00 cop[tikv] table:t, index:c_d_e(c, d, e) keep order:true, stats:pseudo", - "└─TableRowIDScan_13(Probe) 10.00 825000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "└─TableRowIDScan_13(Probe) 10.00 1110.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warnings": [ "Note 1105 [t,c_d_e] remain after pruning paths for t given Prop{SortItems: [{test.t.c asc} {test.t.e asc}], TaskTp: rootTask}" @@ -1991,7 +2019,7 @@ "Plan": [ "IndexLookUp_7 3.00 57.91 root ", "├─IndexRangeScan_5(Build) 3.00 171.00 cop[tikv] table:t, index:idx_b(b) range:(5,+inf], keep order:false", - "└─TableRowIDScan_6(Probe) 3.00 171.00 cop[tikv] table:t keep order:false" + "└─TableRowIDScan_6(Probe) 3.00 108.00 cop[tikv] table:t keep order:false" ], "Warnings": [ "Note 1105 [idx_b] remain after pruning paths for t given Prop{SortItems: [], TaskTp: rootTask}" @@ -2432,7 +2460,7 @@ "Plan": [ "TopN_7 1.00 13.22 root test.t3.a, offset:0, count:1", "└─TableReader_16 1.00 10.22 root data:TopN_15", - " └─TopN_15 1.00 0.00 cop[tikv] test.t3.a, offset:0, count:1", + " └─TopN_15 1.00 117.00 cop[tikv] test.t3.a, offset:0, count:1", " └─TableFullScan_14 3.00 108.00 cop[tikv] table:t3 keep order:false" ] }, @@ -2441,7 +2469,7 @@ "Plan": [ "TopN_7 1.00 13.22 root test.t3.b, offset:0, count:1", "└─TableReader_16 1.00 10.22 root data:TopN_15", - " └─TopN_15 1.00 0.00 cop[tikv] test.t3.b, offset:0, count:1", + " └─TopN_15 1.00 117.00 cop[tikv] test.t3.b, offset:0, count:1", " └─TableFullScan_14 3.00 108.00 cop[tikv] table:t3 keep order:false" ] }, @@ -2453,7 +2481,7 @@ " └─Projection_22 3.00 76.80 mpp[tiflash] Column#4", " └─HashAgg_8 3.00 57.00 mpp[tiflash] group by:test.t2.a, funcs:count(1)->Column#4", " └─ExchangeReceiver_21 3.00 48.00 mpp[tiflash] ", - " └─ExchangeSender_20 3.00 48.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.a, collate: binary]", + " └─ExchangeSender_20 3.00 45.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.a, collate: binary]", " └─TableFullScan_19 3.00 45.00 mpp[tiflash] table:t2 keep order:false" ] }, @@ -2503,7 +2531,7 @@ " └─ExchangeSender_45 3.00 195.38 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_42 3.00 195.38 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", " ├─ExchangeReceiver_21(Build) 3.00 57.00 mpp[tiflash] ", - " │ └─ExchangeSender_20 3.00 57.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─ExchangeSender_20 3.00 54.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Selection_19 3.00 54.00 mpp[tiflash] not(isnull(test.t1.a))", " │ └─TableFullScan_18 3.00 45.00 mpp[tiflash] table:t1 keep order:false", " └─Selection_23(Probe) 3.00 54.00 mpp[tiflash] not(isnull(test.t2.a))", @@ -2521,7 +2549,7 @@ " └─ExchangeSender_38 3.00 204.38 mpp[tiflash] ExchangeType: PassThrough", " └─HashJoin_29 3.00 204.38 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", " ├─ExchangeReceiver_35(Build) 3.00 66.00 mpp[tiflash] ", - " │ └─ExchangeSender_34 3.00 66.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─ExchangeSender_34 3.00 63.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Selection_33 3.00 63.00 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", " │ └─TableFullScan_32 3.00 54.00 mpp[tiflash] table:t1 keep order:false", " └─Selection_37(Probe) 3.00 54.00 mpp[tiflash] not(isnull(test.t2.a))", @@ -2533,10 +2561,10 @@ "Plan": [ "HashJoin_19 3.00 127.40 root CARTESIAN left outer semi join", "├─Selection_39(Build) 0.80 11.18 root eq(2, Column#18)", - "│ └─StreamAgg_60 1.00 8.18 root funcs:count(Column#32)->Column#18", - "│ └─TableReader_61 1.00 5.17 root data:StreamAgg_44", - "│ └─StreamAgg_44 1.00 49.50 batchCop[tiflash] funcs:count(1)->Column#32", - "│ └─TableFullScan_59 3.00 40.50 batchCop[tiflash] table:t1 keep order:false", + "│ └─StreamAgg_61 1.00 8.18 root funcs:count(Column#32)->Column#18", + "│ └─TableReader_62 1.00 5.17 root data:StreamAgg_45", + "│ └─StreamAgg_45 1.00 49.50 batchCop[tiflash] funcs:count(1)->Column#32", + "│ └─TableFullScan_60 3.00 40.50 batchCop[tiflash] table:t1 keep order:false", "└─Projection_20(Probe) 3.00 95.82 root 1->Column#28", " └─Apply_22 3.00 76.02 root CARTESIAN left outer join", " ├─TableReader_24(Build) 3.00 10.16 root data:TableFullScan_23", @@ -2832,6 +2860,31 @@ } ] }, + { + "Name": "TestPushDownToTiFlashWithKeepOrderInFastMode", + "Cases": [ + { + "SQL": "explain format = 'brief' select max(a) from t", + "Plan": [ + "StreamAgg 1.00 root funcs:max(test.t.a)->Column#3", + "└─TopN 1.00 root test.t.a:desc, offset:0, count:1", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 batchCop[tiflash] test.t.a:desc, offset:0, count:1", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select min(a) from t", + "Plan": [ + "StreamAgg 1.00 root funcs:min(test.t.a)->Column#3", + "└─TopN 1.00 root test.t.a, offset:0, count:1", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 batchCop[tiflash] test.t.a, offset:0, count:1", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + } + ] + }, { "Name": "TestMPPJoin", "Cases": [ @@ -3019,6 +3072,40 @@ " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" ] }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from d1_t where d1_k = fact_t.d1_k)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 mpp[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Projection 2.00 mpp[tiflash] test.d1_t.d1_k", + " │ └─HashAgg 2.00 mpp[tiflash] group by:test.d1_t.d1_k, funcs:firstrow(test.d1_t.d1_k)->test.d1_t.d1_k", + " │ └─ExchangeReceiver 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.d1_t.d1_k, collate: binary]", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root data:ExchangeSender", + " └─ExchangeSender 6.40 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 mpp[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 2.00 mpp[tiflash] ", + " │ └─ExchangeSender 2.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 mpp[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 mpp[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 mpp[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 mpp[tiflash] table:fact_t keep order:false" + ] + }, { "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ @@ -5134,6 +5221,33 @@ } ] }, + { + "Name": "TestPushDownSelectionForMPP", + "Cases": [ + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) c, id from t group by id having id >c", + "Plan": [ + "TableReader 6400.00 root data:ExchangeSender", + "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 6400.00 mpp[tiflash] gt(test.t.id, Column#5)", + " └─Projection 8000.00 mpp[tiflash] Column#5, test.t.id", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(1)->Column#5, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 10000.00 mpp[tiflash] ", + " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t where id < 2", + "Plan": [ + "TableReader 3323.33 root data:ExchangeSender", + "└─ExchangeSender 3323.33 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 3323.33 mpp[tiflash] lt(test.t.id, 2)", + " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" + ] + } + ] + }, { "Name": "TestMppUnionAll", "Cases": [ @@ -5518,11 +5632,11 @@ "SQL": "desc format = 'brief' select id from t group by id having avg(value)>0", "Plan": [ "Projection 6400.00 root test.t.id", - "└─Selection 6400.00 root gt(Column#4, 0)", - " └─TableReader 8000.00 root data:ExchangeSender", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#9, 0), 1, Column#9), decimal(20,0) BINARY))->Column#4, test.t.id", - " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#9, funcs:sum(test.t.value)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + "└─TableReader 6400.00 root data:ExchangeSender", + " └─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 6400.00 mpp[tiflash] gt(Column#4, 0)", + " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#17, 0), 1, Column#17), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#17, funcs:sum(test.t.value)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -5531,11 +5645,11 @@ { "SQL": "desc format = 'brief' select avg(value),id from t group by id having avg(value)>0", "Plan": [ - "Selection 6400.00 root gt(Column#4, 0)", - "└─TableReader 8000.00 root data:ExchangeSender", - " └─ExchangeSender 8000.00 mpp[tiflash] ExchangeType: PassThrough", - " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#10, 0), 1, Column#10), decimal(20,0) BINARY))->Column#4, test.t.id", - " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#10, funcs:sum(test.t.value)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + "TableReader 6400.00 root data:ExchangeSender", + "└─ExchangeSender 6400.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Selection 6400.00 mpp[tiflash] gt(Column#4, 0)", + " └─Projection 8000.00 mpp[tiflash] div(Column#4, cast(case(eq(Column#18, 0), 1, Column#18), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 mpp[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#18, funcs:sum(test.t.value)->Column#4, funcs:firstrow(test.t.id)->test.t.id", " └─ExchangeReceiver 10000.00 mpp[tiflash] ", " └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", " └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo" @@ -5952,7 +6066,7 @@ " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", - " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.id))", + " └─Selection(Probe) 0.80 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 0.80 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] }, @@ -5968,7 +6082,7 @@ " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", - " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.id))", + " └─Selection(Probe) 0.80 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 0.80 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] }, @@ -5985,7 +6099,7 @@ " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t.id))", " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", - " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.id))", + " └─Selection(Probe) 16.00 mpp[tiflash] not(isnull(test.t.id))", " └─TableFullScan 16.02 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ] } diff --git a/planner/core/testdata/join_reorder_suite_in.json b/planner/core/testdata/join_reorder_suite_in.json index 3145779cc69bf..72543de875aaf 100644 --- a/planner/core/testdata/join_reorder_suite_in.json +++ b/planner/core/testdata/join_reorder_suite_in.json @@ -121,7 +121,40 @@ "select /*+ straight_join() */ * from t, t1, t2 where t.a = t1.a and t1.b=t2.b;", "select /*+ straight_join() */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;", "select /*+ leading(t1) */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;", - "select /*+ leading(t1, t3) */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;" + "select /*+ leading(t1, t3) */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;", + + // outer join + // left join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", // should support this case later + "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + + // right join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;" ] }, { @@ -130,7 +163,40 @@ "select /*+ straight_join() */ * from t, t1, t2 where t.a = t1.a and t1.b=t2.b;", "select /*+ straight_join() */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;", "select /*+ leading(t1) */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;", - "select /*+ leading(t1, t3) */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;" + "select /*+ leading(t1, t3) */ * from t, t1, t2, t3 where t.a = t1.a and t1.b=t2.b and t2.b=t3.b;", + + // outer join + // left join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", // should support this case ;ater + "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + + // right join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;" ] }, { @@ -186,7 +252,40 @@ "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", - "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b" + "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + + // outer join + // left join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", // should support this case ;ater + "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + + // right join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;" ] }, { @@ -302,62 +401,117 @@ { "name": "TestLeadingJoinHint4OuterJoin", "cases": [ - "select /*+ leading(t3, t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t3, t1) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t1, t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t3) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t1) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t3, t2, t1) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t1, t2, t3) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t3, t1, t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "select /*+ leading(t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t2, t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t2, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t3, t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t1, t3, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t2, t3, t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "select /*+ leading(t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t1, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t3, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t1, t2, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t3, t1, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", - "select /*+ leading(t1) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t4) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t1, t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t1, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t4, t1) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t4, t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t3, t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t3, t4) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t1, t2, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t1, t4, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t4, t2, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t1, t2, t3, t4) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", - "select /*+ leading(t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t2) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t3) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t4) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t2, t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t2, t3) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t4, t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t3, t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select * from ((select /*+ leading(t5) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select * from ((select /*+ leading(t6) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select * from ((select /*+ leading(t5, t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select * from ((select /*+ leading(t6, t8, t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t3) */ * from ((select /*+ leading(t5) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t3, t1) */ * from ((select /*+ leading(t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t3, t1, t2) */ * from ((select /*+ leading(t6, t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "select /*+ leading(t3, t4) */ * from ((select /*+ leading(t5, t7, t8) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;" + // left join + // left join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", // should support this case ;ater + "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + + // right join + "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + + "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + + "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + + "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + + // test cases for using the join order hint and join algorithm hint + "select /*+ leading(t2) hash_join(t2) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) hash_join(t1) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) hash_join(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t) hash_join(t2) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t) hash_join(t1) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t) hash_join(t3) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) INL_JOIN(t1) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) INL_JOIN(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) INL_JOIN(t1) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) INL_JOIN(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) merge_join(t2) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t1) merge_join(t2) */ * from t join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) merge_join(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) merge_join(t3) */ * from t join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) merge_join(t2) */ * from t right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) merge_join(t2) */ * from t right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) merge_join(t3) */ * from t right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t3) merge_join(t3) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "select /*+ leading(t2) INL_JOIN(t1) */ * from t join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + + // leading hint + correlated subquery + "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where t1.a in (select t3.a from t3 where t1.b = t3.b)", + + "select /*+ leading(t4) */ * from t1 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 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3 where t1.b = t3.b)", + + "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where exists (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where exists (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where exists (select t3.a from t3 where t1.b = t3.b)", + + "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where not exists (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where not exists (select t3.a from t3 where t1.b = t3.b)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where not exists (select t3.a from t3 where t1.b = t3.b)", + + "select /*+ leading(t1) */ t1.a, (select min(t1.a) from t2 where t2.a > t1.a) from t1 join t3 on t1.a = t3.a;", + "select /*+ leading(t3@sel_2) */ t1.a, (select min(t1.a) from t2 where t2.a > t1.a) from t1 join t3 on t1.a = t3.a;", + "select /*+ leading(t2, t3@sel_2) */ t1.a, (select min(t1.a) from t2 where t2.a > t1.a) from t1 join t3 on t1.a = t3.a;", + + "select /*+ leading(t4, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "select /*+ leading(t4) */ * from t1 right join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2, t1) */ * from t1 left join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + + "select /*+ leading(t4, t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", + "select /*+ leading(t4) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", + "select /*+ leading(t3@sel_2, t2) */ * from t1 right join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", + + // leading hint + uncorrelated subquery + "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a in (select t3.a from t3)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", + + "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)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3)", + + "select /*+ leading(t4) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where exists (select t3.a from t3)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where exists (select t3.a from t3)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where exists (select t3.a from t3)", + + "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where not exists (select t3.a from t3)", + "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where not exists (select t3.a from t3)", + "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where not exists (select t3.a from t3)", + + "select /*+ leading(t4@sel_2, t1) */ * from t1 join (select * from t4) t2 on t1.a=t2.a join t3 on t2.b=t3.b;", + "select /*+ leading(t2, t4@sel_2) */ * from (select * from t4) t1 right join t2 on t1.a=t2.a join t3 on t2.b=t3.b;", + "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a right join (select * from t4) t3 on t2.b=t3.b;", + + "select /*+ leading(t1) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", + "select /*+ leading(t1, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", + "select /*+ leading(t1, t3) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", + "select /*+ leading(t2@sel_2, t1) */ t1.a, (select min(t2.a) from t2) from t1 left join t3 on t1.a = t3.a;", + "select /*+ leading(t3, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 right join t3 on t1.a = t3.a;" ] } ] diff --git a/planner/core/testdata/join_reorder_suite_out.json b/planner/core/testdata/join_reorder_suite_out.json index f82b504714a2d..59c64c79a7efc 100644 --- a/planner/core/testdata/join_reorder_suite_out.json +++ b/planner/core/testdata/join_reorder_suite_out.json @@ -2516,6 +2516,1591 @@ "Warning": [ "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] + }, + { + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 43857.47 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 43857.47 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 39960.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 37425.04 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 43857.47 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 43857.47 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 39960.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 37425.04 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 43857.47 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 43857.47 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 39960.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 37425.04 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 43857.47 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 43857.47 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 39960.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 37425.04 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 43857.47 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 43857.47 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 39960.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 37425.04 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "HashJoin 50000.00 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─HashJoin(Build) 39960.00 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "│ ├─PartitionUnion(Build) 29970.00 root ", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + "│ └─PartitionUnion(Probe) 39960.00 root ", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 50000.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "HashJoin 50000.00 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─HashJoin(Build) 39960.00 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "│ ├─PartitionUnion(Build) 29970.00 root ", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + "│ └─PartitionUnion(Probe) 39960.00 root ", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 50000.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "HashJoin 58476.62 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─Projection(Build) 46781.30 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "│ └─HashJoin 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + "│ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + "│ │ ├─PartitionUnion(Build) 29940.03 root ", + "│ │ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + "│ │ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + "│ │ └─PartitionUnion(Probe) 39920.04 root ", + "│ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + "│ └─PartitionUnion(Probe) 39960.00 root ", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 50000.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "HashJoin 58476.62 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─Projection(Build) 46781.30 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "│ └─HashJoin 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + "│ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + "│ │ ├─PartitionUnion(Build) 29940.03 root ", + "│ │ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + "│ │ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + "│ │ │ └─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + "│ │ └─PartitionUnion(Probe) 39920.04 root ", + "│ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9980.01 root data:Selection", + "│ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + "│ │ └─TableReader 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + "│ └─PartitionUnion(Probe) 39960.00 root ", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + "│ ├─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 50000.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 54821.83 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 54821.83 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─Projection(Build) 46781.30 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " │ └─HashJoin 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ │ └─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ │ └─PartitionUnion(Probe) 39920.04 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 46828.12 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─HashJoin(Build) 37462.50 root inner join, equal:[eq(test.t6.b, test.t5.b)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 49900.05 root ", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p4 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 54821.83 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 54821.83 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─Projection(Build) 46781.30 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " │ └─HashJoin 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ │ └─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ │ └─PartitionUnion(Probe) 39920.04 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 46828.12 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─HashJoin(Build) 37462.50 root inner join, equal:[eq(test.t6.b, test.t5.b)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 49900.05 root ", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p4 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 54821.83 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 54821.83 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─Projection(Build) 46781.30 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " │ └─HashJoin 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ │ └─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ │ └─PartitionUnion(Probe) 39920.04 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 46828.12 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─HashJoin(Build) 37462.50 root inner join, equal:[eq(test.t6.b, test.t5.b)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 49900.05 root ", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p4 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 46828.12 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 46828.12 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─Projection(Build) 37462.50 root test.t4.a, test.t4.b, test.t.a, test.t.b", + " │ └─HashJoin 37462.50 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 39960.00 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 37462.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 49950.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 39960.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 46828.12 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 46828.12 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─Projection(Build) 37462.50 root test.t4.a, test.t4.b, test.t.a, test.t.b", + " │ └─HashJoin 37462.50 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 39960.00 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 37462.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 49950.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 39960.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 46828.12 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 46828.12 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─Projection(Build) 37462.50 root test.t4.a, test.t4.b, test.t.a, test.t.b", + " │ └─HashJoin 37462.50 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 39960.00 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 37462.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " │ ├─PartitionUnion(Build) 29970.00 root ", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9990.00 root data:Selection", + " │ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 49950.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 39960.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "HashJoin 50000.00 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─HashJoin(Build) 40000.00 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "│ ├─PartitionUnion(Build) 29970.00 root ", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + "│ └─PartitionUnion(Probe) 40000.00 root ", + "│ ├─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + "│ ├─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + "│ └─TableReader 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "HashJoin 50000.00 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─HashJoin(Build) 40000.00 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "│ ├─PartitionUnion(Build) 29970.00 root ", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + "│ │ ├─TableReader 9990.00 root data:Selection", + "│ │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + "│ │ └─TableReader 9990.00 root data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + "│ └─PartitionUnion(Probe) 40000.00 root ", + "│ ├─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + "│ ├─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + "│ └─TableReader 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 49950.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "Projection 58476.62 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "└─HashJoin 58476.62 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─PartitionUnion(Build) 49950.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 39960.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "Projection 58476.62 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "└─HashJoin 58476.62 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─PartitionUnion(Build) 49950.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 39960.00 root ", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 54876.71 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 54876.71 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 73095.78 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─PartitionUnion(Build) 49900.05 root ", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ │ └─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ │ └─PartitionUnion(Probe) 39920.04 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49900.05 root ", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 54876.71 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 54876.71 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 73095.78 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─PartitionUnion(Build) 49900.05 root ", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ │ └─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ │ └─PartitionUnion(Probe) 39920.04 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49900.05 root ", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 54876.71 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 54876.71 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─PartitionUnion(Build) 29970.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p1 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6, partition:p2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 73095.78 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─PartitionUnion(Build) 49900.05 root ", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p2 keep order:false, stats:pseudo", + " │ ├─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p3 keep order:false, stats:pseudo", + " │ └─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5, partition:p4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 58476.62 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─HashJoin(Build) 46781.30 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─HashJoin(Build) 37425.04 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ │ ├─PartitionUnion(Build) 29940.03 root ", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p0 keep order:false, stats:pseudo", + " │ │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p1 keep order:false, stats:pseudo", + " │ │ │ └─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t3, partition:p2 keep order:false, stats:pseudo", + " │ │ └─PartitionUnion(Probe) 39920.04 root ", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo", + " │ │ ├─TableReader 9980.01 root data:Selection", + " │ │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p2 keep order:false, stats:pseudo", + " │ │ └─TableReader 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p3 keep order:false, stats:pseudo", + " │ └─PartitionUnion(Probe) 39960.00 root ", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p0 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p1 keep order:false, stats:pseudo", + " │ ├─TableReader 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p2 keep order:false, stats:pseudo", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4, partition:p3 keep order:false, stats:pseudo", + " └─PartitionUnion(Probe) 49900.05 root ", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p2 keep order:false, stats:pseudo", + " ├─TableReader 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p3 keep order:false, stats:pseudo", + " └─TableReader 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] } ] }, @@ -2603,339 +4188,604 @@ " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], "Warning": null - } - ] - }, - { - "Name": "TestJoinOrderHint4DifferentJoinType", - "Cases": [ + }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15593.77 root inner join, equal:[eq(test.t2.b, test.t3.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", - "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ straight_join() */ * from t1 straight_join t2 straight_join t3", + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "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 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t2.b, test.t.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all 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) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t3.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", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a cross join t3", + "SQL": "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 124875000.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) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t2.b, test.t.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.b, test.t3.b)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 10000.00 root partition:all data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t3.b))", - " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 10000.00 root partition:all data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9990.00 root partition:all 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) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t3.b)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t3.b))", - " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + "HashJoin 19492.21 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 10000.00 root partition:all data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root partition:all data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t3.b))", - " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + "HashJoin 19492.21 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 10000.00 root partition:all data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─Projection(Probe) 15593.77 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "Projection 124625374.88 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 124625374.88 root inner join, equal:[eq(test.t1.a, test.t2.a) eq(test.t3.b, test.t2.b)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 99800100.00 root CARTESIAN inner join", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 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" + "Projection 30426.12 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30426.12 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─Projection(Build) 15593.77 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2) */ * from t1 straight_join t2 straight_join t3", + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "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 30426.12 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30426.12 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " │ ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" ] }, { - "SQL": "select /*+ leading(t3) */ * from t1 straight_join t2 straight_join t3", + "SQL": "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "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 30426.12 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30426.12 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " │ ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t2, t3) */ * from t1 straight_join t2 straight_join t3", + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "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" + "HashJoin 24389.65 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t4.a, test.t.a)]", + "│ ├─TableReader(Build) 9990.00 root partition:all data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root partition:all data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15609.38 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "Projection 24389.65 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24389.65 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t4.a, test.t.a)]", + " │ ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15609.38 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all 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) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "HashJoin 24389.65 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t4.a, test.t.a)]", + "│ ├─TableReader(Build) 9990.00 root partition:all data:Selection", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root partition:all data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15609.38 root inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t2) */ * from t1 straight_join t2 straight_join t3", + "SQL": "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "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", + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 9990.00 root partition:all data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9990.00 root partition:all 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) 10000.00 root partition:all data:TableFullScan", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t3, t1) */ * from t1 straight_join t2 straight_join t3", + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "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", + "HashJoin 15593.77 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "├─TableReader(Build) 9990.00 root partition:all data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root partition:all data:TableFullScan", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "Projection 19492.21 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t3.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", - " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", + "Projection 19492.21 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "└─HashJoin 19492.21 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15609.38 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 30456.57 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30456.57 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 24365.26 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15609.38 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + "Projection 30456.57 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30456.57 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 24365.26 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root partition:all data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "Projection 243165526.37 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 243165526.37 root inner join, equal:[eq(test.t3.a, test.t1.a) eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " └─HashJoin(Probe) 194532421.09 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 155625936.88 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root partition:all data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 124500749.50 root CARTESIAN inner join", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root partition:all data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestJoinOrderHint4DifferentJoinType", + "Cases": [ + { + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "Plan": [ + "HashJoin 15593.77 root inner join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "SQL": "select /*+ straight_join() */ * from t1 straight_join t2 straight_join t3", "Plan": [ - "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 15609.38 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 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" ], "Warning": null }, { - "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", "Plan": [ "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t3.b)]", "├─TableReader(Build) 9990.00 root data:Selection", @@ -2949,35 +4799,49 @@ " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", "Plan": [ "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", "├─TableReader(Build) 10000.00 root data:TableFullScan", "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", - " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", - " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a cross join t3", "Plan": [ - "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", + "HashJoin 124875000.00 root CARTESIAN inner join", "├─TableReader(Build) 10000.00 root data:TableFullScan", "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", - " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "Plan": [ + "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.b, test.t3.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", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", " ├─TableReader(Build) 9980.01 root data:Selection", " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", @@ -2988,72 +4852,168 @@ "Warning": null }, { - "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", - " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9980.01 root data:Selection", " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", - " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9980.01 root data:Selection", " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ - "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", - " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15593.77 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9980.01 root data:Selection", " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", " │ └─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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", + "Plan": [ + "Projection 124625374.88 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 124625374.88 root inner join, equal:[eq(test.t1.a, test.t2.a) eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 99800100.00 root CARTESIAN inner join", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 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" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2) */ * from t1 straight_join t2 straight_join t3", + "Plan": [ + "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" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" ] }, { - "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "SQL": "select /*+ leading(t3) */ * from t1 straight_join t2 straight_join t3", "Plan": [ - "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 124875000.00 root CARTESIAN inner join", + "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:t3 keep order:false, stats:pseudo", + " │ └─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" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t1 straight_join t2 straight_join t3", + "Plan": [ + "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" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t3, t2) */ * from t1 straight_join t2 straight_join t3", + "Plan": [ + "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" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t3, t1) */ * from t1 straight_join t2 straight_join t3", + "Plan": [ + "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" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", + "Plan": [ + "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t3.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", " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.a, test.t1.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", @@ -3065,80 +5025,264 @@ "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", "Plan": [ - "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 124875000.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) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15609.38 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table has join conditions with other tables" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", "Plan": [ - "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 124875000.00 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15609.38 root inner join, equal:[eq(test.t2.a, test.t1.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 99900000.00 root CARTESIAN inner join", + " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", "Plan": [ - "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 124875000.00 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 15609.38 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 15609.38 root inner join, equal:[eq(test.t2.a, test.t1.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 99900000.00 root CARTESIAN inner join", + " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a left join t3 on t2.b=t3.b", "Plan": [ - "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", - "└─HashJoin 124875000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 99900000.00 root CARTESIAN inner join", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": null - } - ] - }, - { - "Name": "TestJoinOrderHint4TiFlash", - "Cases": [ + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "Plan": [ + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "Plan": [ + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "Plan": [ + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "Plan": [ + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a right join t3 on t2.b=t3.b", + "Plan": [ + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "Plan": [ + "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 124875000.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) 12487.50 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "Plan": [ + "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 124875000.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) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table has join conditions with other tables" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "Plan": [ + "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 124875000.00 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 99900000.00 root CARTESIAN inner join", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─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" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t2) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "Plan": [ + "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 124875000.00 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 99900000.00 root CARTESIAN inner join", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─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" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t1) */ * from t1 join t2 on t1.a=t2.a cross join t3", + "Plan": [ + "Projection 124875000.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 124875000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 99900000.00 root CARTESIAN inner join", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestJoinOrderHint4TiFlash", + "Cases": [ { "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a join t3 on t2.b=t3.b", "Plan": [ @@ -3263,59 +5407,742 @@ " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" ], "Warning": null - } - ] - }, - { - "Name": "TestJoinOrderHint4Subquery", - "Cases": [ + }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, test.t3.a)]", - "├─TableReader(Build) 3.00 root data:Selection", - "│ └─Selection 3.00 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", - "│ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", - "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "TableReader 24365.26 root data:ExchangeSender", + "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + " └─HashJoin 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3 where t1.b = t3.b)", + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 9990.00 root anti semi join, equal:[eq(test.t1.b, test.t3.b)], other cond:eq(test.t1.a, test.t3.a)", - "├─TableReader(Build) 3.00 root data:TableFullScan", - "│ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "TableReader 24365.26 root data:ExchangeSender", + "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + " └─HashJoin 24365.26 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "TableReader 24365.26 root data:ExchangeSender", + "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + " └─HashJoin 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a where exists (select t3.a from t3 where t1.b = t3.b)", + "SQL": "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.b)]", - "├─TableReader(Build) 3.00 root data:Selection", - "│ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", - "│ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", - "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9980.01 root data:Selection", - " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "TableReader 24365.26 root data:ExchangeSender", + "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + " └─HashJoin 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "TableReader 24365.26 root data:ExchangeSender", + "└─ExchangeSender 24365.26 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 24365.26 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + " └─HashJoin 24365.26 mpp[tiflash] left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "TableReader 15609.38 root data:ExchangeSender", + "└─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15609.38 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 12487.50 mpp[tiflash] ", + " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─HashJoin 12487.50 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "TableReader 15609.38 root data:ExchangeSender", + "└─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15609.38 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 12487.50 mpp[tiflash] ", + " └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─HashJoin 12487.50 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "TableReader 19492.21 root data:ExchangeSender", + "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 19492.21 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "TableReader 19492.21 root data:ExchangeSender", + "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 19492.21 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 10000.00 mpp[tiflash] ", + " │ └─ExchangeSender 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "TableReader 30426.12 root data:ExchangeSender", + "└─ExchangeSender 30426.12 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 30426.12 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + " └─HashJoin 30426.12 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 15593.77 mpp[tiflash] ", + " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", + " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t6 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t5.a, test.t2.a)]", + " │ ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t5 keep order:false, stats:pseudo", + " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─Projection 15593.77 mpp[tiflash] test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "TableReader 30426.12 root data:ExchangeSender", + "└─ExchangeSender 30426.12 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 30426.12 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + " └─HashJoin 30426.12 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 15593.77 mpp[tiflash] ", + " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", + " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t6 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t5.a, test.t2.a)]", + " │ ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t5 keep order:false, stats:pseudo", + " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "TableReader 30426.12 root data:ExchangeSender", + "└─ExchangeSender 30426.12 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 30426.12 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + " └─HashJoin 30426.12 mpp[tiflash] left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 15593.77 mpp[tiflash] ", + " │ └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t2.b, collate: binary]", + " │ └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", + " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t6.b))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t6 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t5.a, test.t2.a)]", + " │ ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t5 keep order:false, stats:pseudo", + " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15593.77 mpp[tiflash] ", + " └─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.b, collate: binary]", + " └─HashJoin 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "TableReader 24389.65 root data:ExchangeSender", + "└─ExchangeSender 24389.65 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 24389.65 mpp[tiflash] right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 12487.50 mpp[tiflash] ", + " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t4.a, test.t.a)]", + " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15609.38 mpp[tiflash] ", + " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.a, collate: binary]", + " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "TableReader 24389.65 root data:ExchangeSender", + "└─ExchangeSender 24389.65 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 24389.65 mpp[tiflash] test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + " └─HashJoin 24389.65 mpp[tiflash] right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 12487.50 mpp[tiflash] ", + " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t4.a, test.t.a)]", + " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15609.38 mpp[tiflash] ", + " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.a, collate: binary]", + " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", + "Plan": [ + "TableReader 24389.65 root data:ExchangeSender", + "└─ExchangeSender 24389.65 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 24389.65 mpp[tiflash] right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 12487.50 mpp[tiflash] ", + " │ └─ExchangeSender 12487.50 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.a, collate: binary]", + " │ └─HashJoin 12487.50 mpp[tiflash] inner join, equal:[eq(test.t4.a, test.t.a)]", + " │ ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.a))", + " │ │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " │ └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 15609.38 mpp[tiflash] ", + " └─ExchangeSender 15609.38 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t1.a, collate: binary]", + " └─HashJoin 15609.38 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t3.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "TableReader 15593.77 root data:ExchangeSender", + "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15593.77 mpp[tiflash] right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─TableFullScan(Probe) 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", + "Plan": [ + "TableReader 15593.77 root data:ExchangeSender", + "└─ExchangeSender 15593.77 mpp[tiflash] ExchangeType: PassThrough", + " └─HashJoin 15593.77 mpp[tiflash] left outer join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t3.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 mpp[tiflash] right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─TableFullScan(Probe) 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "TableReader 19492.21 root data:ExchangeSender", + "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 19492.21 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " └─HashJoin 19492.21 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", + "Plan": [ + "TableReader 19492.21 root data:ExchangeSender", + "└─ExchangeSender 19492.21 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 19492.21 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " └─HashJoin 19492.21 mpp[tiflash] right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "TableReader 30456.57 root data:ExchangeSender", + "└─ExchangeSender 30456.57 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 30456.57 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + " └─HashJoin 30456.57 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 24365.26 mpp[tiflash] inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "TableReader 30456.57 root data:ExchangeSender", + "└─ExchangeSender 30456.57 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 30456.57 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + " └─HashJoin 30456.57 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 24365.26 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 mpp[tiflash] inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 mpp[tiflash] inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + ] + }, + { + "SQL": "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", + "Plan": [ + "TableReader 243165526.37 root data:ExchangeSender", + "└─ExchangeSender 243165526.37 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection 243165526.37 mpp[tiflash] test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + " └─HashJoin 243165526.37 mpp[tiflash] inner join, equal:[eq(test.t3.a, test.t1.a) eq(test.t2.b, test.t1.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 194532421.09 mpp[tiflash] inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 155625936.88 mpp[tiflash] inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─ExchangeReceiver(Build) 9990.00 mpp[tiflash] ", + " │ └─ExchangeSender 9990.00 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 mpp[tiflash] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 124500749.50 mpp[tiflash] CARTESIAN inner join", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 mpp[tiflash] inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─ExchangeReceiver(Build) 9980.01 mpp[tiflash] ", + " │ └─ExchangeSender 9980.01 mpp[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9980.01 mpp[tiflash] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 mpp[tiflash] table:t3 keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 mpp[tiflash] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 mpp[tiflash] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + } + ] + }, + { + "Name": "TestJoinOrderHint4Subquery", + "Cases": [ + { + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, test.t3.a)]", + "├─TableReader(Build) 3.00 root data:Selection", + "│ └─Selection 3.00 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9990.00 root anti semi join, equal:[eq(test.t1.b, test.t3.b)], other cond:eq(test.t1.a, test.t3.a)", + "├─TableReader(Build) 3.00 root data:TableFullScan", + "│ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ straight_join() */ * from t1 join t2 on t1.a=t2.a where exists (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.b)]", + "├─TableReader(Build) 3.00 root data:Selection", + "│ └─Selection 3.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 3.00 cop[tikv] table:t3 keep order:false", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, @@ -4879,650 +7706,1109 @@ "Name": "TestLeadingJoinHint4OuterJoin", "Cases": [ { - "SQL": "select /*+ leading(t3, t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.b, test.t3.b)]", + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root inner join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": [ "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t1) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.b, test.t3.b)]", + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root left outer join, equal:[eq(test.t.a, test.t1.a)]", " ├─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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t2.b, test.t.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t1, t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t4, t3, t2, t, t1) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t1.b, test.t3.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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ leading(t3) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t4, t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.b, test.t3.b)]", + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root inner join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ leading(t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t3, t2, t) */ * from t4 join t on t4.a=t.a left join t1 on t.a = t1.a join t2 on t.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t1.b, test.t3.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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", + "Projection 24365.26 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24365.26 root left outer join, equal:[eq(test.t.a, test.t1.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t.a, test.t4.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t2.b, test.t.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─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(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t1) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", + "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", "├─TableReader(Build) 10000.00 root data:TableFullScan", "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.b, test.t3.b)]", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3, t2, t1) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", + "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", "├─TableReader(Build) 10000.00 root data:TableFullScan", "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.b, test.t3.b)]", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t1, t2, t3) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", - "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t1.b, test.t3.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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ], - "Warning": null - }, - { - "SQL": "select /*+ leading(t3, t1, t2) */ * from t2 left join t1 on t2.a=t1.a left join t3 on t1.b=t3.b;", + "SQL": "select /*+ leading(t2, t3) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t1.a)]", + "HashJoin 19492.21 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", "├─TableReader(Build) 10000.00 root data:TableFullScan", "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.b, test.t3.b)]", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" - ], - "Warning": null - }, - { - "SQL": "select /*+ leading(t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", - "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 19492.21 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─Projection(Probe) 15593.77 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 30426.12 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30426.12 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─Projection(Build) 15593.77 root test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + " │ └─HashJoin 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " │ ├─TableReader(Build) 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─TableReader(Build) 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2, t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 30426.12 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30426.12 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─TableReader(Build) 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " │ ├─TableReader(Build) 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" ] }, { - "SQL": "select /*+ leading(t2, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t5, t6, t3, t4) */ * from t2 left join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 30426.12 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30426.12 root left outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " │ ├─TableReader(Build) 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " │ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " │ ├─TableReader(Build) 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t1, t2) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "HashJoin 24389.65 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t4.a, test.t.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15609.38 root inner join, equal:[eq(test.t2.b, test.t3.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", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─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(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t2, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 24389.65 root test.t4.a, test.t4.b, test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 24389.65 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t4.a, test.t.a)]", + " │ ├─TableReader(Build) 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15609.38 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t1, t3, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t1, t3) */ * from t4 join t on t4.a=t.a right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.a)]", + "HashJoin 24389.65 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t4.a, test.t.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15609.38 root inner join, equal:[eq(test.t2.b, test.t3.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", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─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(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t2, t3, t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=1;", + "SQL": "select /*+ leading(t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "HashJoin 124875000.00 root CARTESIAN left outer join, left cond:[eq(test.t2.a, 1)]", - "├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t3.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) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t1) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t2, t1, t3) */ * from t2 right join (t1 left join t3 on t1.a=t3.a) on t2.b=t1.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "HashJoin 15593.77 root left outer join, equal:[eq(test.t1.a, test.t3.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", + "└─HashJoin(Probe) 12487.50 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", " ├─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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─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" ], "Warning": null }, { - "SQL": "select /*+ leading(t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t2, t3) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "Projection 19492.21 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t3.b, test.t4.b)]", " ├─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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ leading(t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─Projection(Probe) 12487.50 root test.t1.a, test.t1.b, test.t3.a, test.t3.b", - " └─HashJoin 12487.50 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + "Projection 19492.21 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b", + "└─HashJoin 19492.21 root right outer join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader(Probe) 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" + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t1, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t3, t4) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "Projection 30456.57 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30456.57 root inner join, equal:[eq(test.t5.b, test.t6.b)]", " ├─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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 24365.26 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t3, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t3, t4) leading(t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "Projection 30456.57 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 30456.57 root inner join, equal:[eq(test.t5.b, test.t6.b)]", " ├─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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 24365.26 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 19492.21 root inner join, equal:[eq(test.t2.a, test.t5.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 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.a)), not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" ] }, { - "SQL": "select /*+ leading(t1, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t3, t4, t5, t6) */ * from t2 right join (t1 join t3 on t1.a=t3.a join t4 on t3.b = t4.b) on t2.b=t1.b join t5 on t2.a = t5.a join t6 on t5.b=t6.b;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.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) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 243165526.37 root test.t2.a, test.t2.b, test.t1.a, test.t1.b, test.t3.a, test.t3.b, test.t4.a, test.t4.b, test.t5.a, test.t5.b, test.t6.a, test.t6.b", + "└─HashJoin 243165526.37 root inner join, equal:[eq(test.t3.a, test.t1.a) eq(test.t2.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 194532421.09 root inner join, equal:[eq(test.t5.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 155625936.88 root inner join, equal:[eq(test.t5.b, test.t6.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t6.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 124500749.50 root CARTESIAN inner join", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t5.a)), not(isnull(test.t5.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t3.b, test.t4.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t1, t2, t3) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t2) hash_join(t2) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "Projection 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Projection(Probe) 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t1, t2) */ * from t2 left join (t1 left join t3 on t1.a=t3.a) on t2.a=t3.a;", + "SQL": "select /*+ leading(t2) hash_join(t1) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 15609.38 root left outer join, equal:[eq(test.t2.a, test.t3.a)]", - "├─TableReader(Build) 10000.00 root data:TableFullScan", - "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "HashJoin 19492.21 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", + "├─HashJoin(Build) 12475.01 root inner join, equal:[eq(test.t.a, test.t1.a)]", + "│ ├─TableReader(Build) 9980.01 root data:Selection", + "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", " └─TableReader(Probe) 9990.00 root data:Selection", - " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t1) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t2) hash_join(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 19492.21 root inner join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", " │ └─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(Probe) 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t) hash_join(t2) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "Projection 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t) hash_join(t1) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─HashJoin(Build) 12475.01 root inner join, equal:[eq(test.t.a, test.t1.a)]", + " │ ├─TableReader(Build) 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], - "Warning": null + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] }, { - "SQL": "select /*+ leading(t4) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t) hash_join(t3) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─Projection(Build) 12487.50 root test.t3.a, test.t3.b, test.t4.a, test.t4.b", - "│ └─HashJoin 12487.50 root inner join, equal:[eq(test.t4.a, test.t3.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) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 19492.21 root inner join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", " │ └─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" + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t1, t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t2) INL_JOIN(t1) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", + "HashJoin 19492.21 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", + "├─IndexJoin(Build) 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.t1.a, equal cond:eq(test.t.a, test.t1.a)", "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "│ └─IndexLookUp(Probe) 1.25 root ", + "│ ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.t1.a))", + "│ │ └─IndexRangeScan 1.25 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, test.t.a)], keep order:false, stats:pseudo", + "│ └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.t1.b))", + "│ └─TableRowIDScan 1.25 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t1, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t2) INL_JOIN(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 19492.21 root inner join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", " │ └─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(Probe) 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 Optimizer Hint /*+ INL_JOIN(t3) */ or /*+ TIDB_INLJ(t3) */ is inapplicable" ] }, { - "SQL": "select /*+ leading(t4, t1) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t3) INL_JOIN(t1) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─IndexJoin(Build) 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.t1.a, equal cond:eq(test.t.a, test.t1.a)", + " │ ├─TableReader(Build) 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " │ └─IndexLookUp(Probe) 1.25 root ", + " │ ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─IndexRangeScan 1.25 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, test.t.a)], keep order:false, stats:pseudo", + " │ └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableRowIDScan 1.25 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t3.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─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(test.t3.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], - "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" - ] + "Warning": null }, { - "SQL": "select /*+ leading(t4, t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t3) INL_JOIN(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 19492.21 root inner join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", " │ └─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(Probe) 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", + "Warning 1815 Optimizer Hint INL_JOIN or TIDB_INLJ is inapplicable" ] }, { - "SQL": "select /*+ leading(t3, t2) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t2) merge_join(t2) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "Projection 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t3.b, test.t2.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─MergeJoin(Probe) 15593.77 root right outer join, left key:test.t1.b, right key:test.t2.b", + " ├─Sort(Build) 12475.01 root test.t1.b", + " │ └─Projection 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " │ └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " │ ├─TableReader(Build) 9980.01 root data:Selection", + " │ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " │ └─TableReader(Probe) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─Sort(Probe) 9990.00 root test.t2.b", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t4) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t1) merge_join(t2) */ * from t join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.a))", + "Projection 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t3.b, test.t2.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", + " └─MergeJoin(Probe) 15593.77 root inner join, left key:test.t1.b, right key:test.t2.b", + " ├─Sort(Build) 9990.00 root test.t2.b", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Sort(Probe) 12475.01 root test.t1.b", + " └─Projection 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2) merge_join(t3) */ * from t left join t1 on t.a = t1.a right join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "MergeJoin 19492.21 root inner join, left key:test.t2.b, right key:test.t3.b", + "├─Sort(Build) 9990.00 root test.t3.b", + "│ └─TableReader 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", + "└─Sort(Probe) 15593.77 root test.t2.b", + " └─HashJoin 15593.77 root right outer join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Projection(Probe) 12475.01 root test.t.a, test.t.b, test.t1.a, test.t1.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3) merge_join(t3) */ * from t join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "MergeJoin 19492.21 root inner join, left key:test.t2.b, right key:test.t3.b", + "├─Sort(Build) 9990.00 root test.t3.b", + "│ └─TableReader 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", + "└─Sort(Probe) 15593.77 root test.t2.b", + " └─Projection 15593.77 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 15593.77 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t3) merge_join(t2) */ * from t right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "Projection 19511.72 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19511.72 root inner join, equal:[eq(test.t3.b, test.t2.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", + " └─MergeJoin(Probe) 15609.38 root inner join, left key:test.t1.b, right key:test.t2.b", + " ├─Sort(Build) 9990.00 root test.t2.b", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Sort(Probe) 12487.50 root test.t1.b", + " └─HashJoin 12487.50 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3) merge_join(t2) */ * from t right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "Projection 19511.72 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19511.72 root inner join, equal:[eq(test.t3.b, test.t2.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", + " └─MergeJoin(Probe) 15609.38 root inner join, left key:test.t1.b, right key:test.t2.b", + " ├─Sort(Build) 9990.00 root test.t2.b", + " │ └─TableReader 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Sort(Probe) 12487.50 root test.t1.b", + " └─HashJoin 12487.50 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3) merge_join(t3) */ * from t right join t1 on t.a = t1.a join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "MergeJoin 19511.72 root inner join, left key:test.t2.b, right key:test.t3.b", + "├─Sort(Build) 9990.00 root test.t3.b", + "│ └─TableReader 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", + "└─Sort(Probe) 15609.38 root test.t2.b", + " └─HashJoin 15609.38 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root right outer join, equal:[eq(test.t.a, test.t1.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t3) merge_join(t3) */ * from t left join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "MergeJoin 19492.21 root inner join, left key:test.t2.b, right key:test.t3.b", + "├─Sort(Build) 9990.00 root test.t3.b", + "│ └─TableReader 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", + "└─Sort(Probe) 15593.77 root test.t2.b", + " └─Projection 15593.77 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 15593.77 root inner join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 leading hint is inapplicable, check the join type or the join algorithm hint" + ] + }, + { + "SQL": "select /*+ leading(t2) INL_JOIN(t1) */ * from t join t1 on t.a = t1.a left join t2 on t1.b = t2.b join t3 on t2.b = t3.b ;", + "Plan": [ + "Projection 19492.21 root test.t.a, test.t.b, test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t3.a, test.t3.b", + "└─HashJoin 19492.21 root inner join, equal:[eq(test.t2.b, test.t1.b)]", + " ├─IndexJoin(Build) 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.t1.a, equal cond:eq(test.t.a, test.t1.a)", + " │ ├─TableReader(Build) 9990.00 root data:Selection", + " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " │ │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " │ └─IndexLookUp(Probe) 1.25 root ", + " │ ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.t1.a))", + " │ │ └─IndexRangeScan 1.25 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, test.t.a)], keep order:false, stats:pseudo", + " │ └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.t1.b))", + " │ └─TableRowIDScan 1.25 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t2.b, test.t3.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) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12475.01 root semi join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, test.t3.a)]", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─Projection(Probe) 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", + " └─HashJoin 15593.77 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, test.t3.a)]", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where t1.a in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, test.t3.a)]", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t3.a)), not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t4) */ * from t1 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 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12475.01 root anti semi join, equal:[eq(test.t1.b, test.t3.b)], other cond:eq(test.t1.a, test.t3.a)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t1.b, test.t4.b)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9990.00 root anti semi join, equal:[eq(test.t1.b, test.t3.b)], other cond:eq(test.t1.a, test.t3.a)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", @@ -5530,19 +8816,114 @@ " └─TableReader(Probe) 10000.00 root data:TableFullScan", " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9990.00 root anti semi join, equal:[eq(test.t1.b, test.t3.b)], other cond:eq(test.t1.a, test.t3.a)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where exists (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12475.01 root semi join, equal:[eq(test.t1.b, test.t3.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", + "└─Projection(Probe) 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", + " └─HashJoin 15593.77 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], "Warning": null }, { - "SQL": "select /*+ leading(t1, t2, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where exists (select t3.a from t3 where t1.b = t3.b)", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", + "HashJoin 9990.00 root semi join, equal:[eq(test.t1.b, test.t3.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", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where exists (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9980.01 root semi join, equal:[eq(test.t1.b, test.t3.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", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where not exists (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12475.01 root anti semi join, equal:[eq(test.t1.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root right outer join, equal:[eq(test.t1.b, test.t4.b)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where not exists (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9990.00 root anti semi join, equal:[eq(test.t1.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", @@ -5551,598 +8932,607 @@ " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a where not exists (select t3.a from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 9990.00 root anti semi join, equal:[eq(test.t1.b, test.t3.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t1) */ t1.a, (select min(t1.a) from t2 where t2.a > t1.a) from t1 join t3 on t1.a = t3.a;", + "Plan": [ + "Projection 1.00 root test.t1.a, Column#14", + "└─Apply 1.00 root CARTESIAN left outer join", + " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t3.a", + " │ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " │ └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo", + " └─MaxOneRow(Probe) 1.00 root ", + " └─Projection 2.00 root Column#10", + " └─IndexReader 2.00 root index:Selection", + " └─Selection 2.00 cop[tikv] gt(test.t2.a, test.t1.a)", + " └─IndexFullScan 2.50 cop[tikv] table:t2, index:a(a) keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ t1.a, (select min(t1.a) from t2 where t2.a > t1.a) from t1 join t3 on t1.a = t3.a;", + "Plan": [ + "Projection 1.00 root test.t1.a, Column#14", + "└─Apply 1.00 root CARTESIAN left outer join", + " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t3.a", + " │ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " │ └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo", + " └─MaxOneRow(Probe) 1.00 root ", + " └─Projection 2.00 root Column#10", + " └─IndexReader 2.00 root index:Selection", + " └─Selection 2.00 cop[tikv] gt(test.t2.a, test.t1.a)", + " └─IndexFullScan 2.50 cop[tikv] table:t2, index:a(a) keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t2, t3@sel_2) */ t1.a, (select min(t1.a) from t2 where t2.a > t1.a) from t1 join t3 on t1.a = t3.a;", + "Plan": [ + "Projection 1.00 root test.t1.a, Column#14", + "└─Apply 1.00 root CARTESIAN left outer join", + " ├─HashAgg(Build) 1.00 root funcs:min(test.t1.a)->Column#10, funcs:firstrow(test.t1.a)->test.t1.a", + " │ └─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t3.a", + " │ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " │ └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo", + " └─MaxOneRow(Probe) 1.00 root ", + " └─Projection 2.00 root Column#10", + " └─IndexReader 2.00 root index:Selection", + " └─Selection 2.00 cop[tikv] gt(test.t2.a, test.t1.a)", + " └─IndexFullScan 2.50 cop[tikv] table:t2, index:a(a) keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t2, t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t4, t3@sel_2) */ * from t1 right join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, Column#13)]", + "├─Selection(Build) 6393.60 root not(isnull(Column#13))", + "│ └─HashAgg 7992.00 root group by:test.t3.b, funcs:max(Column#26)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#26", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t4, t3) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t4) */ * from t1 right join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "Plan": [ + "Projection 12487.50 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", + "└─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, Column#13)]", + " ├─Selection(Build) 6393.60 root not(isnull(Column#13))", + " │ └─HashAgg 7992.00 root group by:test.t3.b, funcs:max(Column#19)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + " │ └─TableReader 7992.00 root data:HashAgg", + " │ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#19", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, Column#13)]", + "├─Selection(Build) 6393.60 root not(isnull(Column#13))", + "│ └─HashAgg 7992.00 root group by:test.t3.b, funcs:max(Column#23)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#23", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] + }, + { + "SQL": "select /*+ leading(t3@sel_2, t1) */ * from t1 left join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a = (select max(t3.a) from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b) eq(test.t1.a, Column#13)]", + "├─Selection(Build) 6393.60 root not(isnull(Column#13))", + "│ └─HashAgg 7992.00 root group by:test.t3.b, funcs:max(Column#23)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:max(test.t3.a)->Column#23", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t4.b)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3, t1) */. Maybe you can use the table alias name", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t1, t4, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t4, t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b)], other cond:gt(test.t1.a, Column#13)", + "├─Selection(Build) 6393.60 root not(isnull(Column#13))", + "│ └─HashAgg 7992.00 root group by:test.t3.b, funcs:min(Column#23)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#23", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t4.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t4, t3) */. Maybe you can use the table alias name", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t4, t2, t3) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t4) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "Projection 12487.50 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", + "└─HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b)], other cond:gt(test.t1.a, Column#13)", + " ├─Selection(Build) 6393.60 root not(isnull(Column#13))", + " │ └─HashAgg 7992.00 root group by:test.t3.b, funcs:min(Column#19)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + " │ └─TableReader 7992.00 root data:HashAgg", + " │ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#19", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", + "Plan": [ + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b)], other cond:gt(test.t1.a, Column#13)", + "├─Selection(Build) 6393.60 root not(isnull(Column#13))", + "│ └─HashAgg 7992.00 root group by:test.t3.b, funcs:min(Column#23)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#23", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t4.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" ] }, { - "SQL": "select /*+ leading(t1, t2, t3, t4) */ * from (t1 left join t2 on t1.a=t2.a) left join (t3 left join t4 on t3.a=t4.a) on t2.a=t4.a;", + "SQL": "select /*+ leading(t3@sel_2, t2) */ * from t1 right join t2 on t1.a=t2.a join t4 on t1.b = t4.b where t1.a > (select min(t3.a) from t3 where t1.b = t3.b)", "Plan": [ - "HashJoin 19511.72 root left outer join, equal:[eq(test.t2.a, test.t4.a)]", - "├─HashJoin(Build) 12487.50 root inner join, equal:[eq(test.t3.a, test.t4.a)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 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", - "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.b, test.t3.b)], other cond:gt(test.t1.a, Column#13)", + "├─Selection(Build) 6393.60 root not(isnull(Column#13))", + "│ └─HashAgg 7992.00 root group by:test.t3.b, funcs:min(Column#26)->Column#13, funcs:firstrow(test.t3.b)->test.t3.b", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t3.b, funcs:min(test.t3.a)->Column#26", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t3.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.b, test.t4.b)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─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" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3, t2) */. Maybe you can use the table alias name", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where t1.a in (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", + "Projection 15593.77 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, test.t4.a, test.t4.b", + "└─HashJoin 15593.77 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + " ├─HashAgg(Build) 7992.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", + " │ └─IndexReader 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:false, stats:pseudo", + " └─HashJoin(Probe) 15593.77 root inner join, equal:[eq(test.t1.a, test.t2.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.b, test.t1.b)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t4.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 9990.00 root inner join, equal:[eq(test.t3.a, test.t1.a)]", + " ├─HashAgg(Build) 7992.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", + " │ └─IndexReader 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t3) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a in (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.a, test.t3.a)]", + "├─HashAgg(Build) 7992.00 root group by:test.t3.a, funcs:firstrow(test.t3.a)->test.t3.a", + "│ └─IndexReader 9990.00 root index:IndexFullScan", + "│ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" ] }, { - "SQL": "select /*+ leading(t4) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "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)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", + "HashJoin 12487.50 root CARTESIAN anti semi join, other cond:eq(test.t1.a, test.t3.a)", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t3, index:a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 15609.38 root right outer join, equal:[eq(test.t1.b, test.t4.b)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select /*+ leading(t2, t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 9990.00 root CARTESIAN anti semi join, other cond:eq(test.t1.a, test.t3.a)", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t3, index:a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─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" ], - "Warning": null + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] }, { - "SQL": "select /*+ leading(t2, t3) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where t1.a not in (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 9990.00 root CARTESIAN anti semi join, other cond:eq(test.t1.a, test.t3.a)", + "├─IndexReader(Build) 10000.00 root index:IndexFullScan", + "│ └─IndexFullScan 10000.00 cop[tikv] table:t3, index:a(a) keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t4, t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", - "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "SQL": "select /*+ leading(t4) */ * from t1 left join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where exists (select t3.a from t3)", + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where exists (select t3.a from t3)", + "Plan": [ + "TableDual 0.00 root rows:0" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" ] }, { - "SQL": "select /*+ leading(t3, t1) */ * from ((select t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where exists (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "TableDual 0.00 root rows:0" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name" ] }, { - "SQL": "select * from ((select /*+ leading(t5) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t4) */ * from t1 join t2 on t1.a=t2.a right join t4 on t1.b = t4.b where not exists (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9990.00 root data:Selection", - "│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t5.a, test.t6.a)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─IndexReader(Probe) 9990.00 root index:IndexFullScan", - "│ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 15593.77 root right outer join, equal:[eq(test.t1.b, test.t4.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": null }, { - "SQL": "select * from ((select /*+ leading(t6) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t3@sel_2) */ * from t1 left join t2 on t1.a=t2.a where not exists (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + "│ └─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" ], - "Warning": null + "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t3) */. Maybe you can use the table alias name" + ] }, { - "SQL": "select * from ((select /*+ leading(t5, t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t2, t3@sel_2) */ * from t1 join t2 on t1.a=t2.a where not exists (select t3.a from t3)", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ + "Warning 1815 There are no matching table names for (t3) in optimizer hint /*+ LEADING(t2, t3) */. Maybe you can use the table alias name", "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select * from ((select /*+ leading(t6, t8, t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t4@sel_2, t1) */ * from t1 join (select * from t4) t2 on t1.a=t2.a join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + "Projection 15593.77 root test.t1.a, test.t1.b, test.t4.a, test.t4.b, test.t3.a, test.t3.b", + "└─HashJoin 15593.77 root inner join, equal:[eq(test.t4.b, test.t3.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", + " └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t4.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t4.a)), not(isnull(test.t4.b))", " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + "Warning 1815 There are no matching table names for (t4) in optimizer hint /*+ LEADING(t4, t1) */. Maybe you can use the table alias name" ] }, { - "SQL": "select /*+ leading(t3) */ * from ((select /*+ leading(t5) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t2, t4@sel_2) */ * from (select * from t4) t1 right join t2 on t1.a=t2.a join t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 15609.38 root inner join, equal:[eq(test.t2.b, test.t3.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", + "└─HashJoin(Probe) 12487.50 root right outer join, equal:[eq(test.t4.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + "Warning 1815 There are no matching table names for (t4) in optimizer hint /*+ LEADING(t2, t4) */. Maybe you can use the table alias name" ] }, { - "SQL": "select /*+ leading(t3, t1) */ * from ((select /*+ leading(t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t3) */ * from t1 join t2 on t1.a=t2.a right join (select * from t4) t3 on t2.b=t3.b;", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "HashJoin 15593.77 root right outer join, equal:[eq(test.t2.b, test.t4.b)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", + "└─Projection(Probe) 12475.01 root test.t1.a, test.t1.b, test.t2.a, test.t2.b", + " └─HashJoin 12475.01 root inner join, equal:[eq(test.t2.a, test.t1.a)]", + " ├─TableReader(Build) 9980.01 root data:Selection", + " │ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b))", + " │ └─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(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t1, t2) */ * from ((select /*+ leading(t6, t7) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t1) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "Projection 12487.50 root test.t1.a, ->Column#14", + "└─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t3.a", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t1, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", + "Plan": [ + "Projection 12487.50 root test.t1.a, ->Column#14", + "└─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t3.a", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo" ], "Warning": [ - "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid", - "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + "Warning 1815 There are no matching table names for (t2) in optimizer hint /*+ LEADING(t1, t2) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] }, { - "SQL": "select /*+ leading(t3, t4) */ * from ((select /*+ leading(t5, t7, t8) */ t8.a, t8.b from t8, t7, t6, t5 where t5.a = t6.a and t6.b=t7.b) t3 left join t4 on t3.a=t4.a) left join (t1 left join t2 on t1.a=t2.a) on t1.a=t4.a;", + "SQL": "select /*+ leading(t1, t3) */ t1.a, (select min(t2.a) from t2) from t1 join t3 on t1.a = t3.a;", "Plan": [ - "HashJoin 304261169.13 root CARTESIAN inner join", - "├─HashJoin(Build) 15593.77 root inner join, equal:[eq(test.t6.a, test.t5.a)]", - "│ ├─IndexReader(Build) 9990.00 root index:IndexFullScan", - "│ │ └─IndexFullScan 9990.00 cop[tikv] table:t5, index:a(a) keep order:false, stats:pseudo", - "│ └─HashJoin(Probe) 12475.01 root inner join, equal:[eq(test.t6.b, test.t7.b)]", - "│ ├─TableReader(Build) 9980.01 root data:Selection", - "│ │ └─Selection 9980.01 cop[tikv] not(isnull(test.t6.a)), not(isnull(test.t6.b))", - "│ │ └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo", - "│ └─TableReader(Probe) 9990.00 root data:Selection", - "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t7.b))", - "│ └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo", - "└─HashJoin(Probe) 19511.72 root left outer join, equal:[eq(test.t4.a, test.t1.a)]", - " ├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " │ ├─TableReader(Build) 9990.00 root data:Selection", - " │ │ └─Selection 9990.00 cop[tikv] not(isnull(test.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(test.t1.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t8.a, test.t4.a)]", - " ├─TableReader(Build) 9990.00 root data:Selection", - " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t4.a))", - " │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo", - " └─TableReader(Probe) 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo" + "Projection 12487.50 root test.t1.a, ->Column#14", + "└─MergeJoin 12487.50 root inner join, left key:test.t1.a, right key:test.t3.a", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo" + ], + "Warning": null + }, + { + "SQL": "select /*+ leading(t2@sel_2, t1) */ t1.a, (select min(t2.a) from t2) from t1 left join t3 on t1.a = t3.a;", + "Plan": [ + "Projection 12487.50 root test.t1.a, ->Column#14", + "└─MergeJoin 12487.50 root left outer join, left key:test.t1.a, right key:test.t3.a", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo" ], "Warning": [ - "Warning 1815 We can only use one leading hint at most, when multiple leading hints are used, all leading hints will be invalid" + "Warning 1815 There are no matching table names for (t2) in optimizer hint /*+ LEADING(t2, t1) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" + ] + }, + { + "SQL": "select /*+ leading(t3, t2@sel_2) */ t1.a, (select min(t2.a) from t2) from t1 right join t3 on t1.a = t3.a;", + "Plan": [ + "Projection 12487.50 root test.t1.a, ->Column#14", + "└─MergeJoin 12487.50 root right outer join, left key:test.t1.a, right key:test.t3.a", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:a(a) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t3, index:a(a) keep order:true, stats:pseudo" + ], + "Warning": [ + "Warning 1815 There are no matching table names for (t2) in optimizer hint /*+ LEADING(t3, t2) */. Maybe you can use the table alias name", + "Warning 1815 leading hint is inapplicable, check if the leading hint table is valid" ] } ] diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index ce4c38cbc695d..68aa867feca3b 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -572,6 +572,25 @@ "select /*+ LIMIT_TO_COP() */ a from tn where a > 10 limit 1" ] }, + { + "name": "TestCTEMergeHint", + "cases": [ + "with cte as (select /*+ MERGE() */ * from tc where tc.a < 60) select * from cte where cte.a <18", + "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", + "WITH cte1 AS (SELECT /*+ MERGE() */ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE() */ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "with recursive cte1(c1) as (select 1 union select /*+ MERGE() */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", + "WITH cte1 AS (SELECT * FROM t1) SELECT /*+ MERGE() */ * FROM cte1 join t2 on cte1.a = t2.b;", + "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "with cte1 as (with cte2 as (select /*+ MERGE() */ * from te) ,cte3 as (select /*+ MERGE() */ * from tc) select /*+ MERGE() */ * from cte2,cte3) select * from cte1;", + "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte1 as (select /*+ MERGE() */ * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select /*+ MERGE() */ * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select /*+ MERGE() */ * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", + "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;" + ] + }, { "name": "TestPushdownDistinctEnable", "cases": [ @@ -747,6 +766,14 @@ "select * from t where t.a < 3 and t.a < 3" ] }, + { + "name": "TestSkewDistinctAgg", + "cases": [ + "select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) from t group by date_format(d,'%Y')", + "select d, a, count(*), count(b), count(distinct c) from t group by d, a", + "select d, sum(a), count(b), avg(distinct c) from t group by d" + ] + }, { "name": "TestMPPSinglePartitionType", "cases": [ @@ -783,5 +810,16 @@ "select * from employee e1 join (select deptid+1 d, count(empid) a from employee group by d) e2 on e1.deptid = e2.d", "select * from (select deptid+1 d, count(empid) a from employee group by d) e1 join (select deptid+1 d, count(empid) a from employee group by d) e2 on e1.d = e2.d" ] + }, + { + "name": "TestSemiJoinRewriteHints", + "cases": [ + "select /*+ SEMI_JOIN_REWRITE() */ * from t", + "select * from t where a > (select /*+ SEMI_JOIN_REWRITE() */ min(b) from t t1 where t1.c = t.c)", + "select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 where t1.a=t.a)", + "select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ t.b from t t1 where t1.a=t.a)", + "select exists(select /*+ SEMI_JOIN_REWRITE() */ * from t t1 where t1.a=t.a) from t", + "select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 where t1.a > t.a)" + ] } ] diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 43c97667fd49d..f81b11baea809 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1594,6 +1594,267 @@ } ] }, + { + "Name": "TestCTEMergeHint", + "Cases": [ + { + "SQL": "with cte as (select /*+ MERGE()*/ * from tc where tc.a < 60) select * from cte where cte.a <18", + "Plan": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte as (select * from tc where tc.a < 60) select * from cte where cte.a <18", + "Plan": [ + "Selection 3.20 root lt(test.tc.a, 18)", + "└─CTEFullScan 4.00 root CTE:cte data:CTE_0", + "CTE_0 4.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 4.00 root data:Selection", + " └─Selection 4.00 cop[tikv] lt(test.tc.a, 18), lt(test.tc.a, 60)", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" + ], + "Warning": null + }, + { + "SQL": "WITH cte1 AS (SELECT /*+ MERGE()*/ a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "Plan": [ + "HashJoin 7.00 root inner join, equal:[eq(test.tc.a, test.te.c)]", + "├─TableReader(Build) 7.00 root data:Selection", + "│ └─Selection 7.00 cop[tikv] not(isnull(test.te.c))", + "│ └─TableFullScan 7.00 cop[tikv] table:te keep order:false", + "└─TableReader(Probe) 7.00 root data:Selection", + " └─Selection 7.00 cop[tikv] not(isnull(test.tc.a))", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" + ], + "Warning": null + }, + { + "SQL": "WITH cte1 AS (SELECT a FROM tc), cte2 AS (SELECT /*+ MERGE()*/ c FROM te) SELECT * FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;", + "Plan": [ + "Projection 4.48 root test.tc.a, test.te.c", + "└─HashJoin 4.48 root inner join, equal:[eq(test.te.c, test.tc.a)]", + " ├─Selection(Build) 4.48 root not(isnull(test.tc.a))", + " │ └─CTEFullScan 5.60 root CTE:cte1 data:CTE_0", + " └─TableReader(Probe) 7.00 root data:Selection", + " └─Selection 7.00 cop[tikv] not(isnull(test.te.c))", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root not(isnull(test.tc.a))", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" + ], + "Warning": null + }, + { + "SQL": "with recursive cte1(c1) as (select 1 union select /*+ MERGE() */ c1 + 1 c1 from cte1 where c1 < 100) select * from cte1;", + "Plan": [ + "CTEFullScan 2.00 root CTE:cte1 data:CTE_0", + "CTE_0 2.00 root Recursive CTE", + "├─Projection(Seed Part) 1.00 root 1->Column#2", + "│ └─TableDual 1.00 root rows:1", + "└─Projection(Recursive Part) 0.80 root cast(plus(Column#3, 1), bigint(1) BINARY)->Column#5", + " └─Selection 0.80 root lt(Column#3, 100)", + " └─CTETable 1.00 root Scan on CTE_0" + ], + "Warning": [ + "[planner:1815]Hint merge() is inapplicable. Please check whether the CTE use recursive." + ] + }, + { + "SQL": "WITH cte1 AS (SELECT * FROM t1) SELECT /*+ MERGE() */ * FROM cte1 join t2 on cte1.a = t2.b;", + "Plan": [ + "Projection 4.48 root test.t1.a, test.t2.b", + "└─HashJoin 4.48 root inner join, equal:[eq(test.t2.b, test.t1.a)]", + " ├─Selection(Build) 4.48 root not(isnull(test.t1.a))", + " │ └─CTEFullScan 5.60 root CTE:cte1 data:CTE_0", + " └─TableReader(Probe) 7.00 root data:Selection", + " └─Selection 7.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root not(isnull(test.t1.a))", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false" + ], + "Warning": [ + "[planner:1815]Hint merge() is inapplicable. Please check whether the hint is using in outer query, you should use this hint in CTE inner query." + ] + }, + { + "SQL": "with cte1 as (select * from tc), cte2 as (with cte3 as (select /*+ MERGE() */ * from te) ,cte4 as (select * from tc) select * from cte3,cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE_1", + "CTE_1 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_3", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (with cte2 as (select /*+ MERGE() */ * from te) ,cte3 as (select /*+ MERGE() */ * from tc) select /*+ MERGE() */ * from cte2,cte3) select * from cte1;", + "Plan": [ + "HashJoin 49.00 root CARTESIAN inner join", + "├─TableReader(Build) 7.00 root data:TableFullScan", + "│ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false", + "└─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 1920.80 root CARTESIAN inner join", + "├─CTEFullScan(Build) 5.60 root CTE:cte1 data:CTE_0", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root 1", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_5", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_5 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte6 data:CTE_4", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_4 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select /*+ MERGE() */ * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 2401.00 root CARTESIAN inner join", + "├─TableReader(Build) 7.00 root data:TableFullScan", + "│ └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_5", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_5 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte6 data:CTE_4", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_4 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select * from t3) select * from cte5,cte6) ,cte4 as (select /*+ MERGE() */ * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 1920.80 root CARTESIAN inner join", + "├─CTEFullScan(Build) 5.60 root CTE:cte1 data:CTE_0", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root 1", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte6 data:CTE_4", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_4 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte1 as (select * from t1), cte2 as (with cte3 as (with cte5 as (select * from t2),cte6 as (select /*+ MERGE() */ * from t3) select * from cte5,cte6) ,cte4 as (select * from t4) select * from cte3,cte4) select * from cte1,cte2;", + "Plan": [ + "HashJoin 1920.80 root CARTESIAN inner join", + "├─CTEFullScan(Build) 5.60 root CTE:cte1 data:CTE_0", + "└─CTEFullScan(Probe) 343.00 root CTE:cte2 data:CTE_1", + "CTE_0 5.60 root Non-Recursive CTE", + "└─Selection(Seed Part) 5.60 root 1", + " └─TableReader 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t1 keep order:false", + "CTE_1 343.00 root Non-Recursive CTE", + "└─Projection(Seed Part) 343.00 root test.t2.b, test.t3.c, test.t4.d", + " └─HashJoin 343.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_5", + " └─CTEFullScan(Probe) 49.00 root CTE:cte3 data:CTE_2", + "CTE_5 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t4 keep order:false", + "CTE_2 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:t3 keep order:false", + " └─CTEFullScan(Probe) 7.00 root CTE:cte5 data:CTE_3", + "CTE_3 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:t2 keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte2 as (with cte4 as (select * from tc) select * from te, cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE_0", + "CTE_0 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─CTEFullScan(Build) 7.00 root CTE:cte4 data:CTE_1", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false", + "CTE_1 7.00 root Non-Recursive CTE", + "└─TableReader(Seed Part) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:tc keep order:false" + ], + "Warning": null + }, + { + "SQL": "with cte2 as (with cte4 as (select /*+ merge() */ * from tc) select * from te, cte4) select * from cte2;", + "Plan": [ + "CTEFullScan 49.00 root CTE:cte2 data:CTE_0", + "CTE_0 49.00 root Non-Recursive CTE", + "└─HashJoin(Seed Part) 49.00 root CARTESIAN inner join", + " ├─TableReader(Build) 7.00 root data:TableFullScan", + " │ └─TableFullScan 7.00 cop[tikv] table:tc keep order:false", + " └─TableReader(Probe) 7.00 root data:TableFullScan", + " └─TableFullScan 7.00 cop[tikv] table:te keep order:false" + ], + "Warning": null + } + ] + }, { "Name": "TestPushdownDistinctEnable", "Cases": [ @@ -2678,6 +2939,46 @@ } ] }, + { + "Name": "TestSkewDistinctAgg", + "Cases": [ + { + "SQL": "select date_format(d,'%Y') as df, sum(a), count(b), count(distinct c) from t group by date_format(d,'%Y')", + "Plan": [ + "Projection 8000.00 root date_format(test.t.d, %Y)->Column#9, Column#6, cast(Column#13, bigint(21) BINARY)->Column#7, Column#8", + "└─HashAgg 8000.00 root group by:Column#29, funcs:sum(Column#25)->Column#6, funcs:sum(Column#26)->Column#13, funcs:count(Column#27)->Column#8, funcs:firstrow(Column#28)->test.t.d", + " └─Projection 8000.00 root Column#11, cast(Column#12, decimal(20,0) BINARY)->Column#26, test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#29", + " └─HashAgg 8000.00 root group by:Column#23, Column#24, funcs:sum(Column#19)->Column#11, funcs:count(Column#20)->Column#12, funcs:firstrow(Column#21)->test.t.c, funcs:firstrow(Column#22)->test.t.d", + " └─Projection 10000.00 root cast(test.t.a, decimal(10,0) BINARY)->Column#19, test.t.b, test.t.c, test.t.d, date_format(test.t.d, %Y)->Column#23, test.t.c", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select d, a, count(*), count(b), count(distinct c) from t group by d, a", + "Plan": [ + "Projection 8000.00 root test.t.d, test.t.a, cast(Column#10, bigint(21) BINARY)->Column#6, cast(Column#12, bigint(21) BINARY)->Column#7, Column#8", + "└─HashAgg 8000.00 root group by:Column#23, Column#24, funcs:sum(Column#18)->Column#10, funcs:sum(Column#19)->Column#12, funcs:count(Column#20)->Column#8, funcs:firstrow(Column#21)->test.t.a, funcs:firstrow(Column#22)->test.t.d", + " └─Projection 8000.00 root cast(Column#9, decimal(20,0) BINARY)->Column#18, cast(Column#11, decimal(20,0) BINARY)->Column#19, test.t.c, test.t.a, test.t.d, test.t.d, test.t.a", + " └─HashAgg 8000.00 root group by:test.t.a, test.t.c, test.t.d, funcs:count(1)->Column#9, funcs:count(test.t.b)->Column#11, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.a)->test.t.a, funcs:firstrow(test.t.d)->test.t.d", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select d, sum(a), count(b), avg(distinct c) from t group by d", + "Plan": [ + "Projection 8000.00 root test.t.d, Column#6, cast(Column#11, bigint(21) BINARY)->Column#7, Column#8", + "└─HashAgg 8000.00 root group by:Column#20, funcs:sum(Column#16)->Column#6, funcs:sum(Column#17)->Column#11, funcs:avg(Column#18)->Column#8, funcs:firstrow(Column#19)->test.t.d", + " └─Projection 8000.00 root Column#9, cast(Column#10, decimal(20,0) BINARY)->Column#17, cast(test.t.c, decimal(15,4) BINARY)->Column#18, test.t.d, test.t.d", + " └─HashAgg 8000.00 root group by:test.t.c, test.t.d, funcs:sum(Column#12)->Column#9, funcs:count(Column#13)->Column#10, funcs:firstrow(test.t.c)->test.t.c, funcs:firstrow(test.t.d)->test.t.d", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.t.c, test.t.d, funcs:sum(test.t.a)->Column#12, funcs:count(test.t.b)->Column#13", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, { "Name": "TestMPPSinglePartitionType", "Cases": [ @@ -3078,5 +3379,86 @@ ] } ] + }, + { + "Name": "TestSemiJoinRewriteHints", + "Cases": [ + { + "SQL": "select /*+ SEMI_JOIN_REWRITE() */ * from t", + "Plan": [ + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": "[planner:1815]The SEMI_JOIN_REWRITE hint is not used correctly, maybe it's not in a subquery or the subquery is not EXISTS clause." + }, + { + "SQL": "select * from t where a > (select /*+ SEMI_JOIN_REWRITE() */ min(b) from t t1 where t1.c = t.c)", + "Plan": [ + "HashJoin 7992.00 root inner join, equal:[eq(test.t.c, test.t.c)], other cond:gt(test.t.a, Column#9)", + "├─Selection(Build) 6393.60 root not(isnull(Column#9))", + "│ └─HashAgg 7992.00 root group by:test.t.c, funcs:min(Column#10)->Column#9, funcs:firstrow(test.t.c)->test.t.c", + "│ └─TableReader 7992.00 root data:HashAgg", + "│ └─HashAgg 7992.00 cop[tikv] group by:test.t.c, funcs:min(test.t.b)->Column#10", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.c))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9980.01 root data:Selection", + " └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.c))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": "[planner:1815]The SEMI_JOIN_REWRITE hint is not used correctly, maybe it's not in a subquery or the subquery is not EXISTS clause." + }, + { + "SQL": "select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 where t1.a=t.a)", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─HashAgg(Build) 7992.00 root group by:test.t.a, funcs:firstrow(test.t.a)->test.t.a", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": "" + }, + { + "SQL": "select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ t.b from t t1 where t1.a=t.a)", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─HashAgg(Build) 7992.00 root group by:test.t.a, funcs:firstrow(test.t.a)->test.t.a", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": "" + }, + { + "SQL": "select exists(select /*+ SEMI_JOIN_REWRITE() */ * from t t1 where t1.a=t.a) from t", + "Plan": [ + "HashJoin 10000.00 root left outer semi join, equal:[eq(test.t.a, test.t.a)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": "[planner:1815]SEMI_JOIN_REWRITE() is inapplicable for LeftOuterSemiJoin." + }, + { + "SQL": "select * from t where exists (select /*+ SEMI_JOIN_REWRITE() */ 1 from t t1 where t1.a > t.a)", + "Plan": [ + "HashJoin 7992.00 root CARTESIAN semi join, other cond:gt(test.t.a, test.t.a)", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "Warning": "[planner:1815]SEMI_JOIN_REWRITE() is inapplicable for SemiJoin with left conditions or other conditions." + } + ] } ] diff --git a/planner/core/testdata/plan_suite_unexported_in.json b/planner/core/testdata/plan_suite_unexported_in.json index 8600fc0c48d0f..7c934c7be798f 100644 --- a/planner/core/testdata/plan_suite_unexported_in.json +++ b/planner/core/testdata/plan_suite_unexported_in.json @@ -137,9 +137,21 @@ "select t1.b from t t1 where t1.b = (select max(t2.a) from t t2 where t1.b=t2.b order by t1.a)", "select t1.b from t t1 where t1.b in (select t2.b from t t2 where t2.a = t1.a order by t2.a)", "select t1.b from t t1 where exists(select t2.b from t t2 where t2.a = t1.a order by t2.a)", + "select t1.b from t t1 where exists(select /*+ SEMI_JOIN_REWRITE() */ t2.b from t t2 where t2.a = t1.a order by t2.a)", + "select a from t where exists(select 1 from t as x where x.a < t.a)", + "select a from t where exists(select 1 from t as x where x.a = t.a and t.a < 1 and x.a < 1)", + "select a from t where exists(select 1 from t as x where x.a = t.a and x.a < 1) and a < 1", + "select a from t where exists(select 1 from t as x where x.a = t.a) and exists(select 1 from t as x where x.a = t.a)", + "select a from t where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a < t.a)", + "select a from t where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a = t.a and t.a < 1 and x.a < 1)", + "select a from t where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a = t.a and x.a < 1) and a < 1", + "select a from t where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a = t.a) and exists(select 1 from t as x where x.a = t.a)", + "select a from t where exists(select 1 from t as x where x.a = t.a) and exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a = t.a)", + "select a from t where exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a = t.a) and exists(select /*+ SEMI_JOIN_REWRITE() */ 1 from t as x where x.a = t.a)", // `Sort` will not be eliminated, if it is not the top level operator. "select t1.b from t t1 where t1.b = (select t2.b from t t2 where t2.a = t1.a order by t2.a limit 1)", - "select (select 1 from t t1 where t1.a = t2.a) from t t2" + "select (select 1 from t t1 where t1.a = t2.a) from t t2", + "select count(1) from (select (select count(t1.a) as a from t t1 where t1.c = t2.c) as a from t t2) as t3" ] }, { diff --git a/planner/core/testdata/plan_suite_unexported_out.json b/planner/core/testdata/plan_suite_unexported_out.json index b116b4ffdfe62..ce05997328fde 100644 --- a/planner/core/testdata/plan_suite_unexported_out.json +++ b/planner/core/testdata/plan_suite_unexported_out.json @@ -124,8 +124,20 @@ "Join{DataScan(t1)->DataScan(t2)->Aggr(max(test.t.a),firstrow(test.t.b))}(test.t.b,test.t.b)->Projection->Sel([eq(test.t.b, Column#25)])->Projection", "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)(test.t.b,test.t.b)->Projection", "Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t1)->DataScan(t2)->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection", + "Join{DataScan(t)->DataScan(x)}->Projection", + "Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->Sel([lt(test.t.a, 1)])->Projection", + "Join{Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->DataScan(x)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->DataScan(x)}->Projection", + "Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->Projection", + "Join{DataScan(t)->DataScan(x)->Sel([lt(test.t.a, 1)])->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Sel([lt(test.t.a, 1)])->Projection", + "Join{Join{DataScan(t)->DataScan(x)->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->DataScan(x)->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection", + "Join{Join{DataScan(t)->DataScan(x)}(test.t.a,test.t.a)->DataScan(x)->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection", + "Join{Join{DataScan(t)->DataScan(x)->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->DataScan(x)->Aggr(firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection", "Apply{DataScan(t1)->DataScan(t2)->Sel([eq(test.t.a, test.t.a)])->Projection->Sort->Limit}->Projection->Sel([eq(test.t.b, test.t.b)])->Projection", - "Apply{DataScan(t2)->DataScan(t1)->Sel([eq(test.t.a, test.t.a)])->Projection}->Projection" + "Apply{DataScan(t2)->DataScan(t1)->Sel([eq(test.t.a, test.t.a)])->Projection}->Projection", + "Join{DataScan(t2)->DataScan(t1)->Aggr(firstrow(test.t.c),count(1))}(test.t.c,test.t.c)->Projection->Aggr(count(1))->Projection" ] }, { diff --git a/planner/core/testdata/window_push_down_suite_in.json b/planner/core/testdata/window_push_down_suite_in.json index 3f228f5b6a476..27f12930a4cdd 100644 --- a/planner/core/testdata/window_push_down_suite_in.json +++ b/planner/core/testdata/window_push_down_suite_in.json @@ -46,7 +46,8 @@ "explain select count(distinct empid) from (select *, row_number() over () from employee) t", "explain select count(distinct empid) from (select *, row_number() over (partition by deptid) from employee) t", "explain select count(empid) from (select *, row_number() over () a from employee) t group by a", - "explain select count(empid) from (select *, row_number() over (partition by deptid) a from employee) t group by a" + "explain select count(empid) from (select *, row_number() over (partition by deptid) a from employee) t group by a", + "explain select row_number() over w2, row_number() over w1 from employee window w2 as (order by deptid), w1 as (partition by deptid);" ] } ] diff --git a/planner/core/testdata/window_push_down_suite_out.json b/planner/core/testdata/window_push_down_suite_out.json index 085d1326f3daa..742a302cab348 100644 --- a/planner/core/testdata/window_push_down_suite_out.json +++ b/planner/core/testdata/window_push_down_suite_out.json @@ -443,6 +443,24 @@ " └─TableFullScan_18 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" ], "Warn": null + }, + { + "SQL": "explain select row_number() over w2, row_number() over w1 from employee window w2 as (order by deptid), w1 as (partition by deptid);", + "Plan": [ + "TableReader_37 10000.00 root data:ExchangeSender_36", + "└─ExchangeSender_36 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Projection_10 10000.00 mpp[tiflash] Column#8, Column#7", + " └─Window_35 10000.00 mpp[tiflash] row_number()->Column#8 over(order by test.employee.deptid rows between current row and current row)", + " └─Sort_20 10000.00 mpp[tiflash] test.employee.deptid", + " └─ExchangeReceiver_19 10000.00 mpp[tiflash] ", + " └─ExchangeSender_18 10000.00 mpp[tiflash] ExchangeType: PassThrough", + " └─Window_13 10000.00 mpp[tiflash] row_number()->Column#7 over(partition by test.employee.deptid rows between current row and current row), stream_count: 8", + " └─Sort_17 10000.00 mpp[tiflash] test.employee.deptid, stream_count: 8", + " └─ExchangeReceiver_16 10000.00 mpp[tiflash] stream_count: 8", + " └─ExchangeSender_15 10000.00 mpp[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.employee.deptid, collate: binary], stream_count: 8", + " └─TableFullScan_14 10000.00 mpp[tiflash] table:employee keep order:false, stats:pseudo" + ], + "Warn": null } ] } diff --git a/planner/core/util.go b/planner/core/util.go index ccf43fc3808f7..8cbf54bab31e4 100644 --- a/planner/core/util.go +++ b/planner/core/util.go @@ -256,7 +256,26 @@ func BuildPhysicalJoinSchema(joinType JoinType, join PhysicalPlan) *expression.S return newSchema } +// GetStatsInfoFromFlatPlan gets the statistics info from a FlatPhysicalPlan. +func GetStatsInfoFromFlatPlan(flat *FlatPhysicalPlan) map[string]uint64 { + res := make(map[string]uint64) + for _, op := range flat.Main { + switch p := op.Origin.(type) { + case *PhysicalIndexScan: + if _, ok := res[p.Table.Name.O]; p.stats != nil && !ok { + res[p.Table.Name.O] = p.stats.StatsVersion + } + case *PhysicalTableScan: + if _, ok := res[p.Table.Name.O]; p.stats != nil && !ok { + res[p.Table.Name.O] = p.stats.StatsVersion + } + } + } + return res +} + // GetStatsInfo gets the statistics info from a physical plan tree. +// Deprecated: FlattenPhysicalPlan() + GetStatsInfoFromFlatPlan() is preferred. func GetStatsInfo(i interface{}) map[string]uint64 { if i == nil { // it's a workaround for https://github.com/pingcap/tidb/issues/17419 diff --git a/planner/optimize.go b/planner/optimize.go index b6e2d84781265..aa3cfe4a6f1c4 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -186,9 +186,8 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in for _, warn := range warns { sessVars.StmtCtx.AppendWarning(warn) } - if err := setFoundInBinding(sctx, true, chosenBinding.BindSQL); err != nil { - logutil.BgLogger().Warn("set tidb_found_in_binding failed", zap.Error(err)) - } + sessVars.StmtCtx.BindSQL = chosenBinding.BindSQL + sessVars.FoundInBinding = true if sessVars.StmtCtx.InVerboseExplain { sessVars.StmtCtx.AppendNote(errors.Errorf("Using the bindSQL: %v", chosenBinding.BindSQL)) } @@ -664,13 +663,6 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin return } -func setFoundInBinding(sctx sessionctx.Context, opt bool, bindSQL string) error { - vars := sctx.GetSessionVars() - vars.StmtCtx.BindSQL = bindSQL - err := vars.SetSystemVar(variable.TiDBFoundInBinding, variable.BoolToOnOff(opt)) - return err -} - func init() { plannercore.OptimizeAstNode = Optimize plannercore.IsReadOnly = IsReadOnly diff --git a/planner/util/path.go b/planner/util/path.go index 2323533300625..ad162b5592bdd 100644 --- a/planner/util/path.go +++ b/planner/util/path.go @@ -110,7 +110,7 @@ func (path *AccessPath) SplitCorColAccessCondFromFilters(ctx sessionctx.Context, // isColEqCorColOrConstant checks if the expression is a eq function that one side is constant or correlated column // and another is column. -func isColEqCorColOrConstant(ctx sessionctx.Context, filter expression.Expression, col *expression.Column) bool { +func isColEqCorColOrConstant(_ sessionctx.Context, filter expression.Expression, col *expression.Column) bool { f, ok := filter.(*expression.ScalarFunction) if !ok || f.FuncName.L != ast.EQ { return false diff --git a/privilege/privileges/privileges_test.go b/privilege/privileges/privileges_test.go index 9b159309c0795..72c0bc2573ab7 100644 --- a/privilege/privileges/privileges_test.go +++ b/privilege/privileges/privileges_test.go @@ -95,6 +95,37 @@ func TestCheckPointGetDBPrivilege(t *testing.T) { require.True(t, terror.ErrorEqual(err, core.ErrTableaccessDenied)) } +func TestCheckExchangePartitionDBPrivilege(t *testing.T) { + store, clean := createStoreAndPrepareDB(t) + defer clean() + rootTk := testkit.NewTestKit(t, store) + + rootTk.MustExec(`CREATE USER 'tester'@'localhost';`) + rootTk.MustExec(`GRANT SELECT ON test.* TO 'tester'@'localhost';`) + rootTk.MustExec("use test") + rootTk.MustExec(`create table pt (a varchar(3)) partition by range columns (a) ( + partition p0 values less than ('3'), + partition p1 values less than ('6') + );`) + rootTk.MustExec(`create table nt (a varchar(3));`) + + tk := testkit.NewTestKit(t, store) + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "tester", Hostname: "localhost"}, nil, nil)) + tk.MustExec("use test") + + rootTk.MustExec(`GRANT CREATE ON test.* TO 'tester'@'localhost';`) + tk.MustGetErrCode("alter table pt exchange partition p0 with table nt", mysql.ErrTableaccessDenied) + + rootTk.MustExec(`GRANT ALTER ON test.* TO 'tester'@'localhost';`) + tk.MustGetErrCode("alter table pt exchange partition p0 with table nt", mysql.ErrTableaccessDenied) + + rootTk.MustExec(`GRANT INSERT ON test.* TO 'tester'@'localhost';`) + tk.MustGetErrCode("alter table pt exchange partition p0 with table nt", mysql.ErrTableaccessDenied) + + rootTk.MustExec(`GRANT DROP ON test.* TO 'tester'@'localhost';`) + tk.MustExec("alter table pt exchange partition p0 with table nt") +} + func TestIssue22946(t *testing.T) { store, clean := createStoreAndPrepareDB(t) defer clean() diff --git a/server/BUILD.bazel b/server/BUILD.bazel index 1093d540550e8..894e226a1ea8d 100644 --- a/server/BUILD.bazel +++ b/server/BUILD.bazel @@ -154,6 +154,7 @@ go_test( "//metrics", "//parser", "//parser/ast", + "//parser/auth", "//parser/charset", "//parser/model", "//parser/mysql", diff --git a/server/conn.go b/server/conn.go index e5289e4fec5af..76328d27d2151 100644 --- a/server/conn.go +++ b/server/conn.go @@ -74,6 +74,7 @@ import ( "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/sessionstates" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" @@ -731,6 +732,7 @@ func (cc *clientConn) readOptionalSSLRequestAndHandshakeResponse(ctx context.Con } case mysql.AuthNativePassword: case mysql.AuthSocket: + case mysql.AuthTiDBSessionToken: default: return errors.New("Unknown auth plugin") } @@ -757,6 +759,7 @@ func (cc *clientConn) handleAuthPlugin(ctx context.Context, resp *handshakeRespo case mysql.AuthCachingSha2Password: case mysql.AuthNativePassword: case mysql.AuthSocket: + case mysql.AuthTiDBSessionToken: default: logutil.Logger(ctx).Warn("Unknown Auth Plugin", zap.String("plugin", resp.AuthPlugin)) } @@ -858,7 +861,16 @@ func (cc *clientConn) openSessionAndDoAuth(authData []byte, authPlugin string) e return errAccessDeniedNoPassword.FastGenByArgs(cc.user, host) } - if !cc.ctx.Auth(&auth.UserIdentity{Username: cc.user, Hostname: host}, authData, cc.salt) { + userIdentity := &auth.UserIdentity{Username: cc.user, Hostname: host} + if authPlugin == mysql.AuthTiDBSessionToken { + if !cc.ctx.AuthWithoutVerification(userIdentity) { + return errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) + } + if err = sessionstates.ValidateSessionToken(authData, cc.user); err != nil { + logutil.BgLogger().Warn("verify session token failed", zap.String("username", cc.user), zap.Error(err)) + return errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) + } + } else if !cc.ctx.Auth(userIdentity, authData, cc.salt) { return errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) } cc.ctx.SetPort(port) @@ -883,6 +895,10 @@ func (cc *clientConn) checkAuthPlugin(ctx context.Context, resp *handshakeRespon } authData := resp.Auth + // tidb_session_token is always permitted and skips stored user plugin. + if resp.AuthPlugin == mysql.AuthTiDBSessionToken { + return authData, nil + } hasPassword := "YES" if len(authData) == 0 { hasPassword = "NO" @@ -2411,9 +2427,7 @@ func (cc *clientConn) handleResetConnection(ctx context.Context) error { } func (cc *clientConn) handleCommonConnectionReset(ctx context.Context) error { - if plugin.IsEnable(plugin.Audit) { - cc.ctx.GetSessionVars().ConnectionInfo = cc.connectInfo() - } + cc.ctx.GetSessionVars().ConnectionInfo = cc.connectInfo() err := plugin.ForeachPlugin(plugin.Audit, func(p *plugin.Plugin) error { authPlugin := plugin.DeclareAuditManifest(p.Manifest) diff --git a/server/conn_test.go b/server/conn_test.go index f9661226ae1c3..ad2959588c840 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -18,9 +18,12 @@ import ( "bufio" "bytes" "context" + "crypto/tls" + "crypto/x509" "encoding/binary" "fmt" "io" + "path/filepath" "strings" "sync/atomic" "testing" @@ -30,6 +33,7 @@ import ( "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" + "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" @@ -37,6 +41,7 @@ import ( "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/external" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/arena" "github.com/pingcap/tidb/util/chunk" "github.com/stretchr/testify/require" @@ -829,13 +834,13 @@ func TestPrefetchPointKeys(t *testing.T) { tk.MustExec("begin pessimistic") tk.MustExec("update prefetch set c = c + 1 where a = 2 and b = 2") - require.Equal(t, 1, tk.Session().GetSessionVars().TxnCtx.PessimisticCacheHit) + require.Equal(t, 2, tk.Session().GetSessionVars().TxnCtx.PessimisticCacheHit) err = cc.handleQuery(ctx, query) require.NoError(t, err) txn, err = tk.Session().Txn(false) require.NoError(t, err) require.True(t, txn.Valid()) - require.Equal(t, 5, tk.Session().GetSessionVars().TxnCtx.PessimisticCacheHit) + require.Equal(t, 6, tk.Session().GetSessionVars().TxnCtx.PessimisticCacheHit) tk.MustExec("commit") tk.MustQuery("select * from prefetch").Check(testkit.Rows("1 1 3", "2 2 6", "3 3 5")) } @@ -1258,6 +1263,89 @@ func TestAuthPlugin2(t *testing.T) { } +func TestAuthTokenPlugin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + cfg := newTestConfig() + cfg.Port = 0 + cfg.Status.StatusPort = 0 + drv := NewTiDBDriver(store) + srv, err := NewServer(cfg, drv) + require.NoError(t, err) + ctx := context.Background() + + // create the cert + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + err = util.CreateCertificates(certPath, keyPath, 4096, x509.RSA, x509.UnknownSignatureAlgorithm) + require.NoError(t, err) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("CREATE USER auth_session_token") + tk.MustExec("CREATE USER another_user") + tk.MustExec(fmt.Sprintf("set global %s='%s'", variable.TiDBAuthSigningCert, certPath)) + tk.MustExec(fmt.Sprintf("set global %s='%s'", variable.TiDBAuthSigningKey, keyPath)) + + tc, err := drv.OpenCtx(uint64(0), 0, uint8(mysql.DefaultCollationID), "", nil) + require.NoError(t, err) + cc := &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "auth_session_token", + } + cc.setCtx(tc) + // create a token without TLS + tk1 := testkit.NewTestKitWithSession(t, store, tc.Session) + tc.Session.GetSessionVars().ConnectionInfo = cc.connectInfo() + tk1.Session().Auth(&auth.UserIdentity{Username: "auth_session_token", Hostname: "localhost"}, nil, nil) + err = tk1.QueryToErr("show session_states") + require.ErrorContains(t, err, "secure transport") + + // create a token with TLS + cc.tlsConn = &tls.Conn{} + tc.Session.GetSessionVars().ConnectionInfo = cc.connectInfo() + tk1.Session().Auth(&auth.UserIdentity{Username: "auth_session_token", Hostname: "localhost"}, nil, nil) + tk1.MustQuery("show session_states") + + // create a token with UnixSocket + cc.tlsConn = nil + cc.isUnixSocket = true + tc.Session.GetSessionVars().ConnectionInfo = cc.connectInfo() + rows := tk1.MustQuery("show session_states").Rows() + tokenBytes := []byte(rows[0][1].(string)) + + // auth with the token + resp := handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthTiDBSessionToken, + Auth: tokenBytes, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + err = cc.openSessionAndDoAuth(resp.Auth, resp.AuthPlugin) + require.NoError(t, err) + + // wrong token should fail + tokenBytes[0] ^= 0xff + err = cc.openSessionAndDoAuth(resp.Auth, resp.AuthPlugin) + require.ErrorContains(t, err, "Access denied") + tokenBytes[0] ^= 0xff + + // using the token to auth with another user should fail + cc.user = "another_user" + err = cc.openSessionAndDoAuth(resp.Auth, resp.AuthPlugin) + require.ErrorContains(t, err, "Access denied") +} + func TestMaxAllowedPacket(t *testing.T) { // Test cases from issue 31422: https://github.com/pingcap/tidb/issues/31422 // The string "SELECT length('') as len;" has 25 chars, diff --git a/server/driver_tidb.go b/server/driver_tidb.go index bd96059a30ca4..063dca0e8bf88 100644 --- a/server/driver_tidb.go +++ b/server/driver_tidb.go @@ -335,11 +335,11 @@ func (tc *TiDBContext) EncodeSessionStates(ctx context.Context, sctx sessionctx. // Bound params are sent by CMD_STMT_SEND_LONG_DATA, the proxy can wait for COM_STMT_EXECUTE. for _, boundParam := range stmt.BoundParams() { if boundParam != nil { - return session.ErrCannotMigrateSession.GenWithStackByArgs("prepared statements have bound params") + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("prepared statements have bound params") } } if rs := stmt.GetResultSet(); rs != nil && !rs.IsClosed() { - return session.ErrCannotMigrateSession.GenWithStackByArgs("prepared statements have open result sets") + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("prepared statements have open result sets") } preparedStmtInfo.ParamTypes = stmt.GetParamsType() } diff --git a/server/http_handler.go b/server/http_handler.go index 331f0206ef6dd..6c15a3c6b3ff9 100644 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -917,8 +917,7 @@ func (h flashReplicaHandler) getDropOrTruncateTableTiflash(currentSchema infosch fn := func(jobs []*model.Job) (bool, error) { return executor.GetDropOrTruncateTableInfoFromJobs(jobs, gcSafePoint, dom, handleJobAndTableInfo) } - - err = ddl.IterAllDDLJobs(txn, fn) + err = ddl.IterAllDDLJobs(s, txn, fn) if err != nil { if terror.ErrorEqual(variable.ErrSnapshotTooOld, err) { // The err indicate that current ddl job and remain DDL jobs was been deleted by GC, diff --git a/server/server.go b/server/server.go index dde54399a7cd9..bf4d7b8392019 100644 --- a/server/server.go +++ b/server/server.go @@ -49,7 +49,6 @@ import ( "github.com/blacktear23/go-proxyprotocol" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" @@ -548,9 +547,7 @@ func (s *Server) onConn(conn *clientConn) { metrics.ConnGauge.Set(float64(connections)) sessionVars := conn.ctx.GetSessionVars() - if plugin.IsEnable(plugin.Audit) { - sessionVars.ConnectionInfo = conn.connectInfo() - } + sessionVars.ConnectionInfo = conn.connectInfo() err := plugin.ForeachPlugin(plugin.Audit, func(p *plugin.Plugin) error { authPlugin := plugin.DeclareAuditManifest(p.Manifest) if authPlugin.OnConnectionEvent != nil { @@ -566,10 +563,6 @@ func (s *Server) onConn(conn *clientConn) { conn.Run(ctx) err = plugin.ForeachPlugin(plugin.Audit, func(p *plugin.Plugin) error { - // Audit plugin may be disabled before a conn is created, leading no connectionInfo in sessionVars. - if sessionVars.ConnectionInfo == nil { - sessionVars.ConnectionInfo = conn.connectInfo() - } authPlugin := plugin.DeclareAuditManifest(p.Manifest) if authPlugin.OnConnectionEvent != nil { sessionVars.ConnectionInfo.Duration = float64(time.Since(connectedTime)) / float64(time.Millisecond) @@ -586,11 +579,11 @@ func (s *Server) onConn(conn *clientConn) { } func (cc *clientConn) connectInfo() *variable.ConnectionInfo { - connType := "Socket" + connType := variable.ConnTypeSocket if cc.isUnixSocket { - connType = "UnixSocket" + connType = variable.ConnTypeUnixSocket } else if cc.tlsConn != nil { - connType = "SSL/TLS" + connType = variable.ConnTypeTLS } connInfo := &variable.ConnectionInfo{ ConnectionID: cc.connectionID, @@ -719,24 +712,6 @@ func killConn(conn *clientConn) { cancelFunc := conn.mu.cancelFunc conn.mu.RUnlock() - // If the connection being killed is a DDL Job, - // we need to CANCEL the matching jobID first. - if sessVars.StmtCtx.IsDDLJobInQueue { - jobID := sessVars.StmtCtx.DDLJobID - err := kv.RunInNewTxn(context.Background(), conn.ctx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { - // errs is the error per job, there is only one submitted - // err is the error of the overall task - errs, err := ddl.CancelJobs(txn, []int64{jobID}) - if len(errs) > 0 { - logutil.BgLogger().Warn("error canceling DDL job", zap.Error(errs[0])) - } - return err - }) - if err != nil { - logutil.BgLogger().Warn("could not cancel DDL job", zap.Error(err)) - } - } - if cancelFunc != nil { cancelFunc() } diff --git a/session/BUILD.bazel b/session/BUILD.bazel index b75f26dc03634..1ed9c0878f038 100644 --- a/session/BUILD.bazel +++ b/session/BUILD.bazel @@ -17,6 +17,7 @@ go_library( deps = [ "//bindinfo", "//config", + "//ddl", "//ddl/placement", "//domain", "//errno", @@ -111,6 +112,7 @@ go_test( "nontransactional_test.go", "schema_amender_test.go", "schema_test.go", + "session_test.go", "tidb_test.go", ], data = glob(["testdata/**"]), @@ -140,6 +142,7 @@ go_test( "//table", "//tablecodec", "//testkit", + "//testkit/external", "//testkit/testdata", "//testkit/testmain", "//testkit/testsetup", diff --git a/session/bootstrap.go b/session/bootstrap.go index e9db7a08c3ed7..6248f36d28a26 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -620,11 +620,13 @@ const ( version90 = 90 // version91 converts prepared-plan-cache to sysvars version91 = 91 + // version92 for concurrent ddl. + version92 = 92 ) // 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 = version91 +var currentBootstrapVersion int64 = version92 var ( bootstrapVersion = []func(Session, int64){ @@ -785,15 +787,27 @@ func upgrade(s Session) { // It is already bootstrapped/upgraded by a higher version TiDB server. return } + // Only upgrade from under version92 and this TiDB is not owner set. + // The owner in older tidb does not support concurrent DDL, we should add the internal DDL to job queue. + original := variable.EnableConcurrentDDL.Load() + if ver < version92 && !domain.GetDomain(s).DDL().OwnerManager().IsOwner() { + variable.EnableConcurrentDDL.Store(false) + } // Do upgrade works then update bootstrap version. for _, upgrade := range bootstrapVersion { upgrade(s, ver) } + variable.EnableConcurrentDDL.Store(original) updateBootstrapVer(s) ctx := kv.WithInternalSourceType(context.Background(), kv.InternalTxnBootstrap) _, err = s.ExecuteInternal(ctx, "COMMIT") + if err == nil && ver <= version92 { + logutil.BgLogger().Info("start migrate DDLs") + err = domain.GetDomain(s).DDL().MoveJobFromQueue2Table(true) + } + if err != nil { sleepTime := 1 * time.Second logutil.BgLogger().Info("update bootstrap ver failed", @@ -2030,10 +2044,6 @@ func doDMLWorks(s Session) { if inTestSuite() || config.CheckTableBeforeDrop { vVal = string(variable.Dynamic) } - case variable.TiDBEnableChangeMultiSchema: - if inTestSuite() { - vVal = variable.On - } case variable.TiDBMemOOMAction: if inTestSuite() { vVal = variable.OOMActionLog diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index 6b56501d2b2eb..1f8b0b8a20700 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -146,14 +146,14 @@ func TestBootstrapWithError(t *testing.T) { se.txn.init() se.mu.values = make(map[fmt.Stringer]interface{}) se.SetValue(sessionctx.Initing, true) - + err := InitDDLJobTables(store) + require.NoError(t, err) dom, err := domap.Get(store) require.NoError(t, err) domain.BindDomain(se, dom) b, err := checkBootstrapped(se) require.False(t, b) require.NoError(t, err) - doDDLWorks(se) } @@ -443,8 +443,7 @@ func TestOldPasswordUpgrade(t *testing.T) { } func TestBootstrapInitExpensiveQueryHandle(t *testing.T) { - store, err := mockstore.NewMockStore() - require.NoError(t, err) + store, _ := createStoreAndBootstrap(t) defer func() { require.NoError(t, store.Close()) }() diff --git a/session/session.go b/session/session.go index e751d9443e458..594d57af20e97 100644 --- a/session/session.go +++ b/session/session.go @@ -43,6 +43,7 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -102,7 +103,6 @@ import ( tikverr "github.com/tikv/client-go/v2/error" tikvstore "github.com/tikv/client-go/v2/kv" "github.com/tikv/client-go/v2/oracle" - "github.com/tikv/client-go/v2/tikv" tikvutil "github.com/tikv/client-go/v2/util" "go.uber.org/zap" ) @@ -448,13 +448,16 @@ func (s *session) StoreQueryFeedback(feedback interface{}) { } } -func (s *session) UpdateColStatsUsage(predicateColumns []model.TableColumnID) { +func (s *session) UpdateColStatsUsage(predicateColumns []model.TableItemID) { if s.statsCollector == nil { return } t := time.Now() - colMap := make(map[model.TableColumnID]time.Time, len(predicateColumns)) + colMap := make(map[model.TableItemID]time.Time, len(predicateColumns)) for _, col := range predicateColumns { + if col.IsIndex { + continue + } colMap[col] = t } s.statsCollector.UpdateColStatsUsage(colMap) @@ -1757,6 +1760,10 @@ func (s *session) useCurrentSession(execOption sqlexec.ExecOption) (*session, fu if execOption.AnalyzeVer != 0 { s.sessionVars.AnalyzeVersion = execOption.AnalyzeVer } + prevAnalyzeSnapshot := s.sessionVars.EnableAnalyzeSnapshot + if execOption.AnalyzeSnapshot != nil { + s.sessionVars.EnableAnalyzeSnapshot = *execOption.AnalyzeSnapshot + } prePruneMode := s.sessionVars.PartitionPruneMode.Load() if len(execOption.PartitionPruneMode) > 0 { s.sessionVars.PartitionPruneMode.Store(execOption.PartitionPruneMode) @@ -1766,6 +1773,7 @@ func (s *session) useCurrentSession(execOption sqlexec.ExecOption) (*session, fu prevTables := s.sessionVars.StmtCtx.Tables return s, func() { s.sessionVars.AnalyzeVersion = prevStatsVer + s.sessionVars.EnableAnalyzeSnapshot = prevAnalyzeSnapshot if err := s.sessionVars.SetSystemVar(variable.TiDBSnapshot, ""); err != nil { logutil.BgLogger().Error("set tidbSnapshot error", zap.Error(err)) } @@ -1809,6 +1817,11 @@ func (s *session) getInternalSession(execOption sqlexec.ExecOption) (*session, f se.sessionVars.AnalyzeVersion = execOption.AnalyzeVer } + prevAnalyzeSnapshot := se.sessionVars.EnableAnalyzeSnapshot + if execOption.AnalyzeSnapshot != nil { + se.sessionVars.EnableAnalyzeSnapshot = *execOption.AnalyzeSnapshot + } + prePruneMode := se.sessionVars.PartitionPruneMode.Load() if len(execOption.PartitionPruneMode) > 0 { se.sessionVars.PartitionPruneMode.Store(execOption.PartitionPruneMode) @@ -1816,6 +1829,7 @@ func (s *session) getInternalSession(execOption sqlexec.ExecOption) (*session, f return se, func() { se.sessionVars.AnalyzeVersion = prevStatsVer + se.sessionVars.EnableAnalyzeSnapshot = prevAnalyzeSnapshot if err := se.sessionVars.SetSystemVar(variable.TiDBSnapshot, ""); err != nil { logutil.BgLogger().Error("set tidbSnapshot error", zap.Error(err)) } @@ -1956,7 +1970,10 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex // Only print log message when this SQL is from the user. // Mute the warning for internal SQLs. if !s.sessionVars.InRestrictedSQL { - logutil.Logger(ctx).Warn("compile SQL failed", zap.Error(err), zap.String("SQL", stmtNode.Text())) + if !variable.ErrUnknownSystemVar.Equal(err) { + logutil.Logger(ctx).Warn("compile SQL failed", zap.Error(err), + zap.String("SQL", stmtNode.Text())) + } } return nil, err } @@ -2307,6 +2324,7 @@ func (s *session) cachedPointPlanExec(ctx context.Context, stmt.Text = prepared.Stmt.Text() stmtCtx.OriginalSQL = stmt.Text + stmtCtx.SetPlan(execPlan) stmtCtx.InitSQLDigest(prepareStmt.NormalizedSQL, prepareStmt.SQLDigest) stmtCtx.SetPlanDigest(prepareStmt.NormalizedPlan, prepareStmt.PlanDigest) logGeneralQuery(stmt, s, false) @@ -2460,19 +2478,6 @@ func (s *session) DropPreparedStmt(stmtID uint32) error { return nil } -// setTxnAssertionLevel sets assertion level of a transactin. Note that assertion level should be set only once just -// after creating a new transaction. -func setTxnAssertionLevel(txn kv.Transaction, assertionLevel variable.AssertionLevel) { - switch assertionLevel { - case variable.AssertionLevelOff: - txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Off) - case variable.AssertionLevelFast: - txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Fast) - case variable.AssertionLevelStrict: - txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Strict) - } -} - func (s *session) Txn(active bool) (kv.Transaction, error) { if !active { return &s.txn, nil @@ -2481,91 +2486,6 @@ func (s *session) Txn(active bool) (kv.Transaction, error) { return &s.txn, err } -func (s *session) NewTxn(ctx context.Context) error { - if err := s.checkBeforeNewTxn(ctx); err != nil { - return err - } - txn, err := s.store.Begin(tikv.WithTxnScope(s.sessionVars.CheckAndGetTxnScope())) - if err != nil { - return err - } - txn.SetVars(s.sessionVars.KVVars) - replicaReadType := s.GetSessionVars().GetReplicaRead() - if replicaReadType.IsFollowerRead() { - txn.SetOption(kv.ReplicaRead, replicaReadType) - } - setTxnAssertionLevel(txn, s.sessionVars.AssertionLevel) - s.txn.changeInvalidToValid(txn) - is := s.GetDomainInfoSchema() - s.sessionVars.TxnCtx = &variable.TransactionContext{ - TxnCtxNoNeedToRestore: variable.TxnCtxNoNeedToRestore{ - InfoSchema: is, - CreateTime: time.Now(), - StartTS: txn.StartTS(), - ShardStep: int(s.sessionVars.ShardAllocateStep), - IsStaleness: false, - TxnScope: s.sessionVars.CheckAndGetTxnScope(), - }, - } - s.txn.SetOption(kv.SnapInterceptor, s.getSnapshotInterceptor()) - if s.GetSessionVars().InRestrictedSQL { - s.txn.SetOption(kv.RequestSourceInternal, true) - if source := ctx.Value(kv.RequestSourceKey); source != nil { - s.txn.SetOption(kv.RequestSourceType, source.(kv.RequestSource).RequestSourceType) - } - } - return nil -} - -func (s *session) checkBeforeNewTxn(ctx context.Context) error { - if s.txn.Valid() { - txnStartTS := s.txn.StartTS() - txnScope := s.GetSessionVars().TxnCtx.TxnScope - err := s.CommitTxn(ctx) - if err != nil { - return err - } - logutil.Logger(ctx).Info("Try to create a new txn inside a transaction auto commit", - zap.Int64("schemaVersion", s.GetInfoSchema().SchemaMetaVersion()), - zap.Uint64("txnStartTS", txnStartTS), - zap.String("txnScope", txnScope)) - } - return nil -} - -// NewStaleTxnWithStartTS create a transaction with the given StartTS. -func (s *session) NewStaleTxnWithStartTS(ctx context.Context, startTS uint64) error { - if err := s.checkBeforeNewTxn(ctx); err != nil { - return err - } - txnScope := kv.GlobalTxnScope - txn, err := s.store.Begin(tikv.WithTxnScope(txnScope), tikv.WithStartTS(startTS)) - if err != nil { - return err - } - txn.SetVars(s.sessionVars.KVVars) - txn.SetOption(kv.IsStalenessReadOnly, true) - txn.SetOption(kv.TxnScope, txnScope) - setTxnAssertionLevel(txn, s.sessionVars.AssertionLevel) - s.txn.changeInvalidToValid(txn) - is, err := getSnapshotInfoSchema(s, txn.StartTS()) - if err != nil { - return errors.Trace(err) - } - s.sessionVars.TxnCtx = &variable.TransactionContext{ - TxnCtxNoNeedToRestore: variable.TxnCtxNoNeedToRestore{ - InfoSchema: is, - CreateTime: time.Now(), - StartTS: txn.StartTS(), - ShardStep: int(s.sessionVars.ShardAllocateStep), - IsStaleness: true, - TxnScope: txnScope, - }, - } - s.txn.SetOption(kv.SnapInterceptor, s.getSnapshotInterceptor()) - return nil -} - func (s *session) SetValue(key fmt.Stringer, value interface{}) { s.mu.Lock() s.mu.values[key] = value @@ -2736,6 +2656,8 @@ func CreateSession4TestWithOpt(store kv.Storage, opt *Opt) (Session, error) { // initialize session variables for test. s.GetSessionVars().InitChunkSize = 2 s.GetSessionVars().MaxChunkSize = 32 + s.GetSessionVars().MinPagingSize = variable.DefMinPagingSize + s.GetSessionVars().EnablePaging = variable.DefTiDBEnablePaging err = s.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, "utf8mb4") } return s, err @@ -2793,7 +2715,62 @@ func loadCollationParameter(ctx context.Context, se *session) (bool, error) { return false, nil } -var errResultIsEmpty = dbterror.ClassExecutor.NewStd(errno.ErrResultIsEmpty) +var ( + errResultIsEmpty = dbterror.ClassExecutor.NewStd(errno.ErrResultIsEmpty) + // DDLJobTables is a list of tables definitions used in concurrent DDL. + DDLJobTables = []struct { + SQL string + id int64 + }{ + {"create table tidb_ddl_job(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))", ddl.JobTableID}, + {"create table tidb_ddl_reorg(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)))", ddl.ReorgTableID}, + {"create table tidb_ddl_history(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))", ddl.HistoryTableID}, + } +) + +// InitDDLJobTables is to create tidb_ddl_job, tidb_ddl_reorg and tidb_ddl_history. +func InitDDLJobTables(store kv.Storage) error { + return kv.RunInNewTxn(kv.WithInternalSourceType(context.Background(), kv.InternalTxnDDL), store, true, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + exists, err := t.CheckDDLTableExists() + if err != nil || exists { + return errors.Trace(err) + } + dbID, err := t.CreateMySQLDatabaseIfNotExists() + if err != nil { + return err + } + p := parser.New() + for _, tbl := range DDLJobTables { + id, err := t.GetGlobalID() + if err != nil { + return errors.Trace(err) + } + if id >= meta.MaxGlobalID { + return errors.Errorf("It is unreasonable that the global ID grows such a big value: %d, please concat TiDB team", id) + } + stmt, err := p.ParseOneStmt(tbl.SQL, "", "") + if err != nil { + return errors.Trace(err) + } + tblInfo, err := ddl.BuildTableInfoFromAST(stmt.(*ast.CreateTableStmt)) + if err != nil { + return errors.Trace(err) + } + tblInfo.State = model.StatePublic + tblInfo.ID = tbl.id + tblInfo.UpdateTS = t.StartTS + if err != nil { + return errors.Trace(err) + } + err = t.CreateTableOrView(dbID, tblInfo) + if err != nil { + return errors.Trace(err) + } + } + return t.SetDDLTables() + }) +} // BootstrapSession runs the first time when the TiDB server start. func BootstrapSession(store kv.Storage) (*domain.Domain, error) { @@ -2808,6 +2785,10 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { return nil, err } } + err := InitDDLJobTables(store) + if err != nil { + return nil, err + } ver := getStoreBootstrapVersion(store) if ver == notBootstrapped { runInBootstrapSession(store, bootstrap) @@ -2896,6 +2877,7 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { } dom.DumpFileGcCheckerLoop() + dom.LoadSigningCertLoop() if raw, ok := store.(kv.EtcdBackend); ok { err = raw.StartGCWorker() @@ -3137,7 +3119,9 @@ func (s *session) PrepareTSFuture(ctx context.Context, future oracle.Future, sco } failpoint.Inject("assertTSONotRequest", func() { - panic("tso shouldn't be requested") + if _, ok := future.(sessiontxn.ConstantFuture); !ok { + panic("tso shouldn't be requested") + } }) failpoint.InjectContext(ctx, "mockGetTSFail", func() { @@ -3152,6 +3136,8 @@ func (s *session) PrepareTSFuture(ctx context.Context, future oracle.Future, sco return nil } +// GetPreparedTxnFuture returns the TxnFuture if it is valid or pending. +// It returns nil otherwise. func (s *session) GetPreparedTxnFuture() sessionctx.TxnFuture { if !s.txn.validOrPending() { return nil @@ -3448,10 +3434,6 @@ func (s *session) BuiltinFunctionUsageInc(scalarFuncSigName string) { s.functionUsageMu.builtinFunctionUsage.Inc(scalarFuncSigName) } -func (s *session) getSnapshotInterceptor() kv.SnapshotInterceptor { - return temptable.SessionSnapshotInterceptor(s) -} - func (s *session) GetStmtStats() *stmtstats.StatementStats { return s.stmtStats } @@ -3463,23 +3445,23 @@ func (s *session) EncodeSessionStates(ctx context.Context, sctx sessionctx.Conte valid := s.txn.Valid() s.txn.mu.Unlock() if valid { - return ErrCannotMigrateSession.GenWithStackByArgs("session has an active transaction") + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("session has an active transaction") } // Data in local temporary tables is hard to encode, so we do not support it. // Check temporary tables here to avoid circle dependency. if s.sessionVars.LocalTemporaryTables != nil { localTempTables := s.sessionVars.LocalTemporaryTables.(*infoschema.LocalTemporaryTables) if localTempTables.Count() > 0 { - return ErrCannotMigrateSession.GenWithStackByArgs("session has local temporary tables") + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("session has local temporary tables") } } // The advisory locks will be released when the session is closed. if len(s.advisoryLocks) > 0 { - return ErrCannotMigrateSession.GenWithStackByArgs("session has advisory locks") + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("session has advisory locks") } // The TableInfo stores session ID and server ID, so the session cannot be migrated. if len(s.lockedTables) > 0 { - return ErrCannotMigrateSession.GenWithStackByArgs("session has locked tables") + return sessionstates.ErrCannotMigrateSession.GenWithStackByArgs("session has locked tables") } if err := s.sessionVars.EncodeSessionStates(ctx, sessionStates); err != nil { diff --git a/session/session_test.go b/session/session_test.go new file mode 100644 index 0000000000000..9901376dd3b9c --- /dev/null +++ b/session/session_test.go @@ -0,0 +1,54 @@ +// 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 session_test + +import ( + "reflect" + "testing" + + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/external" + "github.com/stretchr/testify/require" +) + +func TestInitMetaTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + for _, sql := range session.DDLJobTables { + tk.MustExec(sql.SQL) + } + + tbls := map[string]struct{}{ + "tidb_ddl_job": {}, + "tidb_ddl_reorg": {}, + "tidb_ddl_history": {}, + } + + for tbl := range tbls { + metaInMySQL := external.GetTableByName(t, tk, "mysql", tbl).Meta() + metaInTest := external.GetTableByName(t, tk, "test", tbl).Meta() + + require.Greater(t, metaInMySQL.ID, int64(0)) + require.Greater(t, metaInMySQL.UpdateTS, uint64(0)) + + metaInTest.ID = metaInMySQL.ID + metaInMySQL.UpdateTS = metaInTest.UpdateTS + require.True(t, reflect.DeepEqual(metaInMySQL, metaInTest)) + } +} diff --git a/session/tidb.go b/session/tidb.go index d0530488b5b3f..12ee40da2d4be 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -378,6 +378,5 @@ func ResultSetToStringSlice(ctx context.Context, s Session, rs sqlexec.RecordSet // Session errors. var ( - ErrForUpdateCantRetry = dbterror.ClassSession.NewStd(errno.ErrForUpdateCantRetry) - ErrCannotMigrateSession = dbterror.ClassSession.NewStd(errno.ErrCannotMigrateSession) + ErrForUpdateCantRetry = dbterror.ClassSession.NewStd(errno.ErrForUpdateCantRetry) ) diff --git a/session/txn.go b/session/txn.go index 94227d2cf8209..cdb1339ddac43 100644 --- a/session/txn.go +++ b/session/txn.go @@ -240,22 +240,6 @@ func (txn *LazyTxn) GetOption(opt int) interface{} { return txn.Transaction.GetOption(opt) } -func (txn *LazyTxn) changeInvalidToValid(kvTxn kv.Transaction) { - txn.Transaction = kvTxn - txn.initStmtBuf() - txn.txnFuture = nil - - txn.mu.Lock() - defer txn.mu.Unlock() - txn.resetTxnInfo( - kvTxn.StartTS(), - txninfo.TxnIdle, - uint64(txn.Transaction.Len()), - uint64(txn.Transaction.Size()), - "", - nil) -} - func (txn *LazyTxn) changeToPending(future *txnFuture) { txn.Transaction = nil txn.txnFuture = future diff --git a/sessionctx/context.go b/sessionctx/context.go index 21b89ae72a351..d5f6279207738 100644 --- a/sessionctx/context.go +++ b/sessionctx/context.go @@ -53,12 +53,6 @@ type SessionStatesHandler interface { // Context is an interface for transaction and executive args environment. type Context interface { SessionStatesHandler - // NewTxn creates a new transaction for further execution. - // If old transaction is valid, it is committed first. - // It's used in BEGIN statement and DDL statements to commit old transaction. - NewTxn(context.Context) error - // NewStaleTxnWithStartTS initializes a staleness transaction with the given StartTS. - NewStaleTxnWithStartTS(ctx context.Context, startTS uint64) error // SetDiskFullOpt set the disk full opt when tikv disk full happened. SetDiskFullOpt(level kvrpcpb.DiskFullOpt) // RollbackTxn rolls back the current transaction. @@ -120,7 +114,7 @@ type Context interface { // UpdateColStatsUsage updates the column stats usage. // TODO: maybe we can use a method called GetSessionStatsCollector to replace both StoreQueryFeedback and UpdateColStatsUsage but we need to deal with import circle if we do so. - UpdateColStatsUsage(predicateColumns []model.TableColumnID) + UpdateColStatsUsage(predicateColumns []model.TableItemID) // HasDirtyContent checks whether there's dirty update on the given table. HasDirtyContent(tid int64) bool @@ -149,7 +143,8 @@ type Context interface { HasLockedTables() bool // PrepareTSFuture uses to prepare timestamp by future. PrepareTSFuture(ctx context.Context, future oracle.Future, scope string) error - // GetPreparedTxnFuture returns the prepared ts future + // GetPreparedTxnFuture returns the TxnFuture if it is valid or pending. + // It returns nil otherwise. GetPreparedTxnFuture() TxnFuture // StoreIndexUsage stores the index usage information. StoreIndexUsage(tblID int64, idxID int64, rowsSelected int64) diff --git a/sessionctx/sessionstates/BUILD.bazel b/sessionctx/sessionstates/BUILD.bazel index 1cd0a6c172cc2..d63cbbdd1b698 100644 --- a/sessionctx/sessionstates/BUILD.bazel +++ b/sessionctx/sessionstates/BUILD.bazel @@ -2,20 +2,34 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "sessionstates", - srcs = ["session_states.go"], + srcs = [ + "session_states.go", + "session_token.go", + ], importpath = "github.com/pingcap/tidb/sessionctx/sessionstates", visibility = ["//visibility:public"], deps = [ + "//errno", "//parser/types", "//sessionctx/stmtctx", "//types", + "//util/dbterror", + "//util/logutil", + "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", + "@org_uber_go_zap//:zap", ], ) go_test( name = "sessionstates_test", timeout = "short", - srcs = ["session_states_test.go"], + srcs = [ + "session_states_test.go", + "session_token_test.go", + ], + embed = [":sessionstates"], + race = "on", deps = [ "//config", "//errno", @@ -25,8 +39,10 @@ go_test( "//sessionctx/variable", "//testkit", "//types", + "//util", "//util/sem", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", ], ) diff --git a/sessionctx/sessionstates/session_states.go b/sessionctx/sessionstates/session_states.go index a9636e2f90014..36ea0b22455d7 100644 --- a/sessionctx/sessionstates/session_states.go +++ b/sessionctx/sessionstates/session_states.go @@ -17,14 +17,21 @@ package sessionstates import ( "time" + "github.com/pingcap/tidb/errno" ptypes "github.com/pingcap/tidb/parser/types" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/dbterror" ) // SessionStateType is the type of session states. type SessionStateType int +var ( + // ErrCannotMigrateSession indicates the session cannot be migrated. + ErrCannotMigrateSession = dbterror.ClassSession.NewStd(errno.ErrCannotMigrateSession) +) + // These enums represents the types of session state handlers. const ( // StatePrepareStmt represents prepared statements. diff --git a/sessionctx/sessionstates/session_token.go b/sessionctx/sessionstates/session_token.go new file mode 100644 index 0000000000000..4faa6eae7f41b --- /dev/null +++ b/sessionctx/sessionstates/session_token.go @@ -0,0 +1,338 @@ +// 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 sessionstates + +import ( + "crypto" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/sha512" + "crypto/tls" + "crypto/x509" + "encoding/json" + "strings" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +// Token-based authentication is used in session migration. We don't use typical authentication because the proxy +// cannot store the user passwords for security issues. +// +// The process of token-based authentication: +// 1. Before migrating the session, the proxy requires a token from server A. +// 2. Server A generates a token and signs it with a private key defined in the certificate. +// 3. The proxy authenticates with server B and sends the signed token as the password. +// 4. Server B checks the signature with the public key defined in the certificate and then verifies the token. +// +// The highlight is that the certificates on all the servers should be the same all the time. +// However, the certificates should be rotated periodically. Just in case of using different certificates to +// sign and check, a server should keep the old certificate for a while. A server will try both +// the 2 certificates to check the signature. +const ( + // A token needs a lifetime to avoid brute force attack. + tokenLifetime = time.Minute + // LoadCertInterval is the interval of reloading the certificate. The certificate should be rotated periodically. + LoadCertInterval = 10 * time.Minute + // After a certificate is replaced, it's still valid for oldCertValidTime. + // oldCertValidTime must be a little longer than LoadCertInterval, because the previous server may + // sign with the old cert but the new server checks with the new cert. + // - server A loads the old cert at 00:00:00. + // - the cert is rotated at 00:00:01 on all servers. + // - server B loads the new cert at 00:00:02. + // - server A signs token with the old cert at 00:10:00. + // - server B reloads the same new cert again at 00:10:01, and it has 3 certs now. + // - server B receives the token at 00:10:02, so the old cert should be valid for more than 10m after replacement. + oldCertValidTime = 15 * time.Minute +) + +// SessionToken represents the token used to authenticate with the new server. +type SessionToken struct { + Username string `json:"username"` + SignTime time.Time `json:"sign-time"` + ExpireTime time.Time `json:"expire-time"` + Signature []byte `json:"signature,omitempty"` +} + +// CreateSessionToken creates a token for the proxy. +func CreateSessionToken(username string) (*SessionToken, error) { + now := getNow() + token := &SessionToken{ + Username: username, + SignTime: now, + ExpireTime: now.Add(tokenLifetime), + } + tokenBytes, err := json.Marshal(token) + if err != nil { + return nil, errors.Trace(err) + } + if token.Signature, err = globalSigningCert.sign(tokenBytes); err != nil { + return nil, ErrCannotMigrateSession.GenWithStackByArgs(err.Error()) + } + return token, nil +} + +// ValidateSessionToken validates the token sent from the proxy. +func ValidateSessionToken(tokenBytes []byte, username string) (err error) { + var token SessionToken + if err = json.Unmarshal(tokenBytes, &token); err != nil { + return errors.Trace(err) + } + signature := token.Signature + // Clear the signature and marshal it again to get the original content. + token.Signature = nil + if tokenBytes, err = json.Marshal(token); err != nil { + return errors.Trace(err) + } + if err = globalSigningCert.checkSignature(tokenBytes, signature); err != nil { + return ErrCannotMigrateSession.GenWithStackByArgs(err.Error()) + } + now := getNow() + if now.After(token.ExpireTime) { + return ErrCannotMigrateSession.GenWithStackByArgs("token expired", token.ExpireTime.String()) + } + // An attacker may forge a very long lifetime to brute force, so we also need to check `SignTime`. + // However, we need to be tolerant of these problems: + // - The `tokenLifetime` may change between TiDB versions, so we can't check `token.SignTime.Add(tokenLifetime).Equal(token.ExpireTime)` + // - There may exist time bias between TiDB instances, so we can't check `now.After(token.SignTime)` + if token.SignTime.Add(tokenLifetime).Before(now) { + return ErrCannotMigrateSession.GenWithStackByArgs("token lifetime is too long", token.SignTime.String()) + } + if !strings.EqualFold(username, token.Username) { + return ErrCannotMigrateSession.GenWithStackByArgs("username does not match", username, token.Username) + } + return nil +} + +// SetKeyPath sets the path of key.pem and force load the certificate again. +func SetKeyPath(keyPath string) { + globalSigningCert.setKeyPath(keyPath) +} + +// SetCertPath sets the path of key.pem and force load the certificate again. +func SetCertPath(certPath string) { + globalSigningCert.setCertPath(certPath) +} + +// ReloadSigningCert is used to load the certificate periodically in a separate goroutine. +// It's impossible to know when the old certificate should expire without this goroutine: +// - If the certificate is rotated a minute ago, the old certificate should be still valid for a while. +// - If the certificate is rotated a month ago, the old certificate should expire for safety. +func ReloadSigningCert() { + globalSigningCert.lockAndLoad() +} + +var globalSigningCert signingCert + +// signingCert represents the parsed certificate used for token-based auth. +type signingCert struct { + sync.RWMutex + certPath string + keyPath string + // The cert file may happen to be rotated between signing and checking, so we keep the old cert for a while. + // certs contain all the certificates that are not expired yet. + certs []*certInfo +} + +type certInfo struct { + cert *x509.Certificate + privKey crypto.PrivateKey + expireTime time.Time +} + +// We cannot guarantee that the cert and key paths are set at the same time because they are set through system variables. +func (sc *signingCert) setCertPath(certPath string) { + sc.Lock() + // Just in case of repeatedly loading global variables, we check the path to avoid useless loading. + if certPath != sc.certPath { + sc.certPath = certPath + // It may fail expectedly because the key path is not set yet. + sc.checkAndLoadCert() + } + sc.Unlock() +} + +func (sc *signingCert) setKeyPath(keyPath string) { + sc.Lock() + if keyPath != sc.keyPath { + sc.keyPath = keyPath + // It may fail expectedly because the cert path is not set yet. + sc.checkAndLoadCert() + } + sc.Unlock() +} + +func (sc *signingCert) lockAndLoad() { + sc.Lock() + sc.checkAndLoadCert() + sc.Unlock() +} + +func (sc *signingCert) checkAndLoadCert() { + if len(sc.certPath) == 0 || len(sc.keyPath) == 0 { + return + } + if err := sc.loadCert(); err != nil { + logutil.BgLogger().Warn("loading signing cert failed", + zap.String("cert path", sc.certPath), + zap.String("key path", sc.keyPath), + zap.Error(err)) + } else { + logutil.BgLogger().Info("signing cert is loaded successfully", + zap.String("cert path", sc.certPath), + zap.String("key path", sc.keyPath)) + } +} + +// loadCert loads the cert and adds it into the cert list. +func (sc *signingCert) loadCert() error { + tlsCert, err := tls.LoadX509KeyPair(sc.certPath, sc.keyPath) + if err != nil { + return errors.Wrapf(err, "load x509 failed, cert path: %s, key path: %s", sc.certPath, sc.keyPath) + } + var cert *x509.Certificate + if tlsCert.Leaf != nil { + cert = tlsCert.Leaf + } else { + if cert, err = x509.ParseCertificate(tlsCert.Certificate[0]); err != nil { + return errors.Wrapf(err, "parse x509 cert failed, cert path: %s, key path: %s", sc.certPath, sc.keyPath) + } + } + + // Rotate certs. Ensure that the expireTime of certs is in descending order. + now := getNow() + newCerts := make([]*certInfo, 0, len(sc.certs)+1) + newCerts = append(newCerts, &certInfo{ + cert: cert, + privKey: tlsCert.PrivateKey, + expireTime: now.Add(LoadCertInterval + oldCertValidTime), + }) + for i := 0; i < len(sc.certs); i++ { + // Discard the certs that are already expired. + if now.After(sc.certs[i].expireTime) { + break + } + newCerts = append(newCerts, sc.certs[i]) + } + sc.certs = newCerts + return nil +} + +// sign generates a signature with the content and the private key. +func (sc *signingCert) sign(content []byte) ([]byte, error) { + var ( + signer crypto.Signer + opts crypto.SignerOpts + ) + sc.RLock() + defer sc.RUnlock() + if len(sc.certs) == 0 { + return nil, errors.New("no certificate or key file to sign the data") + } + // Always sign the token with the latest cert. + certInfo := sc.certs[0] + switch key := certInfo.privKey.(type) { + case ed25519.PrivateKey: + signer = key + opts = crypto.Hash(0) + case *rsa.PrivateKey: + signer = key + var pssHash crypto.Hash + switch certInfo.cert.SignatureAlgorithm { + case x509.SHA256WithRSAPSS: + pssHash = crypto.SHA256 + case x509.SHA384WithRSAPSS: + pssHash = crypto.SHA384 + case x509.SHA512WithRSAPSS: + pssHash = crypto.SHA512 + } + if pssHash != 0 { + h := pssHash.New() + h.Write(content) + content = h.Sum(nil) + opts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: pssHash} + break + } + switch certInfo.cert.SignatureAlgorithm { + case x509.SHA256WithRSA: + hashed := sha256.Sum256(content) + content = hashed[:] + opts = crypto.SHA256 + case x509.SHA384WithRSA: + hashed := sha512.Sum384(content) + content = hashed[:] + opts = crypto.SHA384 + case x509.SHA512WithRSA: + hashed := sha512.Sum512(content) + content = hashed[:] + opts = crypto.SHA512 + default: + return nil, errors.Errorf("not supported private key type '%s' for signing", certInfo.cert.SignatureAlgorithm.String()) + } + case *ecdsa.PrivateKey: + signer = key + default: + return nil, errors.Errorf("not supported private key type '%s' for signing", certInfo.cert.SignatureAlgorithm.String()) + } + return signer.Sign(rand.Reader, content, opts) +} + +// checkSignature checks the signature and the content. +func (sc *signingCert) checkSignature(content, signature []byte) error { + sc.RLock() + defer sc.RUnlock() + now := getNow() + var err error + for _, certInfo := range sc.certs { + // The expireTime is in descending order. So if the first one is expired, we skip the following. + if now.After(certInfo.expireTime) { + break + } + switch certInfo.privKey.(type) { + // ESDSA is special: `PrivateKey.Sign` doesn't match with `Certificate.CheckSignature`. + case *ecdsa.PrivateKey: + if !ecdsa.VerifyASN1(certInfo.cert.PublicKey.(*ecdsa.PublicKey), content, signature) { + err = errors.New("x509: ECDSA verification failure") + } + default: + err = certInfo.cert.CheckSignature(certInfo.cert.SignatureAlgorithm, content, signature) + } + if err == nil { + return nil + } + } + // no certs (possible) or all certs are expired (impossible) + if err == nil { + return errors.Errorf("no valid certificate to check the signature, cached certificates: %d", len(sc.certs)) + } + return err +} + +func getNow() time.Time { + now := time.Now() + failpoint.Inject("mockNowOffset", func(val failpoint.Value) { + if s := uint64(val.(int)); s != 0 { + now = now.Add(time.Duration(s)) + } + }) + return now +} diff --git a/sessionctx/sessionstates/session_token_test.go b/sessionctx/sessionstates/session_token_test.go new file mode 100644 index 0000000000000..d09cb4e5ffc82 --- /dev/null +++ b/sessionctx/sessionstates/session_token_test.go @@ -0,0 +1,267 @@ +// 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 sessionstates + +import ( + "crypto/x509" + "encoding/json" + "fmt" + "path/filepath" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/util" + "github.com/stretchr/testify/require" +) + +var ( + mockNowOffset = "github.com/pingcap/tidb/sessionctx/sessionstates/mockNowOffset" +) + +func TestSetCertAndKey(t *testing.T) { + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + createRSACert(t, certPath, keyPath) + + // no cert and no key + _, err := CreateSessionToken("test_user") + require.ErrorContains(t, err, "no certificate or key file") + // no cert + SetKeyPath(keyPath) + _, err = CreateSessionToken("test_user") + require.ErrorContains(t, err, "no certificate or key file") + // no key + SetKeyPath("") + SetCertPath(certPath) + _, err = CreateSessionToken("test_user") + require.ErrorContains(t, err, "no certificate or key file") + // both configured + SetKeyPath(keyPath) + _, err = CreateSessionToken("test_user") + require.NoError(t, err) + // When the key and cert don't match, it will still use the old pair. + certPath2 := filepath.Join(tempDir, "test2_cert.pem") + keyPath2 := filepath.Join(tempDir, "test2_key.pem") + err = util.CreateCertificates(certPath2, keyPath2, 4096, x509.RSA, x509.UnknownSignatureAlgorithm) + require.NoError(t, err) + SetKeyPath(keyPath2) + _, err = CreateSessionToken("test_user") + require.NoError(t, err) +} + +func TestSignAlgo(t *testing.T) { + tests := []struct { + pubKeyAlgo x509.PublicKeyAlgorithm + signAlgos []x509.SignatureAlgorithm + keySizes []int + }{ + { + pubKeyAlgo: x509.RSA, + signAlgos: []x509.SignatureAlgorithm{ + x509.SHA256WithRSA, + x509.SHA384WithRSA, + x509.SHA512WithRSA, + x509.SHA256WithRSAPSS, + x509.SHA384WithRSAPSS, + x509.SHA512WithRSAPSS, + }, + keySizes: []int{ + 2048, + 4096, + }, + }, + { + pubKeyAlgo: x509.ECDSA, + signAlgos: []x509.SignatureAlgorithm{ + x509.ECDSAWithSHA256, + x509.ECDSAWithSHA384, + x509.ECDSAWithSHA512, + }, + keySizes: []int{ + 4096, + }, + }, + { + pubKeyAlgo: x509.Ed25519, + signAlgos: []x509.SignatureAlgorithm{ + x509.PureEd25519, + }, + keySizes: []int{ + 4096, + }, + }, + } + + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + SetKeyPath(keyPath) + SetCertPath(certPath) + for _, test := range tests { + for _, signAlgo := range test.signAlgos { + for _, keySize := range test.keySizes { + msg := fmt.Sprintf("pubKeyAlgo: %s, signAlgo: %s, keySize: %d", test.pubKeyAlgo.String(), + signAlgo.String(), keySize) + err := util.CreateCertificates(certPath, keyPath, keySize, test.pubKeyAlgo, signAlgo) + require.NoError(t, err, msg) + ReloadSigningCert() + _, tokenBytes := createNewToken(t, "test_user") + err = ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, err, msg) + } + } + } +} + +func TestVerifyToken(t *testing.T) { + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + createRSACert(t, certPath, keyPath) + SetKeyPath(keyPath) + SetCertPath(certPath) + + // check succeeds + token, tokenBytes := createNewToken(t, "test_user") + err := ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, err) + // the token expires + timeOffset := uint64(tokenLifetime + time.Minute) + require.NoError(t, failpoint.Enable(mockNowOffset, fmt.Sprintf(`return(%d)`, timeOffset))) + err = ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, failpoint.Disable(mockNowOffset)) + require.ErrorContains(t, err, "token expired") + // the current user is different with the token + err = ValidateSessionToken(tokenBytes, "another_user") + require.ErrorContains(t, err, "username does not match") + // forge the user name + token.Username = "another_user" + tokenBytes2, err := json.Marshal(token) + require.NoError(t, err) + err = ValidateSessionToken(tokenBytes2, "another_user") + require.ErrorContains(t, err, "verification error") + // forge the expire time + token.Username = "test_user" + token.ExpireTime = time.Now().Add(-time.Minute) + tokenBytes2, err = json.Marshal(token) + require.NoError(t, err) + err = ValidateSessionToken(tokenBytes2, "test_user") + require.ErrorContains(t, err, "verification error") +} + +func TestCertExpire(t *testing.T) { + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + createRSACert(t, certPath, keyPath) + SetKeyPath(keyPath) + SetCertPath(certPath) + + _, tokenBytes := createNewToken(t, "test_user") + err := ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, err) + // replace the cert, but the old cert is still valid for a while + certPath2 := filepath.Join(tempDir, "test2_cert.pem") + keyPath2 := filepath.Join(tempDir, "test2_key.pem") + createRSACert(t, certPath2, keyPath2) + SetKeyPath(keyPath2) + SetCertPath(certPath2) + err = ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, err) + // the old cert expires and the original token is invalid + timeOffset := uint64(LoadCertInterval) + require.NoError(t, failpoint.Enable(mockNowOffset, fmt.Sprintf(`return(%d)`, timeOffset))) + ReloadSigningCert() + timeOffset += uint64(oldCertValidTime + time.Minute) + require.NoError(t, failpoint.Enable(mockNowOffset, fmt.Sprintf(`return(%d)`, timeOffset))) + err = ValidateSessionToken(tokenBytes, "test_user") + require.ErrorContains(t, err, "verification error") + // the new cert is not rotated but is reloaded + _, tokenBytes = createNewToken(t, "test_user") + ReloadSigningCert() + err = ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, err) + // the cert is rotated but is still valid + createRSACert(t, certPath2, keyPath2) + timeOffset += uint64(LoadCertInterval) + require.NoError(t, failpoint.Enable(mockNowOffset, fmt.Sprintf(`return(%d)`, timeOffset))) + ReloadSigningCert() + err = ValidateSessionToken(tokenBytes, "test_user") + require.ErrorContains(t, err, "token expired") + // after some time, it's not valid + timeOffset += uint64(oldCertValidTime + time.Minute) + require.NoError(t, failpoint.Enable(mockNowOffset, fmt.Sprintf(`return(%d)`, timeOffset))) + err = ValidateSessionToken(tokenBytes, "test_user") + require.NoError(t, failpoint.Disable(mockNowOffset)) + require.ErrorContains(t, err, "verification error") +} + +func TestLoadAndReadConcurrently(t *testing.T) { + tempDir := t.TempDir() + certPath := filepath.Join(tempDir, "test1_cert.pem") + keyPath := filepath.Join(tempDir, "test1_key.pem") + createRSACert(t, certPath, keyPath) + SetKeyPath(keyPath) + SetCertPath(certPath) + + deadline := time.Now().Add(5 * time.Second) + var wg util.WaitGroupWrapper + // the writer + wg.Run(func() { + for time.Now().Before(deadline) { + createRSACert(t, certPath, keyPath) + time.Sleep(time.Second) + } + }) + // the loader + for i := 0; i < 2; i++ { + wg.Run(func() { + for time.Now().Before(deadline) { + ReloadSigningCert() + time.Sleep(500 * time.Millisecond) + } + }) + } + // the reader + for i := 0; i < 3; i++ { + id := i + wg.Run(func() { + username := fmt.Sprintf("test_user_%d", id) + for time.Now().Before(deadline) { + _, tokenBytes := createNewToken(t, username) + time.Sleep(10 * time.Millisecond) + err := ValidateSessionToken(tokenBytes, username) + require.NoError(t, err) + time.Sleep(10 * time.Millisecond) + } + }) + } + wg.Wait() +} + +func createNewToken(t *testing.T, username string) (*SessionToken, []byte) { + token, err := CreateSessionToken(username) + require.NoError(t, err) + tokenBytes, err := json.Marshal(token) + require.NoError(t, err) + return token, tokenBytes +} + +func createRSACert(t *testing.T, certPath, keyPath string) { + err := util.CreateCertificates(certPath, keyPath, 4096, x509.RSA, x509.UnknownSignatureAlgorithm) + require.NoError(t, err) +} diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index 7fef92ee10782..a13b80a78ae69 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -208,12 +208,25 @@ type StatementContext struct { // BindSQL used to construct the key for plan cache. It records the binding used by the stmt. // If the binding is not used by the stmt, the value is empty BindSQL string - // planNormalized use for cache the normalized plan, avoid duplicate builds. - planNormalized string - planDigest *parser.Digest - encodedPlan string - planHint string - planHintSet bool + + // The several fields below are mainly for some diagnostic features, like stmt summary and slow query. + // We cache the values here to avoid calculating them multiple times. + // Note: + // Avoid accessing these fields directly, use their Setter/Getter methods instead. + // Other fields should be the zero value or be consistent with the plan field. + // TODO: more clearly distinguish between the value is empty and the value has not been set + planNormalized string + planDigest *parser.Digest + encodedPlan string + planHint string + planHintSet bool + binaryPlan string + // To avoid cycle import, we use interface{} for the following two fields. + // flatPlan should be a *plannercore.FlatPhysicalPlan if it's not nil + flatPlan interface{} + // plan should be a plannercore.Plan if it's not nil + plan interface{} + Tables []TableEntry PointExec bool // for point update cached execution, Constant expression need to set "paramMarker" lockWaitStartTime int64 // LockWaitStartTime stores the pessimistic lock wait start time @@ -226,7 +239,12 @@ type StatementContext struct { TaskMapBakTS uint64 // counter for // stmtCache is used to store some statement-related values. - stmtCache map[StmtCacheKey]interface{} + // add mutex to protect stmtCache concurrent access + // https://github.com/pingcap/tidb/issues/36159 + stmtCache struct { + mu sync.Mutex + data map[StmtCacheKey]interface{} + } // Map to store all CTE storages of current SQL. // Will clean up at the end of the execution. @@ -272,10 +290,10 @@ type StatementContext struct { StatsLoad struct { // Timeout to wait for sync-load Timeout time.Duration - // NeededColumns stores the columns whose stats are needed for planner. - NeededColumns []model.TableColumnID + // NeededItems stores the columns/indices whose stats are needed for planner. + NeededItems []model.TableItemID // ResultCh to receive stats loading results - ResultCh chan model.TableColumnID + ResultCh chan model.TableItemID // Fallback indicates if the planner uses full-loaded stats or fallback all to pseudo/simple. Fallback bool // LoadStartTime is to record the load start time to calculate latency @@ -339,23 +357,29 @@ const ( // GetOrStoreStmtCache gets the cached value of the given key if it exists, otherwise stores the value. func (sc *StatementContext) GetOrStoreStmtCache(key StmtCacheKey, value interface{}) interface{} { - if sc.stmtCache == nil { - sc.stmtCache = make(map[StmtCacheKey]interface{}) + sc.stmtCache.mu.Lock() + defer sc.stmtCache.mu.Unlock() + if sc.stmtCache.data == nil { + sc.stmtCache.data = make(map[StmtCacheKey]interface{}) } - if _, ok := sc.stmtCache[key]; !ok { - sc.stmtCache[key] = value + if _, ok := sc.stmtCache.data[key]; !ok { + sc.stmtCache.data[key] = value } - return sc.stmtCache[key] + return sc.stmtCache.data[key] } // ResetInStmtCache resets the cache of given key. func (sc *StatementContext) ResetInStmtCache(key StmtCacheKey) { - delete(sc.stmtCache, key) + sc.stmtCache.mu.Lock() + defer sc.stmtCache.mu.Unlock() + delete(sc.stmtCache.data, key) } // ResetStmtCache resets all cached values. func (sc *StatementContext) ResetStmtCache() { - sc.stmtCache = make(map[StmtCacheKey]interface{}) + sc.stmtCache.mu.Lock() + defer sc.stmtCache.mu.Unlock() + sc.stmtCache.data = make(map[StmtCacheKey]interface{}) } // SQLDigest gets normalized and digest for provided sql. @@ -374,11 +398,46 @@ func (sc *StatementContext) InitSQLDigest(normalized string, digest *parser.Dige }) } +// ResetSQLDigest sets the normalized and digest for sql anyway, **DO NOT USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING NOW**. +func (sc *StatementContext) ResetSQLDigest(s string) { + sc.digestMemo.normalized, sc.digestMemo.digest = parser.NormalizeDigest(s) +} + // GetPlanDigest gets the normalized plan and plan digest. func (sc *StatementContext) GetPlanDigest() (normalized string, planDigest *parser.Digest) { return sc.planNormalized, sc.planDigest } +// GetPlan gets the plan field of stmtctx +func (sc *StatementContext) GetPlan() interface{} { + return sc.plan +} + +// SetPlan sets the plan field of stmtctx +func (sc *StatementContext) SetPlan(plan interface{}) { + sc.plan = plan +} + +// GetFlatPlan gets the flatPlan field of stmtctx +func (sc *StatementContext) GetFlatPlan() interface{} { + return sc.flatPlan +} + +// SetFlatPlan sets the flatPlan field of stmtctx +func (sc *StatementContext) SetFlatPlan(flat interface{}) { + sc.flatPlan = flat +} + +// GetBinaryPlan gets the binaryPlan field of stmtctx +func (sc *StatementContext) GetBinaryPlan() string { + return sc.binaryPlan +} + +// SetBinaryPlan sets the binaryPlan field of stmtctx +func (sc *StatementContext) SetBinaryPlan(binaryPlan string) { + sc.binaryPlan = binaryPlan +} + // GetResourceGroupTagger returns the implementation of tikvrpc.ResourceGroupTagger related to self. func (sc *StatementContext) GetResourceGroupTagger() tikvrpc.ResourceGroupTagger { normalized, digest := sc.SQLDigest() diff --git a/sessionctx/variable/BUILD.bazel b/sessionctx/variable/BUILD.bazel index 5d5863d660f72..db227c30a8de1 100644 --- a/sessionctx/variable/BUILD.bazel +++ b/sessionctx/variable/BUILD.bazel @@ -33,6 +33,7 @@ go_library( "//parser/types", "//sessionctx/sessionstates", "//sessionctx/stmtctx", + "//sessionctx/variable/featuretag/concurrencyddl", "//tidb-binlog/pump_client", "//types", "//util", @@ -42,6 +43,7 @@ go_library( "//util/execdetails", "//util/logutil", "//util/mathutil", + "//util/paging", "//util/rowcodec", "//util/stmtsummary", "//util/stringutil", diff --git a/sessionctx/variable/featuretag/concurrencyddl/BUILD.bazel b/sessionctx/variable/featuretag/concurrencyddl/BUILD.bazel new file mode 100644 index 0000000000000..44c1cede3c2b7 --- /dev/null +++ b/sessionctx/variable/featuretag/concurrencyddl/BUILD.bazel @@ -0,0 +1,11 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "concurrencyddl", + srcs = [ + "default.go", + "non_default.go", + ], + importpath = "github.com/pingcap/tidb/sessionctx/variable/featuretag/concurrencyddl", + visibility = ["//visibility:public"], +) diff --git a/sessionctx/variable/featuretag/concurrencyddl/default.go b/sessionctx/variable/featuretag/concurrencyddl/default.go new file mode 100644 index 0000000000000..8aca4924268f0 --- /dev/null +++ b/sessionctx/variable/featuretag/concurrencyddl/default.go @@ -0,0 +1,20 @@ +// 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. + +//go:build !featuretag + +package concurrencyddl + +// TiDBEnableConcurrentDDL is a feature tag +const TiDBEnableConcurrentDDL bool = true diff --git a/sessionctx/variable/featuretag/concurrencyddl/non_default.go b/sessionctx/variable/featuretag/concurrencyddl/non_default.go new file mode 100644 index 0000000000000..72218abe958a3 --- /dev/null +++ b/sessionctx/variable/featuretag/concurrencyddl/non_default.go @@ -0,0 +1,20 @@ +// 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. + +//go:build featuretag + +package concurrencyddl + +// TiDBEnableConcurrentDDL is a feature tag +const TiDBEnableConcurrentDDL bool = false diff --git a/sessionctx/variable/noop.go b/sessionctx/variable/noop.go index 6eb70beabfc99..30e72ad4bfb5c 100644 --- a/sessionctx/variable/noop.go +++ b/sessionctx/variable/noop.go @@ -155,7 +155,7 @@ var noopSysVars = []*SysVar{ {Scope: ScopeNone, Name: "innodb_buffer_pool_instances", Value: "8"}, {Scope: ScopeGlobal | ScopeSession, Name: "max_length_for_sort_data", Value: "1024", IsHintUpdatable: true}, {Scope: ScopeNone, Name: CharacterSetSystem, Value: "utf8"}, - {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetFilesystem, Value: "binary", skipInit: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetFilesystem, Value: "binary", Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { return checkCharacterSet(normalizedValue, CharacterSetFilesystem) }}, {Scope: ScopeGlobal, Name: InnodbOptimizeFullTextOnly, Value: "0"}, diff --git a/sessionctx/variable/removed.go b/sessionctx/variable/removed.go index fbaae51b04a40..f540f3894abe0 100644 --- a/sessionctx/variable/removed.go +++ b/sessionctx/variable/removed.go @@ -34,6 +34,7 @@ const ( placementChecks = "placement_checks" tiDBEnableStreaming = "tidb_enable_streaming" tiDBOptBCJ = "tidb_opt_broadcast_join" + tidbEnableChangeMultiSchema = "tidb_enable_change_multi_schema" ) var removedSysVars = map[string]string{ @@ -49,6 +50,7 @@ var removedSysVars = map[string]string{ tiDBMemQuotaIndexLookupJoin: "use tidb_mem_quota_query instead", tiDBEnableStreaming: "streaming is no longer supported", tiDBOptBCJ: "tidb_opt_broadcast_join is removed and use tidb_allow_mpp instead", + tidbEnableChangeMultiSchema: "alter multiple schema objects in a table is now always enabled", } // IsRemovedSysVar returns true if the sysvar has been removed diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index 04e1279e37410..ddf249281858a 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -689,6 +689,9 @@ type SessionVars struct { // AllowDistinctAggPushDown can be set true to allow agg with distinct push down to tikv/tiflash. AllowDistinctAggPushDown bool + // EnableSkewDistinctAgg can be set true to allow skew distinct aggregate rewrite + EnableSkewDistinctAgg bool + // MultiStatementMode permits incorrect client library usage. Not recommended to be turned on. MultiStatementMode int @@ -917,7 +920,7 @@ type SessionVars struct { // Killed is a flag to indicate that this query is killed. Killed uint32 - // ConnectionInfo indicates current connection info used by current session, only be lazy assigned by plugin. + // ConnectionInfo indicates current connection info used by current session. ConnectionInfo *ConnectionInfo // NoopFuncsMode allows OFF/ON/WARN values as 0/1/2. @@ -972,6 +975,9 @@ type SessionVars struct { // replicaRead is used for reading data from replicas, only follower is supported at this time. replicaRead kv.ReplicaReadType + // ReplicaClosestReadThreshold is the minimum response body size that a cop request should be sent to the closest replica. + // this variable only take effect when `tidb_follower_read` = 'closest-adaptive' + ReplicaClosestReadThreshold int64 // IsolationReadEngines is used to isolation read, tidb only read from the stores whose engine type is in the engines. IsolationReadEngines map[kv.StoreType]struct{} @@ -1165,6 +1171,22 @@ type SessionVars struct { // RequestSourceType is the type of inner request. RequestSourceType string + + // MemoryDebugModeMinHeapInUse indicated the minimum heapInUse threshold that triggers the memoryDebugMode. + MemoryDebugModeMinHeapInUse int64 + // MemoryDebugModeAlarmRatio indicated the allowable bias ratio of memory tracking accuracy check. + // When `(memory trakced by tidb) * (1+MemoryDebugModeAlarmRatio) < actual heapInUse`, an alarm log will be recorded. + MemoryDebugModeAlarmRatio int64 + + // EnableAnalyzeSnapshot indicates whether to read data on snapshot when collecting statistics. + // When it is false, ANALYZE reads the latest data. + // When it is true, ANALYZE reads data on the snapshot at the beginning of ANALYZE. + EnableAnalyzeSnapshot bool + + // DefaultStrMatchSelectivity adjust the estimation strategy for string matching expressions that can't be estimated by building into range. + // when > 0: it's the selectivity for the expression. + // when = 0: try to use TopN to evaluate the like expression to estimate the selectivity. + DefaultStrMatchSelectivity float64 } // InitStatementContext initializes a StatementContext, the object is reused to reduce allocation. @@ -1290,7 +1312,7 @@ func (pps PreparedParams) String() string { return " [arguments: " + types.DatumsToStrNoErr(pps) + "]" } -// ConnectionInfo present connection used by audit. +// ConnectionInfo presents the connection information, which is mainly used by audit logs. type ConnectionInfo struct { ConnectionID uint64 ConnectionType string @@ -1310,6 +1332,24 @@ type ConnectionInfo struct { DB string } +const ( + // ConnTypeSocket indicates socket without TLS. + ConnTypeSocket string = "Socket" + // ConnTypeUnixSocket indicates Unix Socket. + ConnTypeUnixSocket string = "UnixSocket" + // ConnTypeTLS indicates socket with TLS. + ConnTypeTLS string = "SSL/TLS" +) + +// IsSecureTransport checks whether the connection is secure. +func (connInfo *ConnectionInfo) IsSecureTransport() bool { + switch connInfo.ConnectionType { + case ConnTypeUnixSocket, ConnTypeTLS: + return true + } + return false +} + // NewSessionVars creates a session vars object. func NewSessionVars() *SessionVars { vars := &SessionVars{ @@ -1401,6 +1441,7 @@ func NewSessionVars() *SessionVars { StatsLoadSyncWait: StatsLoadSyncWait.Load(), EnableLegacyInstanceScope: DefEnableLegacyInstanceScope, RemoveOrderbyInSubquery: DefTiDBRemoveOrderbyInSubquery, + EnableSkewDistinctAgg: DefTiDBSkewDistinctAgg, MaxAllowedPacket: DefMaxAllowedPacket, } vars.KVVars = tikvstore.NewVariables(&vars.Killed) @@ -1427,6 +1468,7 @@ func NewSessionVars() *SessionVars { IndexLookupSize: DefIndexLookupSize, InitChunkSize: DefInitChunkSize, MaxChunkSize: DefMaxChunkSize, + MinPagingSize: DefMinPagingSize, } vars.DMLBatchSize = DefDMLBatchSize vars.AllowBatchCop = DefTiDBAllowBatchCop @@ -2167,6 +2209,9 @@ type BatchSize struct { // MaxChunkSize defines max row count of a Chunk during query execution. MaxChunkSize int + + // MinPagingSize defines the min size used by the coprocessor paging protocol. + MinPagingSize int } const ( @@ -2258,8 +2303,12 @@ const ( SlowLogPlan = "Plan" // SlowLogPlanDigest is used to record the query plan digest. SlowLogPlanDigest = "Plan_digest" + // SlowLogBinaryPlan is used to record the binary plan. + SlowLogBinaryPlan = "Binary_plan" // SlowLogPlanPrefix is the prefix of the plan value. SlowLogPlanPrefix = ast.TiDBDecodePlan + "('" + // SlowLogBinaryPlanPrefix is the prefix of the binary plan value. + SlowLogBinaryPlanPrefix = ast.TiDBDecodeBinaryPlan + "('" // SlowLogPlanSuffix is the suffix of the plan value. SlowLogPlanSuffix = "')" // SlowLogPrevStmtPrefix is the prefix of Prev_stmt in slow log file. @@ -2286,6 +2335,10 @@ const ( SlowLogIsWriteCacheTable = "IsWriteCacheTable" ) +// GenerateBinaryPlan decides whether we should record binary plan in slow log and stmt summary. +// It's controlled by the global variable `tidb_generate_binary_plan`. +var GenerateBinaryPlan atomic2.Bool + // SlowQueryLogItems is a collection of items that should be included in the // slow query log. type SlowQueryLogItems struct { @@ -2311,6 +2364,7 @@ type SlowQueryLogItems struct { PrevStmt string Plan string PlanDigest string + BinaryPlan string RewriteInfo RewritePhaseInfo KVTotal time.Duration PDTotal time.Duration @@ -2494,6 +2548,9 @@ func (s *SessionVars) SlowLogFormat(logItems *SlowQueryLogItems) string { if len(logItems.PlanDigest) != 0 { writeSlowLogItem(&buf, SlowLogPlanDigest, logItems.PlanDigest) } + if len(logItems.BinaryPlan) != 0 { + writeSlowLogItem(&buf, SlowLogBinaryPlan, logItems.BinaryPlan) + } if logItems.PrevStmt != "" { writeSlowLogItem(&buf, SlowLogPrevStmt, logItems.PrevStmt) @@ -2672,3 +2729,30 @@ func (s *SessionVars) GetSeekFactor(tbl *model.TableInfo) float64 { } return s.seekFactor } + +// EnableEvalTopNEstimationForStrMatch means if we need to evaluate expression with TopN to improve estimation. +// Currently, it's only for string matching functions (like and regexp). +func (s *SessionVars) EnableEvalTopNEstimationForStrMatch() bool { + return s.DefaultStrMatchSelectivity == 0 +} + +// GetStrMatchDefaultSelectivity means the default selectivity for like and regexp. +// Note: 0 is a special value, which means the default selectivity is 0.1 and TopN assisted estimation is enabled. +func (s *SessionVars) GetStrMatchDefaultSelectivity() float64 { + if s.DefaultStrMatchSelectivity == 0 { + return 0.1 + } + return s.DefaultStrMatchSelectivity +} + +// GetNegateStrMatchDefaultSelectivity means the default selectivity for not like and not regexp. +// Note: +// 0 is a special value, which means the default selectivity is 0.9 and TopN assisted estimation is enabled. +// 0.8 (the default value) is also a special value. For backward compatibility, when the variable is set to 0.8, we +// keep the default selectivity of like/regexp and not like/regexp all 0.8. +func (s *SessionVars) GetNegateStrMatchDefaultSelectivity() float64 { + if s.DefaultStrMatchSelectivity == DefTiDBDefaultStrMatchSelectivity { + return DefTiDBDefaultStrMatchSelectivity + } + return 1 - s.GetStrMatchDefaultSelectivity() +} diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index 4af4de4e12837..0624f653ade65 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -30,11 +30,14 @@ import ( "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/sessionstates" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/paging" "github.com/pingcap/tidb/util/stmtsummary" "github.com/pingcap/tidb/util/tikvutil" "github.com/pingcap/tidb/util/tls" @@ -71,7 +74,7 @@ var defaultSysVars = []*SysVar{ {Scope: ScopeNone, Name: TiDBAllowFunctionForExpressionIndex, ReadOnly: true, Value: collectAllowFuncName4ExpressionIndex()}, /* The system variables below have SESSION scope */ - {Scope: ScopeSession, Name: Timestamp, Value: DefTimestamp, skipInit: true, MinValue: 0, MaxValue: 2147483647, Type: TypeFloat, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: Timestamp, Value: DefTimestamp, MinValue: 0, MaxValue: 2147483647, Type: TypeFloat, GetSession: func(s *SessionVars) (string, error) { if timestamp, ok := s.systems[Timestamp]; ok && timestamp != DefTimestamp { return timestamp, nil } @@ -81,18 +84,18 @@ var defaultSysVars = []*SysVar{ timestamp, ok := s.systems[Timestamp] return timestamp, ok && timestamp != DefTimestamp, nil }}, - {Scope: ScopeSession, Name: WarningCount, Value: "0", ReadOnly: true, skipInit: true, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: WarningCount, Value: "0", ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { return strconv.Itoa(s.SysWarningCount), nil }}, - {Scope: ScopeSession, Name: ErrorCount, Value: "0", ReadOnly: true, skipInit: true, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: ErrorCount, Value: "0", ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { return strconv.Itoa(int(s.SysErrorCount)), nil }}, - {Scope: ScopeSession, Name: LastInsertID, Value: "", skipInit: true, Type: TypeInt, AllowEmpty: true, MinValue: 0, MaxValue: math.MaxInt64, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: LastInsertID, Value: "", Type: TypeInt, AllowEmpty: true, MinValue: 0, MaxValue: math.MaxInt64, GetSession: func(s *SessionVars) (string, error) { return strconv.FormatUint(s.StmtCtx.PrevLastInsertID, 10), nil }, GetStateValue: func(s *SessionVars) (string, bool, error) { return "", false, nil }}, - {Scope: ScopeSession, Name: Identity, Value: "", skipInit: true, Type: TypeInt, AllowEmpty: true, MinValue: 0, MaxValue: math.MaxInt64, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: Identity, Value: "", Type: TypeInt, AllowEmpty: true, MinValue: 0, MaxValue: math.MaxInt64, GetSession: func(s *SessionVars) (string, error) { return strconv.FormatUint(s.StmtCtx.PrevLastInsertID, 10), nil }, GetStateValue: func(s *SessionVars) (string, bool, error) { return "", false, nil @@ -159,11 +162,15 @@ var defaultSysVars = []*SysVar{ s.AllowDistinctAggPushDown = TiDBOptOn(val) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptSkewDistinctAgg, Value: BoolToOnOff(DefTiDBSkewDistinctAgg), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.EnableSkewDistinctAgg = TiDBOptOn(val) + return nil + }}, {Scope: ScopeSession, Name: TiDBOptWriteRowID, Value: BoolToOnOff(DefOptWriteRowID), Type: TypeBool, skipInit: true, SetSession: func(s *SessionVars, val string) error { s.AllowWriteRowID = TiDBOptOn(val) return nil }}, - {Scope: ScopeSession, Name: TiDBChecksumTableConcurrency, skipInit: true, Value: strconv.Itoa(DefChecksumTableConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, + {Scope: ScopeSession, Name: TiDBChecksumTableConcurrency, Value: strconv.Itoa(DefChecksumTableConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, {Scope: ScopeSession, Name: TiDBBatchInsert, Value: BoolToOnOff(DefBatchInsert), Type: TypeBool, skipInit: true, SetSession: func(s *SessionVars, val string) error { s.BatchInsert = TiDBOptOn(val) return nil @@ -176,13 +183,13 @@ var defaultSysVars = []*SysVar{ s.BatchCommit = TiDBOptOn(val) return nil }}, - {Scope: ScopeSession, Name: TiDBCurrentTS, Value: strconv.Itoa(DefCurretTS), Type: TypeInt, AllowEmpty: true, MinValue: 0, MaxValue: math.MaxInt64, ReadOnly: true, skipInit: true, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: TiDBCurrentTS, Value: strconv.Itoa(DefCurretTS), Type: TypeInt, AllowEmpty: true, MinValue: 0, MaxValue: math.MaxInt64, ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { return strconv.FormatUint(s.TxnCtx.StartTS, 10), nil }}, - {Scope: ScopeSession, Name: TiDBLastTxnInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true, skipInit: true, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: TiDBLastTxnInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { return s.LastTxnInfo, nil }}, - {Scope: ScopeSession, Name: TiDBLastQueryInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true, skipInit: true, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: TiDBLastQueryInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { info, err := json.Marshal(s.LastQueryInfo) if err != nil { return "", err @@ -279,16 +286,10 @@ var defaultSysVars = []*SysVar{ s.MetricSchemaRangeDuration = TidbOptInt64(val, DefTiDBMetricSchemaRangeDuration) return nil }}, - {Scope: ScopeSession, Name: TiDBFoundInPlanCache, Value: BoolToOnOff(DefTiDBFoundInPlanCache), Type: TypeBool, ReadOnly: true, skipInit: true, SetSession: func(s *SessionVars, val string) error { - s.FoundInPlanCache = TiDBOptOn(val) - return nil - }, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: TiDBFoundInPlanCache, Value: BoolToOnOff(DefTiDBFoundInPlanCache), Type: TypeBool, ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { return BoolToOnOff(s.PrevFoundInPlanCache), nil }}, - {Scope: ScopeSession, Name: TiDBFoundInBinding, Value: BoolToOnOff(DefTiDBFoundInBinding), Type: TypeBool, ReadOnly: true, skipInit: true, SetSession: func(s *SessionVars, val string) error { - s.FoundInBinding = TiDBOptOn(val) - return nil - }, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: TiDBFoundInBinding, Value: BoolToOnOff(DefTiDBFoundInBinding), Type: TypeBool, ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { return BoolToOnOff(s.PrevFoundInBinding), nil }}, {Scope: ScopeSession, Name: RandSeed1, Type: TypeInt, Value: "0", skipInit: true, MaxValue: math.MaxInt32, SetSession: func(s *SessionVars, val string) error { @@ -316,7 +317,7 @@ var defaultSysVars = []*SysVar{ return nil }, }, - {Scope: ScopeSession, Name: TiDBLastDDLInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true, skipInit: true, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeSession, Name: TiDBLastDDLInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true, GetSession: func(s *SessionVars) (string, error) { info, err := json.Marshal(s.LastDDLInfo) if err != nil { return "", err @@ -501,12 +502,6 @@ var defaultSysVars = []*SysVar{ SetMaxDeltaSchemaCount(TidbOptInt64(val, DefTiDBMaxDeltaSchemaCount)) return nil }}, - {Scope: ScopeGlobal, Name: TiDBEnableChangeMultiSchema, Value: BoolToOnOff(DefTiDBChangeMultiSchema), Hidden: true, Type: TypeBool, SetGlobal: func(s *SessionVars, val string) error { - EnableChangeMultiSchema.Store(TiDBOptOn(val)) - return nil - }, GetGlobal: func(s *SessionVars) (string, error) { - return BoolToOnOff(EnableChangeMultiSchema.Load()), nil - }}, {Scope: ScopeGlobal, Name: TiDBEnablePointGetCache, Value: BoolToOnOff(DefTiDBPointGetCache), Hidden: true, Type: TypeBool, SetGlobal: func(s *SessionVars, val string) error { EnablePointGetCache.Store(TiDBOptOn(val)) return nil @@ -813,7 +808,13 @@ var defaultSysVars = []*SysVar{ }, }, {Scope: ScopeGlobal, Name: TiDBEnableConcurrentDDL, Value: BoolToOnOff(DefTiDBEnableConcurrentDDL), Type: TypeBool, SetGlobal: func(s *SessionVars, val string) error { - EnableConcurrentDDL.Store(TiDBOptOn(val)) + if EnableConcurrentDDL.Load() != TiDBOptOn(val) { + err := SwitchConcurrentDDL(TiDBOptOn(val)) + if err != nil { + return err + } + EnableConcurrentDDL.Store(TiDBOptOn(val)) + } return nil }, GetGlobal: func(s *SessionVars) (string, error) { return BoolToOnOff(EnableConcurrentDDL.Load()), nil @@ -824,6 +825,20 @@ var defaultSysVars = []*SysVar{ }, GetGlobal: func(s *SessionVars) (string, error) { return BoolToOnOff(EnableNoopVariables.Load()), nil }}, + {Scope: ScopeGlobal, Name: TiDBAuthSigningCert, Value: "", Type: TypeStr, SetGlobal: func(s *SessionVars, val string) error { + sessionstates.SetCertPath(val) + return nil + }}, + {Scope: ScopeGlobal, Name: TiDBAuthSigningKey, Value: "", Type: TypeStr, SetGlobal: func(s *SessionVars, val string) error { + sessionstates.SetKeyPath(val) + return nil + }}, + {Scope: ScopeGlobal, Name: TiDBEnableGCAwareMemoryTrack, Value: BoolToOnOff(DefEnableTiDBGCAwareMemoryTrack), Type: TypeBool, SetGlobal: func(s *SessionVars, val string) error { + memory.EnableGCAwareMemoryTrack.Store(TiDBOptOn(val)) + return nil + }, GetGlobal: func(s *SessionVars) (string, error) { + return BoolToOnOff(memory.EnableGCAwareMemoryTrack.Load()), nil + }}, /* The system variables below have GLOBAL and SESSION scope */ {Scope: ScopeGlobal | ScopeSession, Name: SQLSelectLimit, Value: "18446744073709551615", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, SetSession: func(s *SessionVars, val string) error { @@ -867,7 +882,7 @@ var defaultSysVars = []*SysVar{ } return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLLogBin, Value: On, Type: TypeBool, skipInit: true}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLLogBin, Value: On, Type: TypeBool}, {Scope: ScopeGlobal | ScopeSession, Name: TimeZone, Value: "SYSTEM", IsHintUpdatable: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { if strings.EqualFold(normalizedValue, "SYSTEM") { return "SYSTEM", nil @@ -882,7 +897,7 @@ var defaultSysVars = []*SysVar{ s.TimeZone = tz return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: ForeignKeyChecks, Value: Off, Type: TypeBool, skipInit: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + {Scope: ScopeGlobal | ScopeSession, Name: ForeignKeyChecks, Value: Off, Type: TypeBool, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { if TiDBOptOn(normalizedValue) { // TiDB does not yet support foreign keys. // Return the original value in the warning, so that users are not confused. @@ -911,10 +926,10 @@ var defaultSysVars = []*SysVar{ s.AutoIncrementOffset = tidbOptPositiveInt32(val, DefAutoIncrementOffset) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetClient, Value: mysql.DefaultCharset, skipInit: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetClient, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { return checkCharacterSet(normalizedValue, CharacterSetClient) }}, - {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetResults, Value: mysql.DefaultCharset, skipInit: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetResults, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { if normalizedValue == "" { return normalizedValue, nil } @@ -960,7 +975,7 @@ var defaultSysVars = []*SysVar{ s.LockWaitTimeout = lockWaitSec * 1000 return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: GroupConcatMaxLen, Value: "1024", IsHintUpdatable: true, skipInit: true, Type: TypeUnsigned, MinValue: 4, MaxValue: math.MaxUint64, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + {Scope: ScopeGlobal | ScopeSession, Name: GroupConcatMaxLen, Value: "1024", IsHintUpdatable: true, Type: TypeUnsigned, MinValue: 4, MaxValue: math.MaxUint64, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { // https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len // Minimum Value 4 // Maximum Value (64-bit platforms) 18446744073709551615 @@ -1047,7 +1062,7 @@ var defaultSysVars = []*SysVar{ s.BroadcastJoinThresholdSize = TidbOptInt64(val, DefBroadcastJoinThresholdSize) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBBuildStatsConcurrency, skipInit: true, Value: strconv.Itoa(DefBuildStatsConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBBuildStatsConcurrency, Value: strconv.Itoa(DefBuildStatsConcurrency), Type: TypeInt, MinValue: 1, MaxValue: MaxConfigurableConcurrency}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCartesianBCJ, Value: strconv.Itoa(DefOptCartesianBCJ), Type: TypeInt, MinValue: 0, MaxValue: 2, SetSession: func(s *SessionVars, val string) error { s.AllowCartesianBCJ = TidbOptInt(val, DefOptCartesianBCJ) return nil @@ -1419,7 +1434,7 @@ var defaultSysVars = []*SysVar{ s.NoopFuncsMode = TiDBOptOnOffWarn(val) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBReplicaRead, Value: "leader", Type: TypeEnum, PossibleValues: []string{"leader", "follower", "leader-and-follower", "closest-replicas"}, SetSession: func(s *SessionVars, val string) error { + {Scope: ScopeGlobal | ScopeSession, Name: TiDBReplicaRead, Value: "leader", Type: TypeEnum, PossibleValues: []string{"leader", "follower", "leader-and-follower", "closest-replicas", "closest-adaptive"}, SetSession: func(s *SessionVars, val string) error { if strings.EqualFold(val, "follower") { s.SetReplicaRead(kv.ReplicaReadFollower) } else if strings.EqualFold(val, "leader-and-follower") { @@ -1428,9 +1443,15 @@ var defaultSysVars = []*SysVar{ s.SetReplicaRead(kv.ReplicaReadLeader) } else if strings.EqualFold(val, "closest-replicas") { s.SetReplicaRead(kv.ReplicaReadClosest) + } else if strings.EqualFold(val, "closest-adaptive") { + s.SetReplicaRead(kv.ReplicaReadClosestAdaptive) } return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAdaptiveClosestReadThreshold, Value: strconv.Itoa(DefAdaptiveClosestReadThreshold), Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxInt64, SetSession: func(s *SessionVars, val string) error { + s.ReplicaClosestReadThreshold = TidbOptInt64(val, DefAdaptiveClosestReadThreshold) + return nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBUsePlanBaselines, Value: BoolToOnOff(DefTiDBUsePlanBaselines), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { s.UsePlanBaselines = TiDBOptOn(val) return nil @@ -1621,13 +1642,13 @@ var defaultSysVars = []*SysVar{ return nil }, }, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableNewCostInterface, Value: BoolToOnOff(false), Hidden: true, Type: TypeBool, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableNewCostInterface, Value: BoolToOnOff(true), Hidden: false, Type: TypeBool, SetSession: func(vars *SessionVars, s string) error { vars.EnableNewCostInterface = TiDBOptOn(s) return nil }, }, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBCostModelVersion, Value: strconv.Itoa(1), Hidden: true, Type: TypeInt, MinValue: 1, MaxValue: 2, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBCostModelVersion, Value: strconv.Itoa(1), Hidden: false, Type: TypeInt, MinValue: 1, MaxValue: 2, SetSession: func(vars *SessionVars, s string) error { vars.CostModelVersion = int(TidbOptInt64(s, 1)) return nil @@ -1673,6 +1694,31 @@ var defaultSysVars = []*SysVar{ metrics.ToggleSimplifiedMode(TiDBOptOn(s)) return nil }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBMinPagingSize, Value: strconv.Itoa(DefMinPagingSize), Type: TypeUnsigned, MinValue: 1, MaxValue: paging.MaxPagingSize, SetSession: func(s *SessionVars, val string) error { + s.MinPagingSize = tidbOptPositiveInt32(val, DefMinPagingSize) + return nil + }}, + {Scope: ScopeSession, Name: TiDBMemoryDebugModeMinHeapInUse, Value: strconv.Itoa(0), Type: TypeInt, MinValue: math.MinInt64, MaxValue: math.MaxInt64, SetSession: func(s *SessionVars, val string) error { + s.MemoryDebugModeMinHeapInUse = TidbOptInt64(val, 0) + return nil + }}, + {Scope: ScopeSession, Name: TiDBMemoryDebugModeAlarmRatio, Value: strconv.Itoa(0), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt64, SetSession: func(s *SessionVars, val string) error { + s.MemoryDebugModeAlarmRatio = TidbOptInt64(val, 0) + return nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAnalyzeSnapshot, Value: BoolToOnOff(DefTiDBEnableAnalyzeSnapshot), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.EnableAnalyzeSnapshot = TiDBOptOn(val) + return nil + }}, + {Scope: ScopeGlobal, Name: TiDBGenerateBinaryPlan, Value: BoolToOnOff(DefTiDBGenerateBinaryPlan), Type: TypeBool, SetGlobal: func(s *SessionVars, val string) error { + GenerateBinaryPlan.Store(TiDBOptOn(val)) + return nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBDefaultStrMatchSelectivity, Value: strconv.FormatFloat(DefTiDBDefaultStrMatchSelectivity, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: 1, + SetSession: func(s *SessionVars, val string) error { + s.DefaultStrMatchSelectivity = tidbOptFloat64(val, DefTiDBDefaultStrMatchSelectivity) + return nil + }}, } // FeedbackProbability points to the FeedbackProbability in statistics package. diff --git a/sessionctx/variable/sysvar_test.go b/sessionctx/variable/sysvar_test.go index 6d94cb81e8ac0..ebf0fd2587624 100644 --- a/sessionctx/variable/sysvar_test.go +++ b/sessionctx/variable/sysvar_test.go @@ -703,33 +703,27 @@ func TestSkipInitIsUsed(t *testing.T) { // skipInit only ever applied to session scope, so if anyone is setting it on // a variable without session, that doesn't make sense. require.True(t, sv.HasSessionScope(), fmt.Sprintf("skipInit has no effect on a variable without session scope: %s", sv.Name)) + // Since SetSession is the "init function" there is no init function to skip. + require.NotNil(t, sv.SetSession, fmt.Sprintf("skipInit has no effect on variables without an init (setsession) func: %s", sv.Name)) + // Skipinit has no use on noop funcs, since noop funcs always skipinit. + require.False(t, sv.IsNoop, fmt.Sprintf("skipInit has no effect on noop variables: %s", sv.Name)) + // Many of these variables might allow skipInit to be removed, // they need to be checked first. The purpose of this test is to make // sure we don't introduce any new variables with skipInit, which seems // to be a problem. switch sv.Name { - case Timestamp, - WarningCount, - ErrorCount, - LastInsertID, - Identity, - TiDBTxnScope, + case TiDBTxnScope, TiDBSnapshot, TiDBOptDistinctAggPushDown, TiDBOptWriteRowID, - TiDBChecksumTableConcurrency, TiDBBatchInsert, TiDBBatchDelete, TiDBBatchCommit, - TiDBCurrentTS, - TiDBLastTxnInfo, - TiDBLastQueryInfo, TiDBEnableChunkRPC, TxnIsolationOneShot, TiDBOptimizerSelectivityLevel, TiDBOptimizerEnableOuterJoinReorder, - TiDBLogFileMaxDays, - TiDBConfig, TiDBDDLReorgPriority, TiDBSlowQueryFile, TiDBWaitSplitRegionFinish, @@ -738,27 +732,17 @@ func TestSkipInitIsUsed(t *testing.T) { TiDBAllowRemoveAutoInc, TiDBMetricSchemaStep, TiDBMetricSchemaRangeDuration, - TiDBFoundInPlanCache, - TiDBFoundInBinding, RandSeed1, RandSeed2, - TiDBLastDDLInfo, - SQLLogBin, - ForeignKeyChecks, CollationDatabase, - CharacterSetClient, - CharacterSetResults, CollationConnection, CharsetDatabase, - GroupConcatMaxLen, CharacterSetConnection, CharacterSetServer, - TiDBBuildStatsConcurrency, TiDBOptTiFlashConcurrencyFactor, TiDBOptSeekFactor, TiDBOptJoinReorderThreshold, - TiDBStatsLoadSyncWait, - CharacterSetFilesystem: + TiDBStatsLoadSyncWait: continue } require.Equal(t, false, sv.skipInit, fmt.Sprintf("skipInit should not be set on new system variables. variable %s is in violation", sv.Name)) @@ -1075,3 +1059,13 @@ func TestTiDBCommitterConcurrency(t *testing.T) { require.Equal(t, val, fmt.Sprintf("%d", expected)) require.NoError(t, err) } + +func TestDefaultMemoryDebugModeValue(t *testing.T) { + vars := NewSessionVars() + val, err := GetSessionOrGlobalSystemVar(vars, TiDBMemoryDebugModeMinHeapInUse) + require.NoError(t, err) + require.Equal(t, val, "0") + val, err = GetSessionOrGlobalSystemVar(vars, TiDBMemoryDebugModeAlarmRatio) + require.NoError(t, err) + require.Equal(t, val, "0") +} diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index 2e55dfdb2353d..ffa18e380c375 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -19,6 +19,8 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/variable/featuretag/concurrencyddl" + "github.com/pingcap/tidb/util/paging" "go.uber.org/atomic" ) @@ -49,6 +51,9 @@ const ( // TiDBOptDistinctAggPushDown is used to decide whether agg with distinct should be pushed to tikv/tiflash. TiDBOptDistinctAggPushDown = "tidb_opt_distinct_agg_push_down" + // TiDBOptSkewDistinctAgg is used to indicate the distinct agg has data skew + TiDBOptSkewDistinctAgg = "tidb_opt_skew_distinct_agg" + // TiDBBCJThresholdSize is used to limit the size of small table for mpp broadcast join. // Its unit is bytes, if the size of small table is larger than it, we will not use bcj. TiDBBCJThresholdSize = "tidb_broadcast_join_threshold_size" @@ -164,6 +169,12 @@ const ( // TiDBReplicaRead is used for reading data from replicas, followers for example. TiDBReplicaRead = "tidb_replica_read" + // TiDBAdaptiveClosestReadThreshold is for reading data from closest replicas(with same 'zone' label). + // TiKV client should send read request to the closest replica(leader/follower) if the estimated response + // size exceeds this threshold; otherwise, this request should be sent to leader. + // This variable only take effect when `tidb_replica_read` is 'closest-adaptive'. + TiDBAdaptiveClosestReadThreshold = "tidb_adaptive_closest_read_threshold" + // TiDBAllowRemoveAutoInc indicates whether a user can drop the auto_increment column attribute or not. TiDBAllowRemoveAutoInc = "tidb_allow_remove_auto_inc" @@ -363,6 +374,9 @@ const ( // TiDBInitChunkSize is used to control the init chunk size during query execution. TiDBInitChunkSize = "tidb_init_chunk_size" + // TiDBMinPagingSize is used to control the min paging size in the coprocessor paging protocol. + TiDBMinPagingSize = "tidb_min_paging_size" + // TiDBEnableCascadesPlanner is used to control whether to enable the cascades planner. TiDBEnableCascadesPlanner = "tidb_enable_cascades_planner" @@ -431,9 +445,6 @@ const ( // It can be: PRIORITY_LOW, PRIORITY_NORMAL, PRIORITY_HIGH TiDBDDLReorgPriority = "tidb_ddl_reorg_priority" - // TiDBEnableChangeMultiSchema is used to control whether to enable the change multi schema. - TiDBEnableChangeMultiSchema = "tidb_enable_change_multi_schema" - // TiDBEnableAutoIncrementInGenerated disables the mysql compatibility check on using auto-incremented columns in // expression indexes and generated columns described here https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html for details. TiDBEnableAutoIncrementInGenerated = "tidb_enable_auto_increment_in_generated" @@ -684,6 +695,28 @@ const ( // TiDBSimplifiedMetrics controls whether to unregister some unused metrics. TiDBSimplifiedMetrics = "tidb_simplified_metrics" + + // TiDBMemoryDebugModeMinHeapInUse is used to set tidb memory debug mode trigger threshold. + // When set to 0, the function is disabled. + // When set to a negative integer, use memory debug mode to detect the issue of frequent allocation and release of memory. + // We do not actively trigger gc, and check whether the `tracker memory * (1+bias ratio) > heap in use` each 5s. + // When set to a positive integer, use memory debug mode to detect the issue of memory tracking inaccurate. + // We trigger runtime.GC() each 5s, and check whether the `tracker memory * (1+bias ratio) > heap in use`. + TiDBMemoryDebugModeMinHeapInUse = "tidb_memory_debug_mode_min_heap_inuse" + // TiDBMemoryDebugModeAlarmRatio is used set tidb memory debug mode bias ratio. Treat memory bias less than this ratio as noise. + TiDBMemoryDebugModeAlarmRatio = "tidb_memory_debug_mode_alarm_ratio" + + // TiDBEnableAnalyzeSnapshot indicates whether to read data on snapshot when collecting statistics. + // When set to false, ANALYZE reads the latest data. + // When set to true, ANALYZE reads data on the snapshot at the beginning of ANALYZE. + TiDBEnableAnalyzeSnapshot = "tidb_enable_analyze_snapshot" + + // TiDBDefaultStrMatchSelectivity controls some special cardinality estimation strategy for string match functions (like and regexp). + // When set to 0, Selectivity() will try to evaluate those functions with TopN and NULL in the stats to estimate, + // and the default selectivity and the selectivity for the histogram part will be 0.1. + // When set to (0, 1], Selectivity() will use the value of this variable as the default selectivity of those + // functions instead of the selectionFactor (0.8). + TiDBDefaultStrMatchSelectivity = "tidb_default_string_match_selectivity" ) // TiDB vars that have only global scope @@ -743,6 +776,14 @@ const ( TiDBMaxAutoAnalyzeTime = "tidb_max_auto_analyze_time" // TiDBEnableConcurrentDDL indicates whether to enable the new DDL framework. TiDBEnableConcurrentDDL = "tidb_enable_concurrent_ddl" + // TiDBAuthSigningCert indicates the path of the signing certificate to do token-based authentication. + TiDBAuthSigningCert = "tidb_auth_signing_cert" + // TiDBAuthSigningKey indicates the path of the signing key to do token-based authentication. + TiDBAuthSigningKey = "tidb_auth_signing_key" + // 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. + TiDBEnableGCAwareMemoryTrack = "tidb_enable_gc_aware_memory_track" ) // TiDB intentional limits @@ -808,6 +849,7 @@ const ( DefBatchCommit = false DefCurretTS = 0 DefInitChunkSize = 32 + DefMinPagingSize = int(paging.MinPagingSize) DefMaxChunkSize = 1024 DefDMLBatchSize = 0 DefMaxPreparedStmtCount = -1 @@ -839,7 +881,6 @@ const ( DefTiDBDDLReorgBatchSize = 256 DefTiDBDDLErrorCountLimit = 512 DefTiDBMaxDeltaSchemaCount = 1024 - DefTiDBChangeMultiSchema = false DefTiDBPointGetCache = false DefTiDBPlacementMode = PlacementModeStrict DefTiDBEnableAutoIncrementInGenerated = false @@ -925,6 +966,7 @@ const ( DefTiDBBatchPendingTiFlashCount = 4000 DefRCReadCheckTS = false DefTiDBRemoveOrderbyInSubquery = false + DefTiDBSkewDistinctAgg = false DefTiDBReadStaleness = 0 DefTiDBGCMaxWaitTime = 24 * 60 * 60 DefMaxAllowedPacket uint64 = 67108864 @@ -943,12 +985,17 @@ const ( DefTiDBEnablePrepPlanCache = true DefTiDBPrepPlanCacheSize = 100 DefTiDBPrepPlanCacheMemoryGuardRatio = 0.1 - DefTiDBEnableConcurrentDDL = true + DefTiDBEnableConcurrentDDL = concurrencyddl.TiDBEnableConcurrentDDL DefTiDBSimplifiedMetrics = false DefTiDBEnablePaging = true DefTiFlashFineGrainedShuffleStreamCount = -1 DefStreamCountWhenMaxThreadsNotSet = 8 DefTiFlashFineGrainedShuffleBatchSize = 8192 + DefAdaptiveClosestReadThreshold = 4096 + DefTiDBEnableAnalyzeSnapshot = false + DefTiDBGenerateBinaryPlan = true + DefEnableTiDBGCAwareMemoryTrack = true + DefTiDBDefaultStrMatchSelectivity = 0.8 ) // Process global variables. @@ -977,7 +1024,6 @@ var ( MemoryUsageAlarmRatio = atomic.NewFloat64(config.GetGlobalConfig().Instance.MemoryUsageAlarmRatio) EnableLocalTxn = atomic.NewBool(DefTiDBEnableLocalTxn) EnablePointGetCache = atomic.NewBool(DefTiDBPointGetCache) - EnableChangeMultiSchema = atomic.NewBool(DefTiDBChangeMultiSchema) MaxTSOBatchWaitInterval = atomic.NewFloat64(DefTiDBTSOClientBatchMaxWaitTime) EnableTSOFollowerProxy = atomic.NewBool(DefTiDBEnableTSOFollowerProxy) RestrictedReadOnly = atomic.NewBool(DefTiDBRestrictedReadOnly) @@ -1007,4 +1053,6 @@ var ( GetMemQuotaAnalyze func() int64 = nil // SetStatsCacheCapacity is the func registered by domain to set statsCache memory quota. SetStatsCacheCapacity atomic.Value + // SwitchConcurrentDDL is the func registered by DDL to switch concurrent DDL. + SwitchConcurrentDDL func(bool) error = nil ) diff --git a/sessionctx/variable/varsutil_test.go b/sessionctx/variable/varsutil_test.go index 4641a8c2f1e0d..49362e0fc3969 100644 --- a/sessionctx/variable/varsutil_test.go +++ b/sessionctx/variable/varsutil_test.go @@ -432,6 +432,14 @@ func TestVarsutil(t *testing.T) { err = SetSessionSystemVar(v, TiDBTableCacheLease, "123") require.Error(t, err) require.Regexp(t, "'tidb_table_cache_lease' is a GLOBAL variable and should be set with SET GLOBAL", err.Error()) + + val, err = GetSessionOrGlobalSystemVar(v, TiDBMinPagingSize) + require.NoError(t, err) + require.Equal(t, strconv.Itoa(DefMinPagingSize), val) + + err = SetSessionSystemVar(v, TiDBMinPagingSize, "123") + require.NoError(t, err) + require.Equal(t, v.MinPagingSize, 123) } func TestValidate(t *testing.T) { diff --git a/sessiontxn/BUILD.bazel b/sessiontxn/BUILD.bazel index 0738636e8299a..c884d7981e19e 100644 --- a/sessiontxn/BUILD.bazel +++ b/sessiontxn/BUILD.bazel @@ -4,8 +4,8 @@ go_library( name = "sessiontxn", srcs = [ "failpoint.go", + "future.go", "interface.go", - "txn.go", ], importpath = "github.com/pingcap/tidb/sessiontxn", visibility = ["//visibility:public"], @@ -14,12 +14,7 @@ go_library( "//kv", "//parser/ast", "//sessionctx", - "//sessionctx/variable", - "//table/temptable", "//util/stringutil", - "@com_github_opentracing_opentracing_go//:opentracing-go", - "@com_github_pingcap_kvproto//pkg/kvrpcpb", - "@com_github_tikv_client_go_v2//oracle", ], ) @@ -35,12 +30,16 @@ go_test( "//infoschema", "//kv", "//parser/ast", + "//parser/model", "//planner/core", "//sessionctx", + "//sessiontxn/internal", "//sessiontxn/staleread", + "//tablecodec", "//testkit", "//testkit/testfork", "//testkit/testsetup", + "//tests/realtikvtest", "@com_github_pingcap_failpoint//:failpoint", "@com_github_stretchr_testify//require", "@com_github_tikv_client_go_v2//oracle", diff --git a/sessiontxn/future.go b/sessiontxn/future.go new file mode 100644 index 0000000000000..d29d3e5614f0f --- /dev/null +++ b/sessiontxn/future.go @@ -0,0 +1,23 @@ +// 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 sessiontxn + +// ConstantFuture implements oracle.Future +type ConstantFuture uint64 + +// Wait returns a constant ts +func (n ConstantFuture) Wait() (uint64, error) { + return uint64(n), nil +} diff --git a/sessiontxn/internal/BUILD.bazel b/sessiontxn/internal/BUILD.bazel new file mode 100644 index 0000000000000..43e4dc2b8be1c --- /dev/null +++ b/sessiontxn/internal/BUILD.bazel @@ -0,0 +1,17 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "internal", + srcs = ["txn.go"], + importpath = "github.com/pingcap/tidb/sessiontxn/internal", + visibility = ["//sessiontxn:__subpackages__"], + deps = [ + "//kv", + "//sessionctx", + "//sessionctx/variable", + "//table/temptable", + "//util/logutil", + "@com_github_pingcap_kvproto//pkg/kvrpcpb", + "@org_uber_go_zap//:zap", + ], +) diff --git a/sessiontxn/internal/txn.go b/sessiontxn/internal/txn.go new file mode 100644 index 0000000000000..00db4561b979b --- /dev/null +++ b/sessiontxn/internal/txn.go @@ -0,0 +1,75 @@ +// 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 internal + +import ( + "context" + + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table/temptable" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +// SetTxnAssertionLevel sets assertion level of a transactin. Note that assertion level should be set only once just +// after creating a new transaction. +func SetTxnAssertionLevel(txn kv.Transaction, assertionLevel variable.AssertionLevel) { + switch assertionLevel { + case variable.AssertionLevelOff: + txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Off) + case variable.AssertionLevelFast: + txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Fast) + case variable.AssertionLevelStrict: + txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Strict) + } +} + +// CommitBeforeEnterNewTxn is called before entering a new transaction. It checks whether the old +// txn is valid in which case we should commit it first. +func CommitBeforeEnterNewTxn(ctx context.Context, sctx sessionctx.Context) error { + txn, err := sctx.Txn(false) + if err != nil { + return err + } + if txn.Valid() { + txnStartTS := txn.StartTS() + txnScope := sctx.GetSessionVars().TxnCtx.TxnScope + err = sctx.CommitTxn(ctx) + if err != nil { + return err + } + logutil.Logger(ctx).Info("Try to create a new txn inside a transaction auto commit", + zap.Int64("schemaVersion", sctx.GetInfoSchema().SchemaMetaVersion()), + zap.Uint64("txnStartTS", txnStartTS), + zap.String("txnScope", txnScope)) + } + return nil +} + +// GetSnapshotWithTS returns a snapshot with ts. +func GetSnapshotWithTS(s sessionctx.Context, ts uint64) kv.Snapshot { + snap := s.GetStore().GetSnapshot(kv.Version{Ver: ts}) + snap.SetOption(kv.SnapInterceptor, temptable.SessionSnapshotInterceptor(s)) + if s.GetSessionVars().InRestrictedSQL { + snap.SetOption(kv.RequestSourceInternal, true) + } + if tp := s.GetSessionVars().RequestSourceType; tp != "" { + snap.SetOption(kv.RequestSourceType, tp) + } + return snap +} diff --git a/sessiontxn/isolation/BUILD.bazel b/sessiontxn/isolation/BUILD.bazel index a05b08583768a..2f7e810fe95a7 100644 --- a/sessiontxn/isolation/BUILD.bazel +++ b/sessiontxn/isolation/BUILD.bazel @@ -22,9 +22,11 @@ go_library( "//sessionctx", "//sessionctx/variable", "//sessiontxn", + "//sessiontxn/internal", "//sessiontxn/staleread", "//table/temptable", "//util/logutil", + "@com_github_opentracing_opentracing_go//:opentracing-go", "@com_github_pingcap_errors//:errors", "@com_github_tikv_client_go_v2//error", "@com_github_tikv_client_go_v2//oracle", @@ -34,6 +36,7 @@ go_library( go_test( name = "isolation_test", + timeout = "short", srcs = [ "main_test.go", "optimistic_test.go", @@ -41,6 +44,7 @@ go_test( "repeatable_read_test.go", "serializable_test.go", ], + flaky = True, deps = [ ":isolation", "//config", diff --git a/sessiontxn/isolation/base.go b/sessiontxn/isolation/base.go index 877adebd564ca..572bc218f754b 100644 --- a/sessiontxn/isolation/base.go +++ b/sessiontxn/isolation/base.go @@ -18,6 +18,7 @@ import ( "context" "time" + "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/infoschema" @@ -26,6 +27,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/sessiontxn/internal" "github.com/pingcap/tidb/sessiontxn/staleread" "github.com/pingcap/tidb/table/temptable" "github.com/tikv/client-go/v2/oracle" @@ -68,12 +70,26 @@ func (p *baseTxnContextProvider) OnInitialize(ctx context.Context, tp sessiontxn activeNow := true switch tp { case sessiontxn.EnterNewTxnDefault: - if err = p.sctx.NewTxn(ctx); err != nil { + // As we will enter a new txn, we need to commit the old txn if it's still valid. + // There are two main steps here to enter a new txn: + // 1. prepareTxnWithOracleTS + // 2. ActivateTxn + if err := internal.CommitBeforeEnterNewTxn(p.ctx, p.sctx); err != nil { + return err + } + if err := p.prepareTxnWithOracleTS(); err != nil { return err } case sessiontxn.EnterNewTxnWithBeginStmt: - if !sessiontxn.CanReuseTxnWhenExplicitBegin(p.sctx) { - if err = p.sctx.NewTxn(ctx); err != nil { + if !canReuseTxnWhenExplicitBegin(p.sctx) { + // As we will enter a new txn, we need to commit the old txn if it's still valid. + // There are two main steps here to enter a new txn: + // 1. prepareTxnWithOracleTS + // 2. ActivateTxn + if err := internal.CommitBeforeEnterNewTxn(p.ctx, p.sctx); err != nil { + return err + } + if err := p.prepareTxnWithOracleTS(); err != nil { return err } } @@ -111,6 +127,7 @@ func (p *baseTxnContextProvider) OnInitialize(ctx context.Context, tp sessiontxn return err } +// GetTxnInfoSchema returns the information schema used by txn func (p *baseTxnContextProvider) GetTxnInfoSchema() infoschema.InfoSchema { if is := p.sctx.GetSessionVars().SnapshotInfoschema; is != nil { return is.(infoschema.InfoSchema) @@ -118,10 +135,12 @@ func (p *baseTxnContextProvider) GetTxnInfoSchema() infoschema.InfoSchema { return p.infoSchema } +// GetTxnScope returns the current txn scope func (p *baseTxnContextProvider) GetTxnScope() string { return p.sctx.GetSessionVars().TxnCtx.TxnScope } +// GetReadReplicaScope returns the read replica scope func (p *baseTxnContextProvider) GetReadReplicaScope() string { if txnScope := p.GetTxnScope(); txnScope != kv.GlobalTxnScope && txnScope != "" { // In local txn, we should use txnScope as the readReplicaScope @@ -137,6 +156,7 @@ func (p *baseTxnContextProvider) GetReadReplicaScope() string { return kv.GlobalReplicaScope } +//GetStmtReadTS returns the read timestamp used by select statement (not for select ... for update) func (p *baseTxnContextProvider) GetStmtReadTS() (uint64, error) { if _, err := p.ActivateTxn(); err != nil { return 0, err @@ -148,6 +168,7 @@ func (p *baseTxnContextProvider) GetStmtReadTS() (uint64, error) { return p.getStmtReadTSFunc() } +// GetStmtForUpdateTS returns the read timestamp used by update/insert/delete or select ... for update func (p *baseTxnContextProvider) GetStmtForUpdateTS() (uint64, error) { if _, err := p.ActivateTxn(); err != nil { return 0, err @@ -159,16 +180,19 @@ func (p *baseTxnContextProvider) GetStmtForUpdateTS() (uint64, error) { return p.getStmtForUpdateTSFunc() } +// OnStmtStart is the hook that should be called when a new statement started func (p *baseTxnContextProvider) OnStmtStart(ctx context.Context, _ ast.StmtNode) error { p.ctx = ctx return nil } +// OnStmtRetry is the hook that should be called when a statement is retried internally. func (p *baseTxnContextProvider) OnStmtRetry(ctx context.Context) error { p.ctx = ctx return nil } +// OnStmtErrorForNextAction is the hook that should be called when a new statement get an error func (p *baseTxnContextProvider) OnStmtErrorForNextAction(point sessiontxn.StmtErrorHandlePoint, err error) (sessiontxn.StmtErrorAction, error) { switch point { case sessiontxn.StmtErrAfterPessimisticLock: @@ -187,6 +211,7 @@ func (p *baseTxnContextProvider) getTxnStartTS() (uint64, error) { return txn.StartTS(), nil } +// ActivateTxn activates the transaction and set the relevant context variables. func (p *baseTxnContextProvider) ActivateTxn() (kv.Transaction, error) { if p.txn != nil { return p.txn, nil @@ -197,10 +222,6 @@ func (p *baseTxnContextProvider) ActivateTxn() (kv.Transaction, error) { } txnFuture := p.sctx.GetPreparedTxnFuture() - if txnFuture == nil { - return nil, errors.AddStack(kv.ErrInvalidTxn) - } - txn, err := txnFuture.Wait(p.ctx, p.sctx) if err != nil { return nil, err @@ -225,7 +246,7 @@ func (p *baseTxnContextProvider) ActivateTxn() (kv.Transaction, error) { txn.SetOption(kv.IsolationLevel, kv.RC) } - sessiontxn.SetTxnAssertionLevel(txn, sessVars.AssertionLevel) + internal.SetTxnAssertionLevel(txn, sessVars.AssertionLevel) if p.causalConsistencyOnly { txn.SetOption(kv.GuaranteeLinearizability, false) @@ -247,6 +268,8 @@ func (p *baseTxnContextProvider) ActivateTxn() (kv.Transaction, error) { return txn, nil } +// prepareTxn prepares txn with an oracle ts future. If the snapshotTS is set, +// the txn is prepared with it. func (p *baseTxnContextProvider) prepareTxn() error { if p.isTxnPrepared { return nil @@ -256,7 +279,19 @@ func (p *baseTxnContextProvider) prepareTxn() error { return p.prepareTxnWithTS(snapshotTS) } - future := sessiontxn.NewOracleFuture(p.ctx, p.sctx, p.sctx.GetSessionVars().TxnCtx.TxnScope) + future := newOracleFuture(p.ctx, p.sctx, p.sctx.GetSessionVars().TxnCtx.TxnScope) + return p.replaceTxnTsFuture(future) +} + +// prepareTxnWithOracleTS +// The difference between prepareTxnWithOracleTS and prepareTxn is that prepareTxnWithOracleTS +// does not consider snapshotTS +func (p *baseTxnContextProvider) prepareTxnWithOracleTS() error { + if p.isTxnPrepared { + return nil + } + + future := newOracleFuture(p.ctx, p.sctx, p.sctx.GetSessionVars().TxnCtx.TxnScope) return p.replaceTxnTsFuture(future) } @@ -342,7 +377,7 @@ func (p *baseTxnContextProvider) getSnapshotByTS(snapshotTS uint64) (kv.Snapshot } sessVars := p.sctx.GetSessionVars() - snapshot := sessiontxn.GetSnapshotWithTS(p.sctx, snapshotTS) + snapshot := internal.GetSnapshotWithTS(p.sctx, snapshotTS) replicaReadType := sessVars.GetReplicaRead() if replicaReadType.IsFollowerRead() && !sessVars.StmtCtx.RCCheckTS { @@ -351,3 +386,41 @@ func (p *baseTxnContextProvider) getSnapshotByTS(snapshotTS uint64) (kv.Snapshot return snapshot, nil } + +// canReuseTxnWhenExplicitBegin returns whether we should reuse the txn when starting a transaction explicitly +func canReuseTxnWhenExplicitBegin(sctx sessionctx.Context) bool { + sessVars := sctx.GetSessionVars() + txnCtx := sessVars.TxnCtx + // If BEGIN is the first statement in TxnCtx, we can reuse the existing transaction, without the + // need to call NewTxn, which commits the existing transaction and begins a new one. + // If the last un-committed/un-rollback transaction is a time-bounded read-only transaction, we should + // always create a new transaction. + // If the variable `tidb_snapshot` is set, we should always create a new transaction because the current txn may be + // initialized with snapshot ts. + return txnCtx.History == nil && !txnCtx.IsStaleness && sessVars.SnapshotTS == 0 +} + +// newOracleFuture creates new future according to the scope and the session context +func newOracleFuture(ctx context.Context, sctx sessionctx.Context, scope string) oracle.Future { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("isolation.newOracleFuture", opentracing.ChildOf(span.Context())) + defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) + } + + oracleStore := sctx.GetStore().GetOracle() + option := &oracle.Option{TxnScope: scope} + + if sctx.GetSessionVars().LowResolutionTSO { + return oracleStore.GetLowResolutionTimestampAsync(ctx, option) + } + return oracleStore.GetTimestampAsync(ctx, option) +} + +// funcFuture implements oracle.Future +type funcFuture func() (uint64, error) + +// Wait returns a ts got from the func +func (f funcFuture) Wait() (uint64, error) { + return f() +} diff --git a/sessiontxn/isolation/main_test.go b/sessiontxn/isolation/main_test.go index be85f098e31b6..aa8d031f70975 100644 --- a/sessiontxn/isolation/main_test.go +++ b/sessiontxn/isolation/main_test.go @@ -78,7 +78,7 @@ func (a *txnAssert[T]) Check(t testing.TB) { require.Equal(t, sessVars.CheckAndGetTxnScope(), txnCtx.TxnScope) require.Equal(t, sessVars.ShardAllocateStep, int64(txnCtx.ShardStep)) require.False(t, txnCtx.IsStaleness) - require.GreaterOrEqual(t, txnCtx.CreateTime.Nanosecond(), a.minStartTime.Nanosecond()) + require.GreaterOrEqual(t, txnCtx.CreateTime.UnixNano(), a.minStartTime.UnixNano()) require.Equal(t, a.inTxn, sessVars.InTxn()) require.Equal(t, a.inTxn, txnCtx.IsExplicit) require.Equal(t, a.couldRetry, txnCtx.CouldRetry) diff --git a/sessiontxn/isolation/optimistic_test.go b/sessiontxn/isolation/optimistic_test.go index 4d6c7f56fc23b..b8aae4b9bb2f9 100644 --- a/sessiontxn/isolation/optimistic_test.go +++ b/sessiontxn/isolation/optimistic_test.go @@ -43,6 +43,8 @@ func TestOptimisticTxnContextProviderTS(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + tk.MustExec("use test") tk.MustExec("create table t(id int primary key, v int)") @@ -132,6 +134,8 @@ func TestOptimisticHandleError(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + provider := initializeOptimisticProvider(t, tk, true) startTS := tk.Session().GetSessionVars().TxnCtx.StartTS checkTS := func() { @@ -214,6 +218,8 @@ func TestOptimisticProviderInitialize(t *testing.T) { defer clearScopeSettings() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() // begin outside a txn @@ -286,6 +292,8 @@ func TestTidbSnapshotVarInOptimisticTxn(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() tk.MustExec("set @@tx_isolation = 'READ-COMMITTED'") safePoint := "20160102-15:04:05 -0700" diff --git a/sessiontxn/isolation/readcommitted.go b/sessiontxn/isolation/readcommitted.go index 06adc9fcba4fc..d34d6c9405b1d 100644 --- a/sessiontxn/isolation/readcommitted.go +++ b/sessiontxn/isolation/readcommitted.go @@ -133,7 +133,7 @@ func (p *PessimisticRCTxnContextProvider) prepareStmtTS() { var stmtTSFuture oracle.Future switch { case p.stmtUseStartTS: - stmtTSFuture = sessiontxn.FuncFuture(p.getTxnStartTS) + stmtTSFuture = funcFuture(p.getTxnStartTS) case p.latestOracleTSValid && sessVars.StmtCtx.RCCheckTS: stmtTSFuture = sessiontxn.ConstantFuture(p.latestOracleTS) default: @@ -143,9 +143,9 @@ func (p *PessimisticRCTxnContextProvider) prepareStmtTS() { p.stmtTSFuture = stmtTSFuture } -func (p *PessimisticRCTxnContextProvider) getOracleFuture() sessiontxn.FuncFuture { +func (p *PessimisticRCTxnContextProvider) getOracleFuture() funcFuture { txnCtx := p.sctx.GetSessionVars().TxnCtx - future := sessiontxn.NewOracleFuture(p.ctx, p.sctx, txnCtx.TxnScope) + future := newOracleFuture(p.ctx, p.sctx, txnCtx.TxnScope) return func() (ts uint64, err error) { if ts, err = future.Wait(); err != nil { return @@ -219,14 +219,14 @@ func (p *PessimisticRCTxnContextProvider) handleAfterPessimisticLockError(lockEr // AdviseWarmup provides warmup for inner state func (p *PessimisticRCTxnContextProvider) AdviseWarmup() error { - if p.isTidbSnapshotEnabled() { - return nil - } - if err := p.prepareTxn(); err != nil { return err } - p.prepareStmtTS() + + if !p.isTidbSnapshotEnabled() { + p.prepareStmtTS() + } + return nil } diff --git a/sessiontxn/isolation/readcommitted_test.go b/sessiontxn/isolation/readcommitted_test.go index a0211d2cf83f0..2315546e89549 100644 --- a/sessiontxn/isolation/readcommitted_test.go +++ b/sessiontxn/isolation/readcommitted_test.go @@ -45,6 +45,8 @@ func TestPessimisticRCTxnContextProviderRCCheck(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + tk.MustExec("set @@tidb_rc_read_check_ts=1") se := tk.Session() provider := initializePessimisticRCProvider(t, tk) @@ -145,7 +147,11 @@ func TestPessimisticRCTxnContextProviderRCCheckForPrepareExecute(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + tk2 := testkit.NewTestKit(t, store) + defer tk2.MustExec("rollback") + tk.MustExec("use test") tk2.MustExec("use test") tk.MustExec("create table t (id int primary key, v int)") @@ -181,6 +187,8 @@ func TestPessimisticRCTxnContextProviderRCCheckForPrepareExecute(t *testing.T) { require.NoError(t, err) _, err = session.ResultSetToStringSlice(ctx, tk.Session(), rs) require.Error(t, err) + rs.Close() + ts, err = provider.GetStmtForUpdateTS() require.NoError(t, err) require.Greater(t, compareTS, ts) @@ -199,6 +207,8 @@ func TestPessimisticRCTxnContextProviderLockError(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() provider := initializePessimisticRCProvider(t, tk) @@ -236,6 +246,8 @@ func TestPessimisticRCTxnContextProviderTS(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() provider := initializePessimisticRCProvider(t, tk) compareTS := getOracleTS(t, se) @@ -293,6 +305,8 @@ func TestRCProviderInitialize(t *testing.T) { defer clearScopeSettings() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() tk.MustExec("set @@tx_isolation = 'READ-COMMITTED'") tk.MustExec("set @@tidb_txn_mode='pessimistic'") @@ -355,6 +369,8 @@ func TestTidbSnapshotVarInRC(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() tk.MustExec("set @@tx_isolation = 'READ-COMMITTED'") safePoint := "20160102-15:04:05 -0700" @@ -447,8 +463,12 @@ func TestConflictErrorsInRC(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") + se := tk.Session() + tk2 := testkit.NewTestKit(t, store) + defer tk2.MustExec("rollback") tk.MustExec("use test") tk2.MustExec("use test") diff --git a/sessiontxn/isolation/repeatable_read.go b/sessiontxn/isolation/repeatable_read.go index f09f9ca415e2a..2ea4bd41c5996 100644 --- a/sessiontxn/isolation/repeatable_read.go +++ b/sessiontxn/isolation/repeatable_read.go @@ -80,7 +80,7 @@ func (p *PessimisticRRTxnContextProvider) getForUpdateTs() (ts uint64, err error } txnCtx := p.sctx.GetSessionVars().TxnCtx - futureTS := sessiontxn.NewOracleFuture(p.ctx, p.sctx, txnCtx.TxnScope) + futureTS := newOracleFuture(p.ctx, p.sctx, txnCtx.TxnScope) if ts, err = futureTS.Wait(); err != nil { return 0, err diff --git a/sessiontxn/isolation/repeatable_read_test.go b/sessiontxn/isolation/repeatable_read_test.go index f8fc70fe8315a..fa8d988bb96c6 100644 --- a/sessiontxn/isolation/repeatable_read_test.go +++ b/sessiontxn/isolation/repeatable_read_test.go @@ -49,6 +49,7 @@ func TestPessimisticRRErrorHandle(t *testing.T) { store, _, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() provider := initializeRepeatableReadProvider(t, tk, true) @@ -139,6 +140,7 @@ func TestRepeatableReadProviderTS(t *testing.T) { store, _, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() provider := initializeRepeatableReadProvider(t, tk, true) @@ -198,6 +200,7 @@ func TestRepeatableReadProviderInitialize(t *testing.T) { defer clearScopeSettings() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk.MustExec("set @@tx_isolation = 'REPEATABLE-READ'") tk.MustExec("set @@tidb_txn_mode='pessimistic'") @@ -260,6 +263,7 @@ func TestTidbSnapshotVarInPessimisticRepeatableRead(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk.MustExec("set @@tx_isolation = 'REPEATABLE-READ'") safePoint := "20160102-15:04:05 -0700" @@ -477,6 +481,7 @@ func TestConflictErrorInInsertInRR(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk2 := testkit.NewTestKit(t, store) @@ -506,8 +511,10 @@ func TestConflictErrorInPointGetForUpdateInRR(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk2 := testkit.NewTestKit(t, store) + defer tk2.MustExec("rollback") tk.MustExec("use test") tk2.MustExec("use test") @@ -544,8 +551,10 @@ func TestConflictErrorInDeleteInRR(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk2 := testkit.NewTestKit(t, store) + defer tk2.MustExec("rollback") tk.MustExec("use test") tk2.MustExec("use test") @@ -582,8 +591,10 @@ func TestConflictErrorInUpdateInRR(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk2 := testkit.NewTestKit(t, store) + defer tk2.MustExec("rollback") tk.MustExec("use test") tk2.MustExec("use test") @@ -618,8 +629,10 @@ func TestConflictErrorInOtherQueryContainingPointGet(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk2 := testkit.NewTestKit(t, store) + defer tk2.MustExec("rollback") tk.MustExec("use test") tk2.MustExec("use test") diff --git a/sessiontxn/isolation/serializable_test.go b/sessiontxn/isolation/serializable_test.go index 90034e0934278..e16afd66ae868 100644 --- a/sessiontxn/isolation/serializable_test.go +++ b/sessiontxn/isolation/serializable_test.go @@ -42,6 +42,7 @@ func TestPessimisticSerializableTxnProviderTS(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() provider := initializePessimisticSerializableProvider(t, tk) @@ -75,6 +76,7 @@ func TestPessimisticSerializableTxnContextProviderLockError(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() provider := initializePessimisticSerializableProvider(t, tk) @@ -116,6 +118,7 @@ func TestSerializableInitialize(t *testing.T) { defer clearScopeSettings() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk.MustExec("set tidb_skip_isolation_level_check = 1") tk.MustExec("set @@tx_isolation = 'SERIALIZABLE'") @@ -179,6 +182,7 @@ func TestTidbSnapshotVarInSerialize(t *testing.T) { defer clean() tk := testkit.NewTestKit(t, store) + defer tk.MustExec("rollback") se := tk.Session() tk.MustExec("set tidb_skip_isolation_level_check = 1") tk.MustExec("set @@tx_isolation = 'SERIALIZABLE'") diff --git a/sessiontxn/staleread/BUILD.bazel b/sessiontxn/staleread/BUILD.bazel index d6272550153af..117623298d563 100644 --- a/sessiontxn/staleread/BUILD.bazel +++ b/sessiontxn/staleread/BUILD.bazel @@ -23,6 +23,7 @@ go_library( "//sessionctx", "//sessionctx/variable", "//sessiontxn", + "//sessiontxn/internal", "//table/temptable", "//types", "//util/dbterror", diff --git a/sessiontxn/staleread/provider.go b/sessiontxn/staleread/provider.go index 417154b7ea420..b7ff889c0e29c 100644 --- a/sessiontxn/staleread/provider.go +++ b/sessiontxn/staleread/provider.go @@ -16,6 +16,7 @@ package staleread import ( "context" + "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" @@ -25,6 +26,8 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/sessiontxn/internal" + "github.com/pingcap/tidb/table/temptable" ) // StalenessTxnContextProvider implements sessiontxn.TxnContextProvider @@ -83,19 +86,50 @@ func (p *StalenessTxnContextProvider) OnInitialize(ctx context.Context, tp sessi } } +// activateStaleTxn first commit old transaction if needed, and then prepare and activate a transaction +// with the staleness snapshot ts. After that, it sets the relevant context variables. func (p *StalenessTxnContextProvider) activateStaleTxn() error { - if err := p.sctx.NewStaleTxnWithStartTS(p.ctx, p.ts); err != nil { + var err error + if err = internal.CommitBeforeEnterNewTxn(p.ctx, p.sctx); err != nil { return err } - p.is = p.sctx.GetSessionVars().TxnCtx.InfoSchema.(infoschema.InfoSchema) - if err := p.sctx.GetSessionVars().SetSystemVar(variable.TiDBSnapshot, ""); err != nil { + + txnScope := kv.GlobalTxnScope + if err = p.sctx.PrepareTSFuture(p.ctx, sessiontxn.ConstantFuture(p.ts), txnScope); err != nil { return err } - txnCtx := p.sctx.GetSessionVars().TxnCtx - txnCtx.IsStaleness = true - txnCtx.InfoSchema = p.is - return nil + txnFuture := p.sctx.GetPreparedTxnFuture() + txn, err := txnFuture.Wait(p.ctx, p.sctx) + if err != nil { + return err + } + + sessVars := p.sctx.GetSessionVars() + txn.SetVars(sessVars.KVVars) + txn.SetOption(kv.IsStalenessReadOnly, true) + txn.SetOption(kv.TxnScope, txnScope) + internal.SetTxnAssertionLevel(txn, sessVars.AssertionLevel) + is, err := GetSessionSnapshotInfoSchema(p.sctx, p.ts) + if err != nil { + return errors.Trace(err) + } + sessVars.TxnCtx = &variable.TransactionContext{ + TxnCtxNoNeedToRestore: variable.TxnCtxNoNeedToRestore{ + InfoSchema: is, + CreateTime: time.Now(), + StartTS: txn.StartTS(), + ShardStep: int(sessVars.ShardAllocateStep), + IsStaleness: true, + TxnScope: txnScope, + }, + } + txn.SetOption(kv.SnapInterceptor, temptable.SessionSnapshotInterceptor(p.sctx)) + + p.is = is + err = p.sctx.GetSessionVars().SetSystemVar(variable.TiDBSnapshot, "") + + return err } func (p *StalenessTxnContextProvider) enterNewStaleTxnWithReplaceProvider() error { @@ -175,7 +209,7 @@ func (p *StalenessTxnContextProvider) GetSnapshotWithStmtReadTS() (kv.Snapshot, } sessVars := p.sctx.GetSessionVars() - snapshot := sessiontxn.GetSnapshotWithTS(p.sctx, p.ts) + snapshot := internal.GetSnapshotWithTS(p.sctx, p.ts) replicaReadType := sessVars.GetReplicaRead() if replicaReadType.IsFollowerRead() { diff --git a/sessiontxn/txn.go b/sessiontxn/txn.go deleted file mode 100644 index b986d1048ca5f..0000000000000 --- a/sessiontxn/txn.go +++ /dev/null @@ -1,99 +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 sessiontxn - -import ( - "context" - - "github.com/opentracing/opentracing-go" - "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/table/temptable" - "github.com/tikv/client-go/v2/oracle" -) - -// ConstantFuture implements oracle.Future -type ConstantFuture uint64 - -// Wait returns a constant ts -func (n ConstantFuture) Wait() (uint64, error) { - return uint64(n), nil -} - -// FuncFuture implements oracle.Future -type FuncFuture func() (uint64, error) - -// Wait returns a ts got from the func -func (f FuncFuture) Wait() (uint64, error) { - return f() -} - -// NewOracleFuture creates new future according to the scope and the session context -func NewOracleFuture(ctx context.Context, sctx sessionctx.Context, scope string) oracle.Future { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("sessiontxn.NewOracleFuture", opentracing.ChildOf(span.Context())) - defer span1.Finish() - ctx = opentracing.ContextWithSpan(ctx, span1) - } - - oracleStore := sctx.GetStore().GetOracle() - option := &oracle.Option{TxnScope: scope} - - if sctx.GetSessionVars().LowResolutionTSO { - return oracleStore.GetLowResolutionTimestampAsync(ctx, option) - } - return oracleStore.GetTimestampAsync(ctx, option) -} - -// CanReuseTxnWhenExplicitBegin returns whether we should reuse the txn when starting a transaction explicitly -func CanReuseTxnWhenExplicitBegin(sctx sessionctx.Context) bool { - sessVars := sctx.GetSessionVars() - txnCtx := sessVars.TxnCtx - // If BEGIN is the first statement in TxnCtx, we can reuse the existing transaction, without the - // need to call NewTxn, which commits the existing transaction and begins a new one. - // If the last un-committed/un-rollback transaction is a time-bounded read-only transaction, we should - // always create a new transaction. - // If the variable `tidb_snapshot` is set, we should always create a new transaction because the current txn may be - // initialized with snapshot ts. - return txnCtx.History == nil && !txnCtx.IsStaleness && sessVars.SnapshotTS == 0 -} - -// GetSnapshotWithTS returns a snapshot with ts. -func GetSnapshotWithTS(s sessionctx.Context, ts uint64) kv.Snapshot { - snap := s.GetStore().GetSnapshot(kv.Version{Ver: ts}) - snap.SetOption(kv.SnapInterceptor, temptable.SessionSnapshotInterceptor(s)) - if s.GetSessionVars().InRestrictedSQL { - snap.SetOption(kv.RequestSourceInternal, true) - } - if tp := s.GetSessionVars().RequestSourceType; tp != "" { - snap.SetOption(kv.RequestSourceType, tp) - } - return snap -} - -// SetTxnAssertionLevel sets assertion level of a transactin. Note that assertion level should be set only once just -// after creating a new transaction. -func SetTxnAssertionLevel(txn kv.Transaction, assertionLevel variable.AssertionLevel) { - switch assertionLevel { - case variable.AssertionLevelOff: - txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Off) - case variable.AssertionLevelFast: - txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Fast) - case variable.AssertionLevelStrict: - txn.SetOption(kv.AssertionLevel, kvrpcpb.AssertionLevel_Strict) - } -} diff --git a/sessiontxn/txn_manager_test.go b/sessiontxn/txn_manager_test.go index 983513fa44d03..94fb5cec60ab5 100644 --- a/sessiontxn/txn_manager_test.go +++ b/sessiontxn/txn_manager_test.go @@ -23,10 +23,14 @@ import ( "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessiontxn" + "github.com/pingcap/tidb/sessiontxn/internal" "github.com/pingcap/tidb/sessiontxn/staleread" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/tests/realtikvtest" "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" ) @@ -306,7 +310,7 @@ func TestGetSnapshot(t *testing.T) { check: func(t *testing.T, sctx sessionctx.Context) { ts, err := mgr.GetStmtReadTS() require.NoError(t, err) - compareSnap := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap := internal.GetSnapshotWithTS(sctx, ts) snap, err := mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap, snap)) @@ -316,7 +320,7 @@ func TestGetSnapshot(t *testing.T) { tk.MustQuery("select * from t for update").Check(testkit.Rows("1", "3", "10")) ts, err = mgr.GetStmtForUpdateTS() require.NoError(t, err) - compareSnap2 := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap2 := internal.GetSnapshotWithTS(sctx, ts) snap, err = mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.False(t, isSnapshotEqual(t, compareSnap2, snap)) @@ -336,7 +340,7 @@ func TestGetSnapshot(t *testing.T) { check: func(t *testing.T, sctx sessionctx.Context) { ts, err := mgr.GetStmtReadTS() require.NoError(t, err) - compareSnap := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap := internal.GetSnapshotWithTS(sctx, ts) snap, err := mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap, snap)) @@ -346,7 +350,7 @@ func TestGetSnapshot(t *testing.T) { tk.MustQuery("select * from t").Check(testkit.Rows("1", "3", "10")) ts, err = mgr.GetStmtForUpdateTS() require.NoError(t, err) - compareSnap2 := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap2 := internal.GetSnapshotWithTS(sctx, ts) snap, err = mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap2, snap)) @@ -365,7 +369,7 @@ func TestGetSnapshot(t *testing.T) { check: func(t *testing.T, sctx sessionctx.Context) { ts, err := mgr.GetStmtReadTS() require.NoError(t, err) - compareSnap := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap := internal.GetSnapshotWithTS(sctx, ts) snap, err := mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap, snap)) @@ -375,7 +379,7 @@ func TestGetSnapshot(t *testing.T) { tk.MustQuery("select * from t for update").Check(testkit.Rows("1", "3")) ts, err = mgr.GetStmtForUpdateTS() require.NoError(t, err) - compareSnap2 := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap2 := internal.GetSnapshotWithTS(sctx, ts) snap, err = mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap2, snap)) @@ -396,7 +400,7 @@ func TestGetSnapshot(t *testing.T) { check: func(t *testing.T, sctx sessionctx.Context) { ts, err := mgr.GetStmtReadTS() require.NoError(t, err) - compareSnap := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap := internal.GetSnapshotWithTS(sctx, ts) snap, err := mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap, snap)) @@ -406,7 +410,7 @@ func TestGetSnapshot(t *testing.T) { tk.MustQuery("select * from t for update").Check(testkit.Rows("1", "3")) ts, err = mgr.GetStmtForUpdateTS() require.NoError(t, err) - compareSnap2 := sessiontxn.GetSnapshotWithTS(sctx, ts) + compareSnap2 := internal.GetSnapshotWithTS(sctx, ts) snap, err = mgr.GetSnapshotWithStmtReadTS() require.NoError(t, err) require.True(t, isSnapshotEqual(t, compareSnap2, snap)) @@ -440,6 +444,65 @@ func TestGetSnapshot(t *testing.T) { } } +func TestSnapshotInterceptor(t *testing.T) { + store, clean := realtikvtest.CreateMockStoreAndSetup(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("create temporary table test.tmp1 (id int primary key)") + tbl, err := tk.Session().GetDomainInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tmp1")) + require.NoError(t, err) + require.Equal(t, model.TempTableLocal, tbl.Meta().TempTableType) + tblID := tbl.Meta().ID + + // prepare a kv pair for temporary table + k := append(tablecodec.EncodeTablePrefix(tblID), 1) + require.NoError(t, tk.Session().GetSessionVars().TemporaryTableData.SetTableKey(tblID, k, []byte("v1"))) + + initTxnFuncs := []func() error{ + func() error { + err := tk.Session().PrepareTxnCtx(context.TODO()) + if err == nil { + err = sessiontxn.GetTxnManager(tk.Session()).AdviseWarmup() + } + return err + }, + func() error { + return sessiontxn.NewTxn(context.Background(), tk.Session()) + }, + func() error { + return sessiontxn.GetTxnManager(tk.Session()).EnterNewTxn(context.TODO(), &sessiontxn.EnterNewTxnRequest{ + Type: sessiontxn.EnterNewTxnWithBeginStmt, + StaleReadTS: 0, + }) + }, + } + + for _, initFunc := range initTxnFuncs { + require.NoError(t, initFunc()) + + require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).OnStmtStart(context.TODO(), nil)) + txn, err := tk.Session().Txn(true) + require.NoError(t, err) + + val, err := txn.Get(context.Background(), k) + require.NoError(t, err) + require.Equal(t, []byte("v1"), val) + + val, err = txn.GetSnapshot().Get(context.Background(), k) + require.NoError(t, err) + require.Equal(t, []byte("v1"), val) + + tk.Session().RollbackTxn(context.Background()) + } + + // Also check GetSnapshotWithTS + snap := internal.GetSnapshotWithTS(tk.Session(), 0) + val, err := snap.Get(context.Background(), k) + require.NoError(t, err) + require.Equal(t, []byte("v1"), val) +} + func checkBasicActiveTxn(t *testing.T, sctx sessionctx.Context) kv.Transaction { txn, err := sctx.Txn(false) require.NoError(t, err) diff --git a/statistics/builder.go b/statistics/builder.go index fee2f55e0860d..1cc821de0b962 100644 --- a/statistics/builder.go +++ b/statistics/builder.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/memory" ) // SortedBuilder is used to build histograms for PK and index. @@ -130,7 +131,7 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa } hg := NewHistogram(id, ndv, nullCount, 0, tp, int(numBuckets), collector.TotalSize) - corrXYSum, err := buildHist(sc, hg, samples, count, ndv, numBuckets) + corrXYSum, err := buildHist(sc, hg, samples, count, ndv, numBuckets, nil) if err != nil { return nil, err } @@ -140,7 +141,7 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa // buildHist builds histogram from samples and other information. // It stores the built histogram in hg and return corrXYSum used for calculating the correlation. -func buildHist(sc *stmtctx.StatementContext, hg *Histogram, samples []*SampleItem, count, ndv, numBuckets int64) (corrXYSum float64, err error) { +func buildHist(sc *stmtctx.StatementContext, hg *Histogram, samples []*SampleItem, count, ndv, numBuckets int64, memTracker *memory.Tracker) (corrXYSum float64, err error) { sampleNum := int64(len(samples)) // As we use samples to build the histogram, the bucket number and repeat should multiply a factor. sampleFactor := float64(count) / float64(sampleNum) @@ -157,9 +158,24 @@ func buildHist(sc *stmtctx.StatementContext, hg *Histogram, samples []*SampleIte var lastCount int64 corrXYSum = float64(0) hg.AppendBucket(&samples[0].Value, &samples[0].Value, int64(sampleFactor), int64(ndvFactor)) + bufferedMemSize := int64(0) + bufferedReleaseSize := int64(0) + defer func() { + if memTracker != nil { + memTracker.Consume(bufferedMemSize) + memTracker.Release(bufferedReleaseSize) + } + }() for i := int64(1); i < sampleNum; i++ { corrXYSum += float64(i) * float64(samples[i].Ordinal) - cmp, err := hg.GetUpper(bucketIdx).Compare(sc, &samples[i].Value, collate.GetBinaryCollator()) + upper := hg.GetUpper(bucketIdx) + if memTracker != nil { + // tmp memory usage + deltaSize := upper.MemUsage() + memTracker.BufferedConsume(&bufferedMemSize, deltaSize) + memTracker.BufferedRelease(&bufferedReleaseSize, deltaSize) + } + cmp, err := upper.Compare(sc, &samples[i].Value, collate.GetBinaryCollator()) if err != nil { return 0, errors.Trace(err) } @@ -221,11 +237,27 @@ func BuildHistAndTopN( collector *SampleCollector, tp *types.FieldType, isColumn bool, + memTracker *memory.Tracker, ) (*Histogram, *TopN, error) { + bufferedMemSize := int64(0) + bufferedReleaseSize := int64(0) + defer func() { + if memTracker != nil { + memTracker.Consume(bufferedMemSize) + memTracker.Release(bufferedReleaseSize) + } + }() var getComparedBytes func(datum types.Datum) ([]byte, error) if isColumn { getComparedBytes = func(datum types.Datum) ([]byte, error) { - return codec.EncodeKey(ctx.GetSessionVars().StmtCtx, nil, datum) + encoded, err := codec.EncodeKey(ctx.GetSessionVars().StmtCtx, nil, datum) + if memTracker != nil { + // tmp memory usage + deltaSize := int64(cap(encoded)) + memTracker.BufferedConsume(&bufferedMemSize, deltaSize) + memTracker.BufferedRelease(&bufferedReleaseSize, deltaSize) + } + return encoded, err } } else { getComparedBytes = func(datum types.Datum) ([]byte, error) { @@ -363,7 +395,7 @@ func BuildHistAndTopN( // Step3: build histogram with the rest samples if len(samples) > 0 { - _, err = buildHist(sc, hg, samples, count-int64(topn.TotalCount()), ndv-int64(len(topn.TopN)), int64(numBuckets)) + _, err = buildHist(sc, hg, samples, count-int64(topn.TotalCount()), ndv-int64(len(topn.TopN)), int64(numBuckets), memTracker) if err != nil { return nil, nil, err } diff --git a/statistics/cmsketch.go b/statistics/cmsketch.go index 10505fb616ef0..44ce8d224e7bf 100644 --- a/statistics/cmsketch.go +++ b/statistics/cmsketch.go @@ -169,6 +169,9 @@ func calculateDefaultVal(helper *topNHelper, estimateNDV, scaleRatio, rowCount u // data are not tracked because size of CMSketch.topN take little influence // We ignore the size of other metadata in CMSketch. func (c *CMSketch) MemoryUsage() (sum int64) { + if c == nil { + return + } sum = int64(c.depth * c.width * 4) return } @@ -775,6 +778,8 @@ func MergePartTopN2GlobalTopN(sc *stmtctx.StatementContext, version int, topNs [ if types.IsTypeTime(hists[0].Tp.GetType()) { // handle datetime values specially since they are encoded to int and we'll get int values if using DecodeOne. _, d, err = codec.DecodeAsDateTime(val.Encoded, hists[0].Tp.GetType(), sc.TimeZone) + } else if types.IsTypeFloat(hists[0].Tp.GetType()) { + _, d, err = codec.DecodeAsFloat32(val.Encoded, hists[0].Tp.GetType()) } else { _, d, err = codec.DecodeOne(val.Encoded) } diff --git a/statistics/column.go b/statistics/column.go new file mode 100644 index 0000000000000..252639576bb8d --- /dev/null +++ b/statistics/column.go @@ -0,0 +1,451 @@ +// 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 statistics + +import ( + "math" + "strconv" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/ranger" + "go.uber.org/zap" +) + +// Column represents a column histogram. +type Column struct { + Histogram + CMSketch *CMSketch + TopN *TopN + FMSketch *FMSketch + PhysicalID int64 + Count int64 + Info *model.ColumnInfo + IsHandle bool + ErrorRate + Flag int64 + LastAnalyzePos types.Datum + StatsVer int64 // StatsVer is the version of the current stats, used to maintain compatibility + + // StatsLoadedStatus indicates the status of column statistics + StatsLoadedStatus +} + +func (c *Column) String() string { + return c.Histogram.ToString(0) +} + +// TotalRowCount returns the total count of this column. +func (c *Column) TotalRowCount() float64 { + if c.StatsVer >= Version2 { + return c.Histogram.TotalRowCount() + float64(c.TopN.TotalCount()) + } + return c.Histogram.TotalRowCount() +} + +func (c *Column) notNullCount() float64 { + if c.StatsVer >= Version2 { + return c.Histogram.notNullCount() + float64(c.TopN.TotalCount()) + } + return c.Histogram.notNullCount() +} + +// GetIncreaseFactor get the increase factor to adjust the final estimated count when the table is modified. +func (c *Column) GetIncreaseFactor(realtimeRowCount int64) float64 { + columnCount := c.TotalRowCount() + if columnCount == 0 { + // avoid dividing by 0 + return 1.0 + } + return float64(realtimeRowCount) / columnCount +} + +// MemoryUsage returns the total memory usage of Histogram, CMSketch, FMSketch in Column. +// We ignore the size of other metadata in Column +func (c *Column) MemoryUsage() CacheItemMemoryUsage { + var sum int64 + columnMemUsage := &ColumnMemUsage{ + ColumnID: c.Info.ID, + } + histogramMemUsage := c.Histogram.MemoryUsage() + columnMemUsage.HistogramMemUsage = histogramMemUsage + sum = histogramMemUsage + if c.CMSketch != nil { + cmSketchMemUsage := c.CMSketch.MemoryUsage() + columnMemUsage.CMSketchMemUsage = cmSketchMemUsage + sum += cmSketchMemUsage + } + if c.TopN != nil { + topnMemUsage := c.TopN.MemoryUsage() + columnMemUsage.TopNMemUsage = topnMemUsage + sum += topnMemUsage + } + if c.FMSketch != nil { + fmSketchMemUsage := c.FMSketch.MemoryUsage() + columnMemUsage.FMSketchMemUsage = fmSketchMemUsage + sum += fmSketchMemUsage + } + columnMemUsage.TotalMemUsage = sum + return columnMemUsage +} + +// HistogramNeededItems stores the columns/indices whose Histograms need to be loaded from physical kv layer. +// Currently, we only load index/pk's Histogram from kv automatically. Columns' are loaded by needs. +var HistogramNeededItems = neededStatsMap{items: map[model.TableItemID]struct{}{}} + +// IsInvalid checks if this column is invalid. If this column has histogram but not loaded yet, then we mark it +// as need histogram. +func (c *Column) IsInvalid(sctx sessionctx.Context, collPseudo bool) bool { + if collPseudo && c.NotAccurate() { + return true + } + if sctx != nil { + stmtctx := sctx.GetSessionVars().StmtCtx + if stmtctx != nil && stmtctx.StatsLoad.Fallback { + return true + } + if 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)) + } + // In some tests, the c.Info is not set, so we add this check here. + if c.Info != nil { + HistogramNeededItems.insert(model.TableItemID{TableID: c.PhysicalID, ID: c.Info.ID, IsIndex: false}) + } + } + } + // In some cases, some statistics in column would be evicted + // For example: the cmsketch of the column might be evicted while the histogram and the topn are still exists + // In this case, we will think this column as valid due to we can still use the rest of the statistics to do optimize. + return c.TotalRowCount() == 0 || (!c.IsEssentialStatsLoaded() && c.Histogram.NDV > 0) +} + +// IsHistNeeded checks if this column needs histogram to be loaded +func (c *Column) IsHistNeeded(collPseudo bool) bool { + return (!collPseudo || !c.NotAccurate()) && c.IsLoadNeeded() +} + +func (c *Column) equalRowCount(sctx sessionctx.Context, val types.Datum, encodedVal []byte, realtimeRowCount int64) (float64, error) { + if val.IsNull() { + return float64(c.NullCount), nil + } + if c.StatsVer < Version2 { + // All the values are null. + if c.Histogram.Bounds.NumRows() == 0 { + return 0.0, nil + } + if c.Histogram.NDV > 0 && c.outOfRange(val) { + return outOfRangeEQSelectivity(c.Histogram.NDV, realtimeRowCount, int64(c.TotalRowCount())) * c.TotalRowCount(), nil + } + if c.CMSketch != nil { + count, err := queryValue(sctx.GetSessionVars().StmtCtx, c.CMSketch, c.TopN, val) + return float64(count), errors.Trace(err) + } + histRowCount, _ := c.Histogram.equalRowCount(val, false) + return histRowCount, nil + } + + // Stats version == 2 + // All the values are null. + if c.Histogram.Bounds.NumRows() == 0 && c.TopN.Num() == 0 { + return 0, nil + } + // 1. try to find this value in TopN + if c.TopN != nil { + rowcount, ok := c.TopN.QueryTopN(encodedVal) + if ok { + return float64(rowcount), nil + } + } + // 2. try to find this value in bucket.Repeat(the last value in every bucket) + histCnt, matched := c.Histogram.equalRowCount(val, true) + if matched { + return histCnt, nil + } + // 3. use uniform distribution assumption for the rest (even when this value is not covered by the range of stats) + histNDV := float64(c.Histogram.NDV - int64(c.TopN.Num())) + if histNDV <= 0 { + return 0, nil + } + return c.Histogram.notNullCount() / histNDV, nil +} + +// GetColumnRowCount estimates the row count by a slice of Range. +func (c *Column) GetColumnRowCount(sctx sessionctx.Context, ranges []*ranger.Range, realtimeRowCount int64, pkIsHandle bool) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx + var rowCount float64 + for _, rg := range ranges { + highVal := *rg.HighVal[0].Clone() + lowVal := *rg.LowVal[0].Clone() + if highVal.Kind() == types.KindString { + highVal.SetBytes(collate.GetCollator(highVal.Collation()).Key(highVal.GetString())) + } + if lowVal.Kind() == types.KindString { + lowVal.SetBytes(collate.GetCollator(lowVal.Collation()).Key(lowVal.GetString())) + } + cmp, err := lowVal.Compare(sc, &highVal, collate.GetBinaryCollator()) + if err != nil { + return 0, errors.Trace(err) + } + lowEncoded, err := codec.EncodeKey(sc, nil, lowVal) + if err != nil { + return 0, err + } + highEncoded, err := codec.EncodeKey(sc, nil, highVal) + if err != nil { + return 0, err + } + if cmp == 0 { + // case 1: it's a point + if !rg.LowExclude && !rg.HighExclude { + // In this case, the row count is at most 1. + if pkIsHandle { + rowCount += 1 + continue + } + var cnt float64 + cnt, err = c.equalRowCount(sctx, lowVal, lowEncoded, realtimeRowCount) + if err != nil { + return 0, errors.Trace(err) + } + // If the current table row count has changed, we should scale the row count accordingly. + cnt *= c.GetIncreaseFactor(realtimeRowCount) + rowCount += cnt + } + continue + } + // In stats ver 1, we use CM Sketch to estimate row count for point condition, which is more accurate. + // So for the small range, we convert it to points. + if c.StatsVer < 2 { + rangeVals := enumRangeValues(lowVal, highVal, rg.LowExclude, rg.HighExclude) + + // case 2: it's a small range && using ver1 stats + if rangeVals != nil { + for _, val := range rangeVals { + cnt, err := c.equalRowCount(sctx, val, lowEncoded, realtimeRowCount) + if err != nil { + return 0, err + } + // If the current table row count has changed, we should scale the row count accordingly. + cnt *= c.GetIncreaseFactor(realtimeRowCount) + rowCount += cnt + } + + continue + } + } + + // case 3: it's an interval + cnt := c.BetweenRowCount(sctx, lowVal, highVal, lowEncoded, highEncoded) + // `betweenRowCount` returns count for [l, h) range, we adjust cnt for boundaries here. + // Note that, `cnt` does not include null values, we need specially handle cases + // where null is the lower bound. + // And because we use (2, MaxValue] to represent expressions like a > 2 and use [MinNotNull, 3) to represent + // expressions like b < 3, we need to exclude the special values. + if rg.LowExclude && !lowVal.IsNull() && lowVal.Kind() != types.KindMaxValue && lowVal.Kind() != types.KindMinNotNull { + lowCnt, err := c.equalRowCount(sctx, lowVal, lowEncoded, realtimeRowCount) + if err != nil { + return 0, errors.Trace(err) + } + cnt -= lowCnt + cnt = mathutil.Clamp(cnt, 0, c.notNullCount()) + } + if !rg.LowExclude && lowVal.IsNull() { + cnt += float64(c.NullCount) + } + if !rg.HighExclude && highVal.Kind() != types.KindMaxValue && highVal.Kind() != types.KindMinNotNull { + highCnt, err := c.equalRowCount(sctx, highVal, highEncoded, realtimeRowCount) + if err != nil { + return 0, errors.Trace(err) + } + cnt += highCnt + } + + cnt = mathutil.Clamp(cnt, 0, c.TotalRowCount()) + + // If the current table row count has changed, we should scale the row count accordingly. + cnt *= c.GetIncreaseFactor(realtimeRowCount) + + // handling the out-of-range part + if (c.outOfRange(lowVal) && !lowVal.IsNull()) || c.outOfRange(highVal) { + increaseCount := realtimeRowCount - int64(c.TotalRowCount()) + if increaseCount < 0 { + increaseCount = 0 + } + cnt += c.Histogram.outOfRangeRowCount(&lowVal, &highVal, increaseCount) + } + + rowCount += cnt + } + rowCount = mathutil.Clamp(rowCount, 0, float64(realtimeRowCount)) + return rowCount, nil +} + +// ItemID implements TableCacheItem +func (c *Column) ItemID() int64 { + return c.Info.ID +} + +// DropEvicted implements TableCacheItem +// DropEvicted drops evicted structures +func (c *Column) DropEvicted() { + if !c.statsInitialized { + return + } + switch c.evictedStatus { + case allLoaded: + if c.CMSketch != nil && c.StatsVer < Version2 { + c.dropCMS() + return + } + // For stats version2, there is no cms thus we directly drop topn + c.dropTopN() + return + case onlyCmsEvicted: + c.dropTopN() + return + default: + return + } +} + +func (c *Column) dropCMS() { + c.CMSketch = nil + c.evictedStatus = onlyCmsEvicted +} + +func (c *Column) dropTopN() { + originTopNNum := int64(c.TopN.Num()) + c.TopN = nil + if len(c.Histogram.Buckets) == 0 && originTopNNum >= c.Histogram.NDV { + // This indicates column has topn instead of histogram + c.evictedStatus = allEvicted + } else { + c.evictedStatus = onlyHistRemained + } +} + +// IsAllEvicted indicates whether all stats evicted +func (c *Column) IsAllEvicted() bool { + return c.statsInitialized && c.evictedStatus >= allEvicted +} + +func (c *Column) getEvictedStatus() int { + return c.evictedStatus +} + +func (c *Column) isStatsInitialized() bool { + return c.statsInitialized +} + +func (c *Column) statsVer() int64 { + return c.StatsVer +} + +func (c *Column) isCMSExist() bool { + return c.CMSketch != nil +} + +// AvgColSize is the average column size of the histogram. These sizes are derived from function `encode` +// and `Datum::ConvertTo`, so we need to update them if those 2 functions are changed. +func (c *Column) AvgColSize(count int64, isKey bool) float64 { + if count == 0 { + return 0 + } + // Note that, if the handle column is encoded as value, instead of key, i.e, + // when the handle column is in a unique index, the real column size may be + // smaller than 8 because it is encoded using `EncodeVarint`. Since we don't + // know the exact value size now, use 8 as approximation. + if c.IsHandle { + return 8 + } + histCount := c.TotalRowCount() + notNullRatio := 1.0 + if histCount > 0 { + notNullRatio = 1.0 - float64(c.NullCount)/histCount + } + switch c.Histogram.Tp.GetType() { + case mysql.TypeFloat, mysql.TypeDouble, mysql.TypeDuration, mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp: + return 8 * notNullRatio + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear, mysql.TypeEnum, mysql.TypeBit, mysql.TypeSet: + if isKey { + return 8 * notNullRatio + } + } + // Keep two decimal place. + return math.Round(float64(c.TotColSize)/float64(count)*100) / 100 +} + +// AvgColSizeChunkFormat is the average column size of the histogram. These sizes are derived from function `Encode` +// and `DecodeToChunk`, so we need to update them if those 2 functions are changed. +func (c *Column) AvgColSizeChunkFormat(count int64) float64 { + if count == 0 { + return 0 + } + fixedLen := chunk.GetFixedLen(c.Histogram.Tp) + if fixedLen != -1 { + return float64(fixedLen) + } + // Keep two decimal place. + // Add 8 bytes for unfixed-len type's offsets. + // Minus Log2(avgSize) for unfixed-len type LEN. + avgSize := float64(c.TotColSize) / float64(count) + if avgSize < 1 { + return math.Round(avgSize*100)/100 + 8 + } + return math.Round((avgSize-math.Log2(avgSize))*100)/100 + 8 +} + +// AvgColSizeListInDisk is the average column size of the histogram. These sizes are derived +// from `chunk.ListInDisk` so we need to update them if those 2 functions are changed. +func (c *Column) AvgColSizeListInDisk(count int64) float64 { + if count == 0 { + return 0 + } + histCount := c.TotalRowCount() + notNullRatio := 1.0 + if histCount > 0 { + notNullRatio = 1.0 - float64(c.NullCount)/histCount + } + size := chunk.GetFixedLen(c.Histogram.Tp) + if size != -1 { + return float64(size) * notNullRatio + } + // Keep two decimal place. + // Minus Log2(avgSize) for unfixed-len type LEN. + avgSize := float64(c.TotColSize) / float64(count) + if avgSize < 1 { + return math.Round((avgSize)*100) / 100 + } + return math.Round((avgSize-math.Log2(avgSize))*100) / 100 +} + +// BetweenRowCount estimates the row count for interval [l, r). +func (c *Column) BetweenRowCount(sctx sessionctx.Context, l, r types.Datum, lowEncoded, highEncoded []byte) float64 { + histBetweenCnt := c.Histogram.BetweenRowCount(l, r) + if c.StatsVer <= Version1 { + return histBetweenCnt + } + return float64(c.TopN.BetweenCount(lowEncoded, highEncoded)) + histBetweenCnt +} diff --git a/statistics/handle/handle.go b/statistics/handle/handle.go index db7bc68deed58..edad1783a5e0d 100644 --- a/statistics/handle/handle.go +++ b/statistics/handle/handle.go @@ -134,11 +134,12 @@ func (h *Handle) execRestrictedSQL(ctx context.Context, sql string, params ...in }) } -func (h *Handle) execRestrictedSQLWithStatsVer(ctx context.Context, statsVer int, procTrackID uint64, sql string, params ...interface{}) ([]chunk.Row, []*ast.ResultField, error) { +func (h *Handle) execRestrictedSQLWithStatsVer(ctx context.Context, statsVer int, procTrackID uint64, analyzeSnapshot bool, sql string, params ...interface{}) ([]chunk.Row, []*ast.ResultField, error) { ctx = kv.WithInternalSourceType(ctx, kv.InternalTxnStats) return h.withRestrictedSQLExecutor(ctx, func(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) ([]chunk.Row, []*ast.ResultField, error) { optFuncs := []sqlexec.OptionFuncAlias{ execOptionForAnalyze[statsVer], + sqlexec.GetAnalyzeSnapshotOption(analyzeSnapshot), sqlexec.GetPartitionPruneModeOption(string(h.CurrentPruneMode())), sqlexec.ExecOptionUseCurSession, sqlexec.ExecOptionWithSysProcTrack(procTrackID, h.sysProcTracker.Track, h.sysProcTracker.UnTrack), @@ -212,9 +213,9 @@ func NewHandle(ctx sessionctx.Context, lease time.Duration, pool sessionPool, tr handle.feedback.data = statistics.NewQueryFeedbackMap() handle.colMap.data = make(colStatsUsageMap) handle.StatsLoad.SubCtxs = make([]sessionctx.Context, cfg.Performance.StatsLoadConcurrency) - handle.StatsLoad.NeededColumnsCh = make(chan *NeededColumnTask, cfg.Performance.StatsLoadQueueSize) - handle.StatsLoad.TimeoutColumnsCh = make(chan *NeededColumnTask, cfg.Performance.StatsLoadQueueSize) - handle.StatsLoad.WorkingColMap = map[model.TableColumnID][]chan model.TableColumnID{} + handle.StatsLoad.NeededItemsCh = make(chan *NeededItemTask, cfg.Performance.StatsLoadQueueSize) + handle.StatsLoad.TimeoutItemsCh = make(chan *NeededItemTask, cfg.Performance.StatsLoadQueueSize) + handle.StatsLoad.WorkingColMap = map[model.TableItemID][]chan model.TableItemID{} err := handle.RefreshVars() if err != nil { return nil, err @@ -2015,7 +2016,7 @@ func (h *Handle) getDisableColumnTrackingTime() (*time.Time, error) { } // LoadColumnStatsUsage loads column stats usage information from disk. -func (h *Handle) LoadColumnStatsUsage(loc *time.Location) (map[model.TableColumnID]colStatsTimeInfo, error) { +func (h *Handle) LoadColumnStatsUsage(loc *time.Location) (map[model.TableItemID]colStatsTimeInfo, error) { disableTime, err := h.getDisableColumnTrackingTime() if err != nil { return nil, errors.Trace(err) @@ -2026,12 +2027,12 @@ func (h *Handle) LoadColumnStatsUsage(loc *time.Location) (map[model.TableColumn if err != nil { return nil, errors.Trace(err) } - colStatsMap := make(map[model.TableColumnID]colStatsTimeInfo, len(rows)) + colStatsMap := make(map[model.TableItemID]colStatsTimeInfo, len(rows)) for _, row := range rows { if row.IsNull(0) || row.IsNull(1) { continue } - tblColID := model.TableColumnID{TableID: row.GetInt64(0), ColumnID: row.GetInt64(1)} + tblColID := model.TableItemID{TableID: row.GetInt64(0), ID: row.GetInt64(1), IsIndex: false} var statsUsage colStatsTimeInfo if !row.IsNull(2) { gt, err := row.GetTime(2).GoTime(time.UTC) diff --git a/statistics/handle/handle_hist.go b/statistics/handle/handle_hist.go index 36af151ce19db..cf91a407f1a77 100644 --- a/statistics/handle/handle_hist.go +++ b/statistics/handle/handle_hist.go @@ -15,6 +15,7 @@ package handle import ( + "fmt" "sync" "time" @@ -23,42 +24,49 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" ) +type statsWrapper struct { + col *statistics.Column + idx *statistics.Index +} + // StatsLoad is used to load stats concurrently type StatsLoad struct { sync.Mutex - SubCtxs []sessionctx.Context - NeededColumnsCh chan *NeededColumnTask - TimeoutColumnsCh chan *NeededColumnTask - WorkingColMap map[model.TableColumnID][]chan model.TableColumnID + SubCtxs []sessionctx.Context + NeededItemsCh chan *NeededItemTask + TimeoutItemsCh chan *NeededItemTask + WorkingColMap map[model.TableItemID][]chan model.TableItemID } -// NeededColumnTask represents one needed column with expire time. -type NeededColumnTask struct { - TableColumnID model.TableColumnID - ToTimeout time.Time - ResultCh chan model.TableColumnID +// NeededItemTask represents one needed column/indices with expire time. +type NeededItemTask struct { + TableItemID model.TableItemID + ToTimeout time.Time + ResultCh chan model.TableItemID } // SendLoadRequests send neededColumns requests -func (h *Handle) SendLoadRequests(sc *stmtctx.StatementContext, neededColumns []model.TableColumnID, timeout time.Duration) error { - missingColumns := h.genHistMissingColumns(neededColumns) - if len(missingColumns) <= 0 { +func (h *Handle) SendLoadRequests(sc *stmtctx.StatementContext, neededHistItems []model.TableItemID, timeout time.Duration) error { + remainedItems := h.removeHistLoadedColumns(neededHistItems) + if len(remainedItems) <= 0 { return nil } sc.StatsLoad.Timeout = timeout - sc.StatsLoad.NeededColumns = missingColumns - sc.StatsLoad.ResultCh = make(chan model.TableColumnID, len(missingColumns)) - for _, col := range missingColumns { - err := h.AppendNeededColumn(col, sc.StatsLoad.ResultCh, timeout) + sc.StatsLoad.NeededItems = remainedItems + sc.StatsLoad.ResultCh = make(chan model.TableItemID, len(remainedItems)) + for _, col := range remainedItems { + err := h.AppendNeededItem(col, sc.StatsLoad.ResultCh, timeout) if err != nil { return err } @@ -69,14 +77,14 @@ func (h *Handle) SendLoadRequests(sc *stmtctx.StatementContext, neededColumns [] // SyncWaitStatsLoad sync waits loading of neededColumns and return false if timeout func (h *Handle) SyncWaitStatsLoad(sc *stmtctx.StatementContext) bool { - if len(sc.StatsLoad.NeededColumns) <= 0 { + if len(sc.StatsLoad.NeededItems) <= 0 { return true } defer func() { - sc.StatsLoad.NeededColumns = nil + sc.StatsLoad.NeededItems = nil }() - resultCheckMap := map[model.TableColumnID]struct{}{} - for _, col := range sc.StatsLoad.NeededColumns { + resultCheckMap := map[model.TableItemID]struct{}{} + for _, col := range sc.StatsLoad.NeededItems { resultCheckMap[col] = struct{}{} } metrics.SyncLoadCounter.Inc() @@ -101,31 +109,35 @@ func (h *Handle) SyncWaitStatsLoad(sc *stmtctx.StatementContext) bool { } } -// genHistMissingColumns generates hist-missing columns based on neededColumns and statsCache. -func (h *Handle) genHistMissingColumns(neededColumns []model.TableColumnID) []model.TableColumnID { +// removeHistLoadedColumns removed having-hist columns based on neededColumns and statsCache. +func (h *Handle) removeHistLoadedColumns(neededItems []model.TableItemID) []model.TableItemID { statsCache := h.statsCache.Load().(statsCache) - missingColumns := make([]model.TableColumnID, 0, len(neededColumns)) - for _, col := range neededColumns { - tbl, ok := statsCache.Get(col.TableID) + remainedItems := make([]model.TableItemID, 0, len(neededItems)) + for _, item := range neededItems { + tbl, ok := statsCache.Get(item.TableID) if !ok { continue } - colHist, ok := tbl.Columns[col.ColumnID] + if item.IsIndex { + remainedItems = append(remainedItems, item) + continue + } + colHist, ok := tbl.Columns[item.ID] if !ok { continue } if colHist.IsHistNeeded(tbl.Pseudo) { - missingColumns = append(missingColumns, col) + remainedItems = append(remainedItems, item) } } - return missingColumns + return remainedItems } -// AppendNeededColumn appends needed column to ch, if exists, do not append the duplicated one. -func (h *Handle) AppendNeededColumn(c model.TableColumnID, resultCh chan model.TableColumnID, timeout time.Duration) error { +// AppendNeededItem appends needed columns/indices to ch, if exists, do not append the duplicated one. +func (h *Handle) AppendNeededItem(item model.TableItemID, resultCh chan model.TableItemID, timeout time.Duration) error { toTimout := time.Now().Local().Add(timeout) - colTask := &NeededColumnTask{TableColumnID: c, ToTimeout: toTimout, ResultCh: resultCh} - return h.writeToChanWithTimeout(h.StatsLoad.NeededColumnsCh, colTask, timeout) + task := &NeededItemTask{TableItemID: item, ToTimeout: toTimout, ResultCh: resultCh} + return h.writeToChanWithTimeout(h.StatsLoad.NeededItemsCh, task, timeout) } var errExit = errors.New("Stop loading since domain is closed") @@ -150,7 +162,7 @@ func (h *Handle) SubLoadWorker(ctx sessionctx.Context, exit chan struct{}, exitW } }() // if the last task is not successfully handled in last round for error or panic, pass it to this round to retry - var lastTask *NeededColumnTask + var lastTask *NeededItemTask for { task, err := h.HandleOneTask(lastTask, readerCtx, ctx.(sqlexec.RestrictedSQLExecutor), exit) lastTask = task @@ -167,7 +179,7 @@ func (h *Handle) SubLoadWorker(ctx sessionctx.Context, exit chan struct{}, exitW } // HandleOneTask handles last task if not nil, else handle a new task from chan, and return current task if fail somewhere. -func (h *Handle) HandleOneTask(lastTask *NeededColumnTask, readerCtx *StatsReaderContext, ctx sqlexec.RestrictedSQLExecutor, exit chan struct{}) (task *NeededColumnTask, err error) { +func (h *Handle) HandleOneTask(lastTask *NeededItemTask, readerCtx *StatsReaderContext, ctx sqlexec.RestrictedSQLExecutor, exit chan struct{}) (task *NeededItemTask, err error) { defer func() { // recover for each task, worker keeps working if r := recover(); r != nil { @@ -186,35 +198,62 @@ func (h *Handle) HandleOneTask(lastTask *NeededColumnTask, readerCtx *StatsReade } else { task = lastTask } - col := task.TableColumnID + return h.handleOneItemTask(task, readerCtx, ctx) +} + +func (h *Handle) handleOneItemTask(task *NeededItemTask, readerCtx *StatsReaderContext, ctx sqlexec.RestrictedSQLExecutor) (*NeededItemTask, error) { + item := task.TableItemID oldCache := h.statsCache.Load().(statsCache) - tbl, ok := oldCache.Get(col.TableID) + tbl, ok := oldCache.Get(item.TableID) if !ok { - h.writeToResultChan(task.ResultCh, col) + h.writeToResultChan(task.ResultCh, item) return nil, nil } - c, ok := tbl.Columns[col.ColumnID] - if !ok || c.Len() > 0 { - h.writeToResultChan(task.ResultCh, col) - return nil, nil + var err error + wrapper := &statsWrapper{} + if item.IsIndex { + index, ok := tbl.Indices[item.ID] + if !ok || index.IsFullLoad() { + h.writeToResultChan(task.ResultCh, item) + return nil, nil + } + wrapper.idx = index + } else { + col, ok := tbl.Columns[item.ID] + if !ok || col.IsFullLoad() { + h.writeToResultChan(task.ResultCh, item) + return nil, nil + } + wrapper.col = col } // to avoid duplicated handling in concurrent scenario - working := h.setWorking(task.TableColumnID, task.ResultCh) + working := h.setWorking(task.TableItemID, task.ResultCh) if !working { + h.writeToResultChan(task.ResultCh, item) return nil, nil } // refresh statsReader to get latest stats h.getFreshStatsReader(readerCtx, ctx) t := time.Now() - hist, err := h.readStatsForOne(col, c, readerCtx.reader) + needUpdate := false + wrapper, err = h.readStatsForOneItem(item, wrapper, readerCtx.reader) if err != nil { return task, err } + if item.IsIndex { + if wrapper.idx != nil { + needUpdate = true + } + } else { + if wrapper.col != nil { + needUpdate = true + } + } metrics.ReadStatsHistogram.Observe(float64(time.Since(t).Milliseconds())) - if hist != nil && h.updateCachedColumn(col, hist) { - h.writeToResultChan(task.ResultCh, col) + if needUpdate && h.updateCachedItem(item, wrapper.col, wrapper.idx) { + h.writeToResultChan(task.ResultCh, item) } - h.finishWorking(col) + h.finishWorking(item) return nil, nil } @@ -242,81 +281,117 @@ func (h *Handle) getFreshStatsReader(readerCtx *StatsReaderContext, ctx sqlexec. } } -// readStatsForOne reads hist for one column, TODO load data via kv-get asynchronously -func (h *Handle) readStatsForOne(col model.TableColumnID, c *statistics.Column, reader *statsReader) (*statistics.Column, error) { +// readStatsForOneItem reads hist for one column/index, TODO load data via kv-get asynchronously +func (h *Handle) readStatsForOneItem(item model.TableItemID, w *statsWrapper, reader *statsReader) (*statsWrapper, error) { failpoint.Inject("mockReadStatsForOnePanic", nil) failpoint.Inject("mockReadStatsForOneFail", func(val failpoint.Value) { if val.(bool) { failpoint.Return(nil, errors.New("gofail ReadStatsForOne error")) } }) + c := w.col + index := w.idx loadFMSketch := config.GetGlobalConfig().Performance.EnableLoadFMSketch - hg, err := h.histogramFromStorage(reader, col.TableID, c.ID, &c.Info.FieldType, c.Histogram.NDV, 0, c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) - if err != nil { - return nil, errors.Trace(err) + var hg *statistics.Histogram + var err error + isIndexFlag := int64(0) + if item.IsIndex { + isIndexFlag = 1 } - cms, topN, err := h.cmSketchAndTopNFromStorage(reader, col.TableID, 0, col.ColumnID) + if item.IsIndex { + hg, err = h.histogramFromStorage(reader, item.TableID, item.ID, types.NewFieldType(mysql.TypeBlob), index.Histogram.NDV, int(isIndexFlag), index.LastUpdateVersion, index.NullCount, index.TotColSize, index.Correlation) + if err != nil { + return nil, errors.Trace(err) + } + } else { + hg, err = h.histogramFromStorage(reader, item.TableID, item.ID, &c.Info.FieldType, c.Histogram.NDV, int(isIndexFlag), c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) + if err != nil { + return nil, errors.Trace(err) + } + } + var cms *statistics.CMSketch + var topN *statistics.TopN + cms, topN, err = h.cmSketchAndTopNFromStorage(reader, item.TableID, isIndexFlag, item.ID) if err != nil { return nil, errors.Trace(err) } var fms *statistics.FMSketch if loadFMSketch { - fms, err = h.fmSketchFromStorage(reader, col.TableID, 0, col.ColumnID) + fms, err = h.fmSketchFromStorage(reader, item.TableID, isIndexFlag, item.ID) if err != nil { return nil, errors.Trace(err) } } - rows, _, err := reader.read("select stats_ver from mysql.stats_histograms where is_index = 0 and table_id = %? and hist_id = %?", col.TableID, col.ColumnID) + rows, _, err := reader.read("select stats_ver from mysql.stats_histograms where table_id = %? and hist_id = %? and is_index = %?", item.TableID, item.ID, int(isIndexFlag)) if err != nil { return nil, errors.Trace(err) } if len(rows) == 0 { - logutil.BgLogger().Error("fail to get stats version for this histogram", zap.Int64("table_id", col.TableID), zap.Int64("hist_id", col.ColumnID)) + logutil.BgLogger().Error("fail to get stats version for this histogram", zap.Int64("table_id", item.TableID), + zap.Int64("hist_id", item.ID), zap.Bool("is_index", item.IsIndex)) + return nil, errors.Trace(errors.New(fmt.Sprintf("fail to get stats version for this histogram, table_id:%v, hist_id:%v, is_index:%v", item.TableID, item.ID, item.IsIndex))) } - colHist := &statistics.Column{ - PhysicalID: col.TableID, - Histogram: *hg, - Info: c.Info, - CMSketch: cms, - TopN: topN, - FMSketch: fms, - IsHandle: c.IsHandle, - StatsVer: rows[0].GetInt64(0), - StatsLoadedStatus: statistics.NewStatsFullLoadStatus(), + if item.IsIndex { + idxHist := &statistics.Index{ + Histogram: *hg, + CMSketch: cms, + TopN: topN, + FMSketch: fms, + Info: index.Info, + ErrorRate: index.ErrorRate, + StatsVer: rows[0].GetInt64(0), Flag: index.Flag, + PhysicalID: index.PhysicalID, + StatsLoadedStatus: statistics.NewStatsFullLoadStatus(), + } + index.LastAnalyzePos.Copy(&idxHist.LastAnalyzePos) + w.idx = idxHist + } else { + colHist := &statistics.Column{ + PhysicalID: item.TableID, + Histogram: *hg, + Info: c.Info, + CMSketch: cms, + TopN: topN, + FMSketch: fms, + IsHandle: c.IsHandle, + StatsVer: rows[0].GetInt64(0), + StatsLoadedStatus: statistics.NewStatsFullLoadStatus(), + } + // Column.Count is calculated by Column.TotalRowCount(). Hence, we don't set Column.Count when initializing colHist. + colHist.Count = int64(colHist.TotalRowCount()) + w.col = colHist } - // Column.Count is calculated by Column.TotalRowCount(). Hence, we don't set Column.Count when initializing colHist. - colHist.Count = int64(colHist.TotalRowCount()) - return colHist, nil + return w, nil } // drainColTask will hang until a column task can return, and either task or error will be returned. -func (h *Handle) drainColTask(exit chan struct{}) (*NeededColumnTask, error) { +func (h *Handle) drainColTask(exit chan struct{}) (*NeededItemTask, error) { // select NeededColumnsCh firstly, if no task, then select TimeoutColumnsCh for { select { case <-exit: return nil, errExit - case task, ok := <-h.StatsLoad.NeededColumnsCh: + case task, ok := <-h.StatsLoad.NeededItemsCh: if !ok { return nil, errors.New("drainColTask: cannot read from NeededColumnsCh, maybe the chan is closed") } // if the task has already timeout, no sql is sync-waiting for it, // so do not handle it just now, put it to another channel with lower priority if time.Now().After(task.ToTimeout) { - h.writeToTimeoutChan(h.StatsLoad.TimeoutColumnsCh, task) + h.writeToTimeoutChan(h.StatsLoad.TimeoutItemsCh, task) continue } return task, nil - case task, ok := <-h.StatsLoad.TimeoutColumnsCh: + case task, ok := <-h.StatsLoad.TimeoutItemsCh: select { case <-exit: return nil, errExit - case task0, ok0 := <-h.StatsLoad.NeededColumnsCh: + case task0, ok0 := <-h.StatsLoad.NeededItemsCh: if !ok0 { return nil, errors.New("drainColTask: cannot read from NeededColumnsCh, maybe the chan is closed") } // send task back to TimeoutColumnsCh and return the task drained from NeededColumnsCh - h.writeToTimeoutChan(h.StatsLoad.TimeoutColumnsCh, task) + h.writeToTimeoutChan(h.StatsLoad.TimeoutItemsCh, task) return task0, nil default: if !ok { @@ -330,7 +405,7 @@ func (h *Handle) drainColTask(exit chan struct{}) (*NeededColumnTask, error) { } // writeToTimeoutChan writes in a nonblocking way, and if the channel queue is full, it's ok to drop the task. -func (h *Handle) writeToTimeoutChan(taskCh chan *NeededColumnTask, task *NeededColumnTask) { +func (h *Handle) writeToTimeoutChan(taskCh chan *NeededItemTask, task *NeededItemTask) { select { case taskCh <- task: default: @@ -338,7 +413,7 @@ func (h *Handle) writeToTimeoutChan(taskCh chan *NeededColumnTask, task *NeededC } // writeToChanWithTimeout writes a task to a channel and blocks until timeout. -func (h *Handle) writeToChanWithTimeout(taskCh chan *NeededColumnTask, task *NeededColumnTask, timeout time.Duration) error { +func (h *Handle) writeToChanWithTimeout(taskCh chan *NeededItemTask, task *NeededItemTask, timeout time.Duration) error { timer := time.NewTimer(timeout) defer timer.Stop() select { @@ -350,7 +425,7 @@ func (h *Handle) writeToChanWithTimeout(taskCh chan *NeededColumnTask, task *Nee } // writeToResultChan safe-writes with panic-recover so one write-fail will not have big impact. -func (h *Handle) writeToResultChan(resultCh chan model.TableColumnID, rs model.TableColumnID) { +func (h *Handle) writeToResultChan(resultCh chan model.TableItemID, rs model.TableItemID) { defer func() { if r := recover(); r != nil { logutil.BgLogger().Error("writeToResultChan panicked", zap.Any("error", r), zap.Stack("stack")) @@ -362,52 +437,60 @@ func (h *Handle) writeToResultChan(resultCh chan model.TableColumnID, rs model.T } } -// updateCachedColumn updates the column hist to global statsCache. -func (h *Handle) updateCachedColumn(col model.TableColumnID, colHist *statistics.Column) (updated bool) { +// updateCachedItem updates the column/index hist to global statsCache. +func (h *Handle) updateCachedItem(item model.TableItemID, colHist *statistics.Column, idxHist *statistics.Index) (updated bool) { h.StatsLoad.Lock() defer h.StatsLoad.Unlock() // Reload the latest stats cache, otherwise the `updateStatsCache` may fail with high probability, because functions // like `GetPartitionStats` called in `fmSketchFromStorage` would have modified the stats cache already. oldCache := h.statsCache.Load().(statsCache) - tbl, ok := oldCache.Get(col.TableID) + tbl, ok := oldCache.Get(item.TableID) if !ok { return true } - c, ok := tbl.Columns[col.ColumnID] - if !ok || c.Len() > 0 { - return true + if !item.IsIndex && colHist != nil { + c, ok := tbl.Columns[item.ID] + if !ok || c.IsFullLoad() { + return true + } + tbl = tbl.Copy() + tbl.Columns[c.ID] = colHist + } else if item.IsIndex && idxHist != nil { + index, ok := tbl.Indices[item.ID] + if !ok || index.IsFullLoad() { + return true + } + tbl = tbl.Copy() + tbl.Indices[item.ID] = idxHist } - tbl = tbl.Copy() - tbl.Columns[c.ID] = colHist return h.updateStatsCache(oldCache.update([]*statistics.Table{tbl}, nil, oldCache.version, WithTableStatsByQuery())) } -func (h *Handle) setWorking(col model.TableColumnID, resultCh chan model.TableColumnID) bool { +func (h *Handle) setWorking(item model.TableItemID, resultCh chan model.TableItemID) bool { h.StatsLoad.Lock() defer h.StatsLoad.Unlock() - chList, ok := h.StatsLoad.WorkingColMap[col] + chList, ok := h.StatsLoad.WorkingColMap[item] if ok { if chList[0] == resultCh { return true // just return for duplicate setWorking } - h.StatsLoad.WorkingColMap[col] = append(chList, resultCh) + h.StatsLoad.WorkingColMap[item] = append(chList, resultCh) return false } - chList = []chan model.TableColumnID{} + chList = []chan model.TableItemID{} chList = append(chList, resultCh) - h.StatsLoad.WorkingColMap[col] = chList + h.StatsLoad.WorkingColMap[item] = chList return true } -func (h *Handle) finishWorking(col model.TableColumnID) { +func (h *Handle) finishWorking(item model.TableItemID) { h.StatsLoad.Lock() defer h.StatsLoad.Unlock() - failpoint.Inject("mockFinishWorkingPanic", nil) - if chList, ok := h.StatsLoad.WorkingColMap[col]; ok { + if chList, ok := h.StatsLoad.WorkingColMap[item]; ok { list := chList[1:] for _, ch := range list { - h.writeToResultChan(ch, col) + h.writeToResultChan(ch, item) } } - delete(h.StatsLoad.WorkingColMap, col) + delete(h.StatsLoad.WorkingColMap, item) } diff --git a/statistics/handle/handle_hist_test.go b/statistics/handle/handle_hist_test.go index 46d749362d7d9..7a8556d77c29c 100644 --- a/statistics/handle/handle_hist_test.go +++ b/statistics/handle/handle_hist_test.go @@ -60,9 +60,9 @@ func TestConcurrentLoadHist(t *testing.T) { topn = stat.Columns[tableInfo.Columns[2].ID].TopN require.Equal(t, 0, hg.Len()+topn.Num()) stmtCtx := &stmtctx.StatementContext{} - neededColumns := make([]model.TableColumnID, 0, len(tableInfo.Columns)) + neededColumns := make([]model.TableItemID, 0, len(tableInfo.Columns)) for _, col := range tableInfo.Columns { - neededColumns = append(neededColumns, model.TableColumnID{TableID: tableInfo.ID, ColumnID: col.ID}) + neededColumns = append(neededColumns, model.TableItemID{TableID: tableInfo.ID, ID: col.ID, IsIndex: false}) } timeout := time.Nanosecond * mathutil.MaxInt h.SendLoadRequests(stmtCtx, neededColumns, timeout) @@ -106,9 +106,9 @@ func TestConcurrentLoadHistTimeout(t *testing.T) { topn = stat.Columns[tableInfo.Columns[2].ID].TopN require.Equal(t, 0, hg.Len()+topn.Num()) stmtCtx := &stmtctx.StatementContext{} - neededColumns := make([]model.TableColumnID, 0, len(tableInfo.Columns)) + neededColumns := make([]model.TableItemID, 0, len(tableInfo.Columns)) for _, col := range tableInfo.Columns { - neededColumns = append(neededColumns, model.TableColumnID{TableID: tableInfo.ID, ColumnID: col.ID}) + neededColumns = append(neededColumns, model.TableItemID{TableID: tableInfo.ID, ID: col.ID, IsIndex: false}) } h.SendLoadRequests(stmtCtx, neededColumns, 0) // set timeout to 0 so task will go to timeout channel rs := h.SyncWaitStatsLoad(stmtCtx) @@ -160,18 +160,14 @@ func TestConcurrentLoadHistWithPanicAndFail(t *testing.T) { tableInfo := tbl.Meta() h := dom.StatsHandle() - neededColumns := make([]model.TableColumnID, 1) - neededColumns[0] = model.TableColumnID{TableID: tableInfo.ID, ColumnID: tableInfo.Columns[2].ID} + neededColumns := make([]model.TableItemID, 1) + neededColumns[0] = model.TableItemID{TableID: tableInfo.ID, ID: tableInfo.Columns[2].ID, IsIndex: false} timeout := time.Nanosecond * mathutil.MaxInt failpoints := []struct { failPath string inTerms string }{ - { - failPath: "github.com/pingcap/tidb/statistics/handle/mockFinishWorkingPanic", - inTerms: "panic", - }, { failPath: "github.com/pingcap/tidb/statistics/handle/mockReadStatsForOnePanic", inTerms: "panic", diff --git a/statistics/handle/handle_test.go b/statistics/handle/handle_test.go index fa5e26d589bcc..d580dbaac6105 100644 --- a/statistics/handle/handle_test.go +++ b/statistics/handle/handle_test.go @@ -3233,56 +3233,75 @@ func TestColumnCountFromStorage(t *testing.T) { } func TestIncrementalModifyCountUpdate(t *testing.T) { - store, dom, clean := testkit.CreateMockStoreAndDomain(t) - defer clean() - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") - tk.MustExec("create table t(a int)") - tk.MustExec("set @@session.tidb_analyze_version = 2") - h := dom.StatsHandle() - err := h.HandleDDLEvent(<-h.DDLEventCh()) - require.NoError(t, err) - tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - require.NoError(t, err) - tblInfo := tbl.Meta() - tid := tblInfo.ID + for _, analyzeSnapshot := range []bool{true, false} { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + if analyzeSnapshot { + tk.MustExec("set @@session.tidb_enable_analyze_snapshot = on") + } else { + tk.MustExec("set @@session.tidb_enable_analyze_snapshot = off") + } + tk.MustExec("create table t(a int)") + tk.MustExec("set @@session.tidb_analyze_version = 2") + h := dom.StatsHandle() + err := h.HandleDDLEvent(<-h.DDLEventCh()) + require.NoError(t, err) + tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tbl.Meta() + tid := tblInfo.ID - tk.MustExec("insert into t values(1),(2),(3)") - require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) - err = h.Update(dom.InfoSchema()) - require.NoError(t, err) - tk.MustExec("analyze table t") - tk.MustQuery(fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tid)).Check(testkit.Rows( - "3 0", - )) + tk.MustExec("insert into t values(1),(2),(3)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + err = h.Update(dom.InfoSchema()) + require.NoError(t, err) + tk.MustExec("analyze table t") + tk.MustQuery(fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tid)).Check(testkit.Rows( + "3 0", + )) - tk.MustExec("begin") - txn, err := tk.Session().Txn(false) - require.NoError(t, err) - startTS := txn.StartTS() - tk.MustExec("commit") + tk.MustExec("begin") + txn, err := tk.Session().Txn(false) + require.NoError(t, err) + startTS := txn.StartTS() + tk.MustExec("commit") - tk.MustExec("insert into t values(4),(5),(6)") - require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) - err = h.Update(dom.InfoSchema()) - require.NoError(t, err) + tk.MustExec("insert into t values(4),(5),(6)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + err = h.Update(dom.InfoSchema()) + require.NoError(t, err) - // Simulate that the analyze would start before and finish after the second insert. - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS))) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectBaseCount", "return(3)")) - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectBaseModifyCount", "return(0)")) - tk.MustExec("analyze table t") - // 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", - )) - // Check the histogram is correct for the snapshot analyze. - tk.MustQuery(fmt.Sprintf("select distinct_count from mysql.stats_histograms where table_id = %d", tid)).Check(testkit.Rows( - "3", - )) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseCount")) - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseModifyCount")) + // Simulate that the analyze would start before and finish after the second insert. + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS))) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectBaseCount", "return(3)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectBaseModifyCount", "return(0)")) + tk.MustExec("analyze table t") + if analyzeSnapshot { + // 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", + )) + // Check the histogram is correct for the snapshot analyze. + tk.MustQuery(fmt.Sprintf("select distinct_count from mysql.stats_histograms where table_id = %d", tid)).Check(testkit.Rows( + "3", + )) + } else { + // Since analyze use max ts to read data, count and modify_count are overestimated here. Analyze finds the row count is 6 + // and the increment of count and modify_count is +3, +3. Hence, we see count is 9 and modify_count is 3. + tk.MustQuery(fmt.Sprintf("select count, modify_count from mysql.stats_meta where table_id = %d", tid)).Check(testkit.Rows( + "9 3", + )) + // Check the histogram is collected from the latest data rather than the snapshot at startTS. + tk.MustQuery(fmt.Sprintf("select distinct_count from mysql.stats_histograms where table_id = %d", tid)).Check(testkit.Rows( + "6", + )) + } + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseCount")) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseModifyCount")) + } } func TestRecordHistoricalStatsToStorage(t *testing.T) { diff --git a/statistics/handle/lru_cache.go b/statistics/handle/lru_cache.go index bc1ce09c87085..ca98efc633459 100644 --- a/statistics/handle/lru_cache.go +++ b/statistics/handle/lru_cache.go @@ -387,6 +387,9 @@ func (c *innerItemLruCache) put(tblID, id int64, isIndex bool, item statistics.T c.evictIfNeeded() } }() + if itemMem.TrackingMemUsage() < 1 { + return + } isIndexSet, ok := c.elements[tblID] if !ok { c.elements[tblID] = make(map[bool]map[int64]*list.Element) @@ -432,13 +435,17 @@ func (c *innerItemLruCache) evictIfNeeded() { prev := curr.Prev() item := curr.Value.(*lruCacheItem) oldMem := item.innerMemUsage - // evict cmSketches - item.innerItem.DropEvicted() + statistics.DropEvicted(item.innerItem) newMem := item.innerItem.MemoryUsage() c.calculateCost(newMem, oldMem) - // remove from lru - c.cache.Remove(curr) - delete(c.elements[item.tblID][item.isIndex], item.id) + if newMem.TrackingMemUsage() == 0 || item.innerItem.IsAllEvicted() { + // remove from lru + c.cache.Remove(curr) + delete(c.elements[item.tblID][item.isIndex], item.id) + } else { + c.cache.PushFront(curr) + item.innerMemUsage = newMem + } if c.onEvict != nil { c.onEvict(item.tblID) } diff --git a/statistics/handle/lru_cache_test.go b/statistics/handle/lru_cache_test.go index d717b95643c23..abb6a52473716 100644 --- a/statistics/handle/lru_cache_test.go +++ b/statistics/handle/lru_cache_test.go @@ -23,14 +23,15 @@ import ( ) var ( - mockIndexMemoryUsage = int64(4) - mockColumnMemoryUsage = int64(4) - mockColumnTotalMemoryUsage = statistics.EmptyHistogramSize + 4 - mockIndexTotalMemoryUsage = statistics.EmptyHistogramSize + 4 + mockIndexCMSMemoryUsage = int64(4) + mockColumnCMSMemoryUsage = int64(4) + mockColumnTopNMemoryUsage = int64(64) + mockColumnTotalMemoryUsage = statistics.EmptyHistogramSize + mockColumnCMSMemoryUsage + mockIndexTotalMemoryUsage = statistics.EmptyHistogramSize + mockIndexCMSMemoryUsage ) // each column and index consumes 4 bytes memory -func newMockStatisticsTable(columns int, indices int) *statistics.Table { +func newMockStatisticsTable(columns int, indices int, withCMS, withTopN bool) *statistics.Table { t := &statistics.Table{} t.Columns = make(map[int64]*statistics.Column) t.Indices = make(map[int64]*statistics.Index) @@ -40,11 +41,25 @@ func newMockStatisticsTable(columns int, indices int) *statistics.Table { CMSketch: statistics.NewCMSketch(1, 1), StatsLoadedStatus: statistics.NewStatsFullLoadStatus(), } + if withCMS { + t.Columns[int64(i)].CMSketch = statistics.NewCMSketch(1, 1) + } + if withTopN { + t.Columns[int64(i)].TopN = statistics.NewTopN(1) + t.Columns[int64(i)].TopN.AppendTopN([]byte{}, 1) + } } for i := 1; i <= indices; i++ { t.Indices[int64(i)] = &statistics.Index{ - Info: &model.IndexInfo{ID: int64(i)}, - CMSketch: statistics.NewCMSketch(1, 1), + Info: &model.IndexInfo{ID: int64(i)}, + StatsLoadedStatus: statistics.NewStatsFullLoadStatus(), + } + if withCMS { + t.Indices[int64(i)].CMSketch = statistics.NewCMSketch(1, 1) + } + if withTopN { + t.Indices[int64(i)].TopN = statistics.NewTopN(1) + t.Indices[int64(i)].TopN.AppendTopN([]byte{}, 1) } } return t @@ -78,7 +93,7 @@ func TestLRUPutGetDel(t *testing.T) { capacity := int64(100) lru := newStatsLruCache(capacity) require.Equal(t, capacity, lru.capacity()) - mockTable := newMockStatisticsTable(1, 1) + mockTable := newMockStatisticsTable(1, 1, true, false) mockTableID := int64(1) lru.Put(mockTableID, mockTable) v, ok := lru.Get(mockTableID) @@ -103,10 +118,10 @@ func TestLRUPutGetDel(t *testing.T) { func TestLRUEvict(t *testing.T) { capacity := int64(24) lru := newStatsLruCache(capacity) - t1 := newMockStatisticsTable(2, 0) + t1 := newMockStatisticsTable(2, 0, true, false) require.Equal(t, t1.MemoryUsage().TotalMemUsage, 2*mockColumnTotalMemoryUsage) require.Equal(t, t1.MemoryUsage().TotalIdxTrackingMemUsage(), int64(0)) - require.Equal(t, t1.MemoryUsage().TotalColTrackingMemUsage(), 2*mockColumnMemoryUsage) + require.Equal(t, t1.MemoryUsage().TotalColTrackingMemUsage(), 2*mockColumnCMSMemoryUsage) // Put t1, assert TotalMemUsage and TotalColTrackingMemUsage lru.Put(int64(1), t1) @@ -114,21 +129,21 @@ func TestLRUEvict(t *testing.T) { require.Equal(t, lru.Cost(), t1.MemoryUsage().TotalTrackingMemUsage()) // Put t2, assert TotalMemUsage and TotalColTrackingMemUsage - t2 := newMockStatisticsTable(2, 1) + t2 := newMockStatisticsTable(2, 1, true, false) lru.Put(int64(2), t2) require.Equal(t, lru.TotalCost(), 4*mockColumnTotalMemoryUsage+1*mockIndexTotalMemoryUsage) - require.Equal(t, lru.Cost(), 4*mockColumnMemoryUsage+1*mockIndexMemoryUsage) + require.Equal(t, lru.Cost(), 4*mockColumnCMSMemoryUsage+1*mockIndexCMSMemoryUsage) // Put t3, a column of t1 should be evicted - t3 := newMockStatisticsTable(1, 1) + t3 := newMockStatisticsTable(1, 1, true, false) lru.Put(int64(3), t3) require.Equal(t, lru.Len(), 3) - require.Equal(t, t1.MemoryUsage().TotalColTrackingMemUsage(), mockColumnMemoryUsage) + require.Equal(t, t1.MemoryUsage().TotalColTrackingMemUsage(), mockColumnCMSMemoryUsage) require.Equal(t, lru.TotalCost(), t1.MemoryUsage().TotalMemUsage+t2.MemoryUsage().TotalMemUsage+t3.MemoryUsage().TotalMemUsage) - require.Equal(t, lru.Cost(), 4*mockColumnMemoryUsage+2*mockIndexMemoryUsage) + require.Equal(t, lru.Cost(), 4*mockColumnCMSMemoryUsage+2*mockIndexCMSMemoryUsage) // Put t4, all indices' cmsketch of other tables should be evicted - t4 := newMockStatisticsTable(3, 3) + t4 := newMockStatisticsTable(3, 3, true, false) lru.Put(int64(4), t4) require.Equal(t, lru.Len(), 4) require.Equal(t, t1.MemoryUsage().TotalTrackingMemUsage(), int64(0)) @@ -138,14 +153,14 @@ func TestLRUEvict(t *testing.T) { t2.MemoryUsage().TotalMemUsage+ t3.MemoryUsage().TotalMemUsage+ t4.MemoryUsage().TotalMemUsage) - require.Equal(t, lru.Cost(), 3*mockColumnMemoryUsage+3*mockIndexMemoryUsage) + require.Equal(t, lru.Cost(), 3*mockColumnCMSMemoryUsage+3*mockIndexCMSMemoryUsage) } func TestLRUCopy(t *testing.T) { lru := newStatsLruCache(1000) tables := make([]*statistics.Table, 0) for i := 0; i < 5; i++ { - tables = append(tables, newMockStatisticsTable(1, 1)) + tables = append(tables, newMockStatisticsTable(1, 1, true, false)) } // insert 1,2,3 into old lru @@ -181,42 +196,42 @@ func TestLRUCopy(t *testing.T) { func TestLRUFreshMemUsage(t *testing.T) { lru := newStatsLruCache(1000) - t1 := newMockStatisticsTable(1, 1) - t2 := newMockStatisticsTable(2, 2) - t3 := newMockStatisticsTable(3, 3) + t1 := newMockStatisticsTable(1, 1, true, false) + t2 := newMockStatisticsTable(2, 2, true, false) + t3 := newMockStatisticsTable(3, 3, true, false) lru.Put(int64(1), t1) lru.Put(int64(2), t2) lru.Put(int64(3), t3) require.Equal(t, lru.TotalCost(), 6*mockColumnTotalMemoryUsage+6*mockIndexTotalMemoryUsage) - require.Equal(t, lru.Cost(), 6*mockIndexMemoryUsage+6*mockColumnMemoryUsage) + require.Equal(t, lru.Cost(), 6*mockIndexCMSMemoryUsage+6*mockColumnCMSMemoryUsage) mockTableAppendColumn(t1) lru.FreshMemUsage() require.Equal(t, lru.TotalCost(), 7*mockColumnTotalMemoryUsage+6*mockIndexTotalMemoryUsage) - require.Equal(t, lru.Cost(), 6*mockIndexMemoryUsage+7*mockColumnMemoryUsage) + require.Equal(t, lru.Cost(), 6*mockIndexCMSMemoryUsage+7*mockColumnCMSMemoryUsage) mockTableAppendIndex(t1) lru.FreshMemUsage() require.Equal(t, lru.TotalCost(), 7*mockColumnTotalMemoryUsage+7*mockIndexTotalMemoryUsage) - require.Equal(t, lru.Cost(), 7*mockIndexMemoryUsage+7*mockColumnMemoryUsage) + require.Equal(t, lru.Cost(), 7*mockIndexCMSMemoryUsage+7*mockColumnCMSMemoryUsage) mockTableRemoveColumn(t1) lru.Put(int64(1), t1) require.Equal(t, lru.TotalCost(), 6*mockColumnTotalMemoryUsage+7*mockIndexTotalMemoryUsage) - require.Equal(t, lru.Cost(), 7*mockIndexMemoryUsage+6*mockColumnMemoryUsage) + require.Equal(t, lru.Cost(), 7*mockIndexCMSMemoryUsage+6*mockColumnCMSMemoryUsage) mockTableRemoveIndex(t1) lru.Put(int64(1), t1) require.Equal(t, lru.TotalCost(), 6*mockColumnTotalMemoryUsage+6*mockIndexTotalMemoryUsage) - require.Equal(t, lru.Cost(), 6*mockIndexMemoryUsage+6*mockColumnMemoryUsage) + require.Equal(t, lru.Cost(), 6*mockIndexCMSMemoryUsage+6*mockColumnCMSMemoryUsage) } func TestLRUPutTooBig(t *testing.T) { lru := newStatsLruCache(1) - mockTable := newMockStatisticsTable(1, 1) + mockTable := newMockStatisticsTable(1, 1, true, false) // put mockTable, the index should be evicted lru.Put(int64(1), mockTable) _, ok := lru.Get(int64(1)) require.True(t, ok) - require.Equal(t, lru.TotalCost(), mockColumnTotalMemoryUsage-mockColumnMemoryUsage+mockIndexTotalMemoryUsage-mockIndexMemoryUsage) + require.Equal(t, lru.TotalCost(), mockColumnTotalMemoryUsage-mockColumnCMSMemoryUsage+mockIndexTotalMemoryUsage-mockIndexCMSMemoryUsage) require.Equal(t, lru.Cost(), int64(0)) require.Equal(t, mockTable.MemoryUsage().TotalTrackingMemUsage(), int64(0)) } @@ -224,9 +239,9 @@ func TestLRUPutTooBig(t *testing.T) { func TestCacheLen(t *testing.T) { capacity := int64(12) stats := newStatsLruCache(capacity) - t1 := newMockStatisticsTable(2, 1) + t1 := newMockStatisticsTable(2, 1, true, false) stats.Put(int64(1), t1) - t2 := newMockStatisticsTable(1, 1) + t2 := newMockStatisticsTable(1, 1, true, false) // put t2, t1 should be evicted 2 items and still exists in the list stats.Put(int64(2), t2) require.Equal(t, stats.lru.cache.Len(), 3) @@ -234,7 +249,7 @@ func TestCacheLen(t *testing.T) { require.Equal(t, stats.Len(), 2) // put t3, t1/t2 should be evicted all items and disappeared from the list - t3 := newMockStatisticsTable(2, 1) + t3 := newMockStatisticsTable(2, 1, true, false) stats.Put(int64(3), t3) require.Equal(t, stats.lru.cache.Len(), 3) require.Equal(t, t1.MemoryUsage().TotalTrackingMemUsage(), int64(0)) @@ -245,9 +260,9 @@ func TestCacheLen(t *testing.T) { func TestLRUMove(t *testing.T) { capacity := int64(100) s := newStatsLruCache(capacity) - t1 := newMockStatisticsTable(1, 1) + t1 := newMockStatisticsTable(1, 1, true, false) t1ID := int64(1) - t2 := newMockStatisticsTable(1, 1) + t2 := newMockStatisticsTable(1, 1, true, false) t2ID := int64(2) s.Put(t1ID, t1) s.Put(t2ID, t2) @@ -259,3 +274,44 @@ func TestLRUMove(t *testing.T) { front = s.lru.cache.Front().Value.(*lruCacheItem) require.Equal(t, t1ID, front.tblID) } + +func TestLRUEvictPolicy(t *testing.T) { + capacity := int64(999) + s := newStatsLruCache(capacity) + t1 := newMockStatisticsTable(1, 0, true, true) + s.Put(1, t1) + require.Equal(t, s.TotalCost(), mockColumnTotalMemoryUsage+mockColumnTopNMemoryUsage) + require.Equal(t, s.Cost(), mockColumnCMSMemoryUsage+mockColumnTopNMemoryUsage) + cost := s.Cost() + // assert column's cms got evicted and topn remained + s.SetCapacity(cost - 1) + require.Equal(t, s.Cost(), mockColumnTopNMemoryUsage) + require.Nil(t, t1.Columns[1].CMSketch) + require.True(t, t1.Columns[1].IsCMSEvicted()) + require.NotNil(t, t1.Columns[1].TopN) + require.False(t, t1.Columns[1].IsTopNEvicted()) + // assert both column's cms and topn got evicted + s.SetCapacity(1) + require.Equal(t, s.Cost(), int64(0)) + require.Nil(t, t1.Columns[1].CMSketch) + require.True(t, t1.Columns[1].IsCMSEvicted()) + require.Nil(t, t1.Columns[1].TopN) + require.True(t, t1.Columns[1].IsTopNEvicted()) + + s = newStatsLruCache(capacity) + t2 := newMockStatisticsTable(0, 1, true, true) + s.Put(2, t2) + require.Equal(t, s.TotalCost(), mockIndexTotalMemoryUsage+mockColumnTopNMemoryUsage) + require.Equal(t, s.Cost(), mockIndexCMSMemoryUsage+mockColumnTopNMemoryUsage) + cost = s.Cost() + // assert index's cms got evicted and topn remained + s.SetCapacity(cost - 1) + require.Equal(t, s.Cost(), mockColumnTopNMemoryUsage) + require.Nil(t, t2.Indices[1].CMSketch) + require.NotNil(t, t2.Indices[1].TopN) + // assert both column's cms and topn got evicted + s.SetCapacity(1) + require.Equal(t, s.Cost(), int64(0)) + require.Nil(t, t2.Indices[1].CMSketch) + require.Nil(t, t2.Indices[1].TopN) +} diff --git a/statistics/handle/update.go b/statistics/handle/update.go index d3145e623fa58..f347e8a0e46d4 100644 --- a/statistics/handle/update.go +++ b/statistics/handle/update.go @@ -136,7 +136,7 @@ func (m errorRateDeltaMap) clear(tableID int64, histID int64, isIndex bool) { } // colStatsUsageMap maps (tableID, columnID) to the last time when the column stats are used(needed). -type colStatsUsageMap map[model.TableColumnID]time.Time +type colStatsUsageMap map[model.TableItemID]time.Time func (m colStatsUsageMap) merge(other colStatsUsageMap) { for id, t := range other { @@ -904,7 +904,7 @@ func (h *Handle) DumpColStatsUsageToKV() error { h.colMap.Unlock() }() type pair struct { - tblColID model.TableColumnID + tblColID model.TableItemID lastUsedAt string } pairs := make([]pair, 0, len(colMap)) @@ -913,7 +913,7 @@ func (h *Handle) DumpColStatsUsageToKV() error { } slices.SortFunc(pairs, func(i, j pair) bool { if i.tblColID.TableID == j.tblColID.TableID { - return i.tblColID.ColumnID < j.tblColID.ColumnID + return i.tblColID.ID < j.tblColID.ID } return i.tblColID.TableID < j.tblColID.TableID }) @@ -928,7 +928,7 @@ func (h *Handle) DumpColStatsUsageToKV() error { for j := i; j < end; j++ { // Since we will use some session from session pool to execute the insert statement, we pass in UTC time here and covert it // to the session's time zone when executing the insert statement. In this way we can make the stored time right. - sqlexec.MustFormatSQL(sql, "(%?, %?, CONVERT_TZ(%?, '+00:00', @@TIME_ZONE))", pairs[j].tblColID.TableID, pairs[j].tblColID.ColumnID, pairs[j].lastUsedAt) + sqlexec.MustFormatSQL(sql, "(%?, %?, CONVERT_TZ(%?, '+00:00', @@TIME_ZONE))", pairs[j].tblColID.TableID, pairs[j].tblColID.ID, pairs[j].lastUsedAt) if j < end-1 { sqlexec.MustFormatSQL(sql, ",") } @@ -1034,6 +1034,16 @@ func parseAnalyzePeriod(start, end string) (time.Time, time.Time, error) { return s, e, err } +func (h *Handle) getAnalyzeSnapshot() (bool, error) { + h.mu.Lock() + defer h.mu.Unlock() + analyzeSnapshot, err := h.mu.ctx.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBEnableAnalyzeSnapshot) + if err != nil { + return false, err + } + return variable.TiDBOptOn(analyzeSnapshot), nil +} + // HandleAutoAnalyze analyzes the newly created table or index. func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { err := h.UpdateSessionVar() @@ -1053,6 +1063,11 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { return false } pruneMode := h.CurrentPruneMode() + analyzeSnapshot, err := h.getAnalyzeSnapshot() + if err != nil { + logutil.BgLogger().Error("[stats] load tidb_enable_analyze_snapshot for auto analyze session failed", zap.Error(err)) + return false + } 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] @@ -1078,7 +1093,7 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { if pi == nil { statsTbl := h.GetTableStats(tblInfo) sql := "analyze table %n.%n" - analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql, db, tblInfo.Name.O) + analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, autoAnalyzeRatio, analyzeSnapshot, sql, db, tblInfo.Name.O) if analyzed { // analyze one table at a time to let it get the freshest parameters. // others will be analyzed next round which is just 3s later. @@ -1087,7 +1102,7 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { continue } if pruneMode == variable.Dynamic { - analyzed := h.autoAnalyzePartitionTable(tblInfo, pi, db, start, end, autoAnalyzeRatio) + analyzed := h.autoAnalyzePartitionTable(tblInfo, pi, db, autoAnalyzeRatio, analyzeSnapshot) if analyzed { return true } @@ -1096,7 +1111,7 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { for _, def := range pi.Definitions { sql := "analyze table %n.%n partition %n" statsTbl := h.GetPartitionStats(tblInfo, def.ID) - analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql, db, tblInfo.Name.O, def.Name.O) + analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, autoAnalyzeRatio, analyzeSnapshot, sql, db, tblInfo.Name.O, def.Name.O) if analyzed { return true } @@ -1106,7 +1121,7 @@ func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { return false } -func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics.Table, start, end time.Time, ratio float64, sql string, params ...interface{}) bool { +func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics.Table, ratio float64, analyzeSnapshot bool, sql string, params ...interface{}) bool { if statsTbl.Pseudo || statsTbl.Count < AutoAnalyzeMinCnt { return false } @@ -1118,7 +1133,7 @@ func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics logutil.BgLogger().Info("[stats] auto analyze triggered", zap.String("sql", escaped), zap.String("reason", reason)) tableStatsVer := h.mu.ctx.GetSessionVars().AnalyzeVersion statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) - h.execAutoAnalyze(tableStatsVer, sql, params...) + h.execAutoAnalyze(tableStatsVer, analyzeSnapshot, sql, params...) return true } for _, idx := range tblInfo.Indices { @@ -1132,14 +1147,14 @@ func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics logutil.BgLogger().Info("[stats] auto analyze for unanalyzed", zap.String("sql", escaped)) tableStatsVer := h.mu.ctx.GetSessionVars().AnalyzeVersion statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) - h.execAutoAnalyze(tableStatsVer, sqlWithIdx, paramsWithIdx...) + h.execAutoAnalyze(tableStatsVer, analyzeSnapshot, sqlWithIdx, paramsWithIdx...) return true } } return false } -func (h *Handle) autoAnalyzePartitionTable(tblInfo *model.TableInfo, pi *model.PartitionInfo, db string, start, end time.Time, ratio float64) bool { +func (h *Handle) autoAnalyzePartitionTable(tblInfo *model.TableInfo, pi *model.PartitionInfo, db string, ratio float64, analyzeSnapshot bool) bool { h.mu.RLock() tableStatsVer := h.mu.ctx.GetSessionVars().AnalyzeVersion h.mu.RUnlock() @@ -1172,7 +1187,7 @@ func (h *Handle) autoAnalyzePartitionTable(tblInfo *model.TableInfo, pi *model.P params := append([]interface{}{db, tblInfo.Name.O}, partitionNames...) statsTbl := h.GetTableStats(tblInfo) statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) - h.execAutoAnalyze(tableStatsVer, sql, params...) + h.execAutoAnalyze(tableStatsVer, analyzeSnapshot, sql, params...) return true } for _, idx := range tblInfo.Indices { @@ -1193,7 +1208,7 @@ func (h *Handle) autoAnalyzePartitionTable(tblInfo *model.TableInfo, pi *model.P params = append(params, idx.Name.O) statsTbl := h.GetTableStats(tblInfo) statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) - h.execAutoAnalyze(tableStatsVer, sql, params...) + h.execAutoAnalyze(tableStatsVer, analyzeSnapshot, sql, params...) return true } } @@ -1206,9 +1221,10 @@ var execOptionForAnalyze = map[int]sqlexec.OptionFuncAlias{ statistics.Version2: sqlexec.ExecOptionAnalyzeVer2, } -func (h *Handle) execAutoAnalyze(statsVer int, sql string, params ...interface{}) { +func (h *Handle) execAutoAnalyze(statsVer int, analyzeSnapshot bool, sql string, params ...interface{}) { startTime := time.Now() - _, _, err := h.execRestrictedSQLWithStatsVer(context.Background(), statsVer, util.GetAutoAnalyzeProcID(h.serverIDGetter), sql, params...) + autoAnalyzeProcID := util.GetAutoAnalyzeProcID(h.serverIDGetter) + _, _, err := h.execRestrictedSQLWithStatsVer(context.Background(), statsVer, autoAnalyzeProcID, analyzeSnapshot, sql, params...) dur := time.Since(startTime) metrics.AutoAnalyzeHistogram.Observe(dur.Seconds()) if err != nil { diff --git a/statistics/histogram.go b/statistics/histogram.go index 273f46614c243..df009166afacd 100644 --- a/statistics/histogram.go +++ b/statistics/histogram.go @@ -19,16 +19,13 @@ import ( "fmt" "math" "sort" - "strconv" "strings" "time" "unsafe" "github.com/pingcap/errors" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/charset" - "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" @@ -40,7 +37,6 @@ import ( "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/mathutil" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tipb/go-tipb" "github.com/twmb/murmur3" @@ -147,80 +143,6 @@ func (hg *Histogram) MemoryUsage() (sum int64) { return } -// AvgColSize is the average column size of the histogram. These sizes are derived from function `encode` -// and `Datum::ConvertTo`, so we need to update them if those 2 functions are changed. -func (c *Column) AvgColSize(count int64, isKey bool) float64 { - if count == 0 { - return 0 - } - // Note that, if the handle column is encoded as value, instead of key, i.e, - // when the handle column is in a unique index, the real column size may be - // smaller than 8 because it is encoded using `EncodeVarint`. Since we don't - // know the exact value size now, use 8 as approximation. - if c.IsHandle { - return 8 - } - histCount := c.TotalRowCount() - notNullRatio := 1.0 - if histCount > 0 { - notNullRatio = 1.0 - float64(c.NullCount)/histCount - } - switch c.Histogram.Tp.GetType() { - case mysql.TypeFloat, mysql.TypeDouble, mysql.TypeDuration, mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp: - return 8 * notNullRatio - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear, mysql.TypeEnum, mysql.TypeBit, mysql.TypeSet: - if isKey { - return 8 * notNullRatio - } - } - // Keep two decimal place. - return math.Round(float64(c.TotColSize)/float64(count)*100) / 100 -} - -// AvgColSizeChunkFormat is the average column size of the histogram. These sizes are derived from function `Encode` -// and `DecodeToChunk`, so we need to update them if those 2 functions are changed. -func (c *Column) AvgColSizeChunkFormat(count int64) float64 { - if count == 0 { - return 0 - } - fixedLen := chunk.GetFixedLen(c.Histogram.Tp) - if fixedLen != -1 { - return float64(fixedLen) - } - // Keep two decimal place. - // Add 8 bytes for unfixed-len type's offsets. - // Minus Log2(avgSize) for unfixed-len type LEN. - avgSize := float64(c.TotColSize) / float64(count) - if avgSize < 1 { - return math.Round(avgSize*100)/100 + 8 - } - return math.Round((avgSize-math.Log2(avgSize))*100)/100 + 8 -} - -// AvgColSizeListInDisk is the average column size of the histogram. These sizes are derived -// from `chunk.ListInDisk` so we need to update them if those 2 functions are changed. -func (c *Column) AvgColSizeListInDisk(count int64) float64 { - if count == 0 { - return 0 - } - histCount := c.TotalRowCount() - notNullRatio := 1.0 - if histCount > 0 { - notNullRatio = 1.0 - float64(c.NullCount)/histCount - } - size := chunk.GetFixedLen(c.Histogram.Tp) - if size != -1 { - return float64(size) * notNullRatio - } - // Keep two decimal place. - // Minus Log2(avgSize) for unfixed-len type LEN. - avgSize := float64(c.TotColSize) / float64(count) - if avgSize < 1 { - return math.Round((avgSize)*100) / 100 - } - return math.Round((avgSize-math.Log2(avgSize))*100) / 100 -} - // AppendBucket appends a bucket into `hg`. func (hg *Histogram) AppendBucket(lower *types.Datum, upper *types.Datum, count, repeat int64) { hg.AppendBucketWithNDV(lower, upper, count, repeat, 0) @@ -543,15 +465,6 @@ func (hg *Histogram) BetweenRowCount(a, b types.Datum) float64 { return lessCountB - lessCountA } -// BetweenRowCount estimates the row count for interval [l, r). -func (c *Column) BetweenRowCount(sctx sessionctx.Context, l, r types.Datum, lowEncoded, highEncoded []byte) float64 { - histBetweenCnt := c.Histogram.BetweenRowCount(l, r) - if c.StatsVer <= Version1 { - return histBetweenCnt - } - return float64(c.TopN.BetweenCount(lowEncoded, highEncoded)) + histBetweenCnt -} - // TotalRowCount returns the total count of this histogram. func (hg *Histogram) TotalRowCount() float64 { return hg.notNullCount() + float64(hg.NullCount) @@ -589,24 +502,6 @@ func (hg *Histogram) mergeBuckets(bucketIdx int) { hg.Buckets = hg.Buckets[:curBuck] } -// GetIncreaseFactor get the increase factor to adjust the final estimated count when the table is modified. -func (idx *Index) GetIncreaseFactor(realtimeRowCount int64) float64 { - columnCount := idx.TotalRowCount() - if columnCount == 0 { - return 1.0 - } - return float64(realtimeRowCount) / columnCount -} - -// BetweenRowCount estimates the row count for interval [l, r). -func (idx *Index) BetweenRowCount(l, r types.Datum) float64 { - histBetweenCnt := idx.Histogram.BetweenRowCount(l, r) - if idx.StatsVer == Version1 { - return histBetweenCnt - } - return float64(idx.TopN.BetweenCount(l.GetBytes(), r.GetBytes())) + histBetweenCnt -} - // GetIncreaseFactor will return a factor of data increasing after the last analysis. func (hg *Histogram) GetIncreaseFactor(totalCount int64) float64 { columnCount := hg.TotalRowCount() @@ -1043,595 +938,6 @@ func (e *ErrorRate) Merge(rate *ErrorRate) { e.ErrorTotal += rate.ErrorTotal } -// Column represents a column histogram. -type Column struct { - Histogram - *CMSketch - *TopN - *FMSketch - PhysicalID int64 - Count int64 - Info *model.ColumnInfo - IsHandle bool - ErrorRate - Flag int64 - LastAnalyzePos types.Datum - StatsVer int64 // StatsVer is the version of the current stats, used to maintain compatibility - - // StatsLoadedStatus indicates the status of column statistics - StatsLoadedStatus -} - -func (c *Column) String() string { - return c.Histogram.ToString(0) -} - -// TotalRowCount returns the total count of this column. -func (c *Column) TotalRowCount() float64 { - if c.StatsVer >= Version2 { - return c.Histogram.TotalRowCount() + float64(c.TopN.TotalCount()) - } - return c.Histogram.TotalRowCount() -} - -func (c *Column) notNullCount() float64 { - if c.StatsVer >= Version2 { - return c.Histogram.notNullCount() + float64(c.TopN.TotalCount()) - } - return c.Histogram.notNullCount() -} - -// GetIncreaseFactor get the increase factor to adjust the final estimated count when the table is modified. -func (c *Column) GetIncreaseFactor(realtimeRowCount int64) float64 { - columnCount := c.TotalRowCount() - if columnCount == 0 { - // avoid dividing by 0 - return 1.0 - } - return float64(realtimeRowCount) / columnCount -} - -// MemoryUsage returns the total memory usage of Histogram, CMSketch, FMSketch in Column. -// We ignore the size of other metadata in Column -func (c *Column) MemoryUsage() CacheItemMemoryUsage { - var sum int64 - columnMemUsage := &ColumnMemUsage{ - ColumnID: c.Info.ID, - } - histogramMemUsage := c.Histogram.MemoryUsage() - columnMemUsage.HistogramMemUsage = histogramMemUsage - sum = histogramMemUsage - if c.CMSketch != nil { - cmSketchMemUsage := c.CMSketch.MemoryUsage() - columnMemUsage.CMSketchMemUsage = cmSketchMemUsage - sum += cmSketchMemUsage - } - if c.FMSketch != nil { - fmSketchMemUsage := c.FMSketch.MemoryUsage() - columnMemUsage.FMSketchMemUsage = fmSketchMemUsage - sum += fmSketchMemUsage - } - columnMemUsage.TotalMemUsage = sum - return columnMemUsage -} - -// HistogramNeededItems stores the columns/indices whose Histograms need to be loaded from physical kv layer. -// Currently, we only load index/pk's Histogram from kv automatically. Columns' are loaded by needs. -var HistogramNeededItems = neededStatsMap{items: map[model.TableItemID]struct{}{}} - -// IsInvalid checks if this column is invalid. If this column has histogram but not loaded yet, then we mark it -// as need histogram. -func (c *Column) IsInvalid(sctx sessionctx.Context, collPseudo bool) bool { - if collPseudo && c.NotAccurate() { - return true - } - if sctx != nil { - stmtctx := sctx.GetSessionVars().StmtCtx - if stmtctx != nil && stmtctx.StatsLoad.Fallback { - return true - } - if 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)) - } - // In some tests, the c.Info is not set, so we add this check here. - if c.Info != nil { - HistogramNeededItems.insert(model.TableItemID{TableID: c.PhysicalID, ID: c.Info.ID, IsIndex: false}) - } - } - } - // In some cases, some statistics in column would be evicted - // For example: the cmsketch of the column might be evicted while the histogram and the topn are still exists - // In this case, we will think this column as valid due to we can still use the rest of the statistics to do optimize. - return c.TotalRowCount() == 0 || (!c.IsEssentialStatsLoaded() && c.Histogram.NDV > 0) -} - -// IsHistNeeded checks if this column needs histogram to be loaded -func (c *Column) IsHistNeeded(collPseudo bool) bool { - return (!collPseudo || !c.NotAccurate()) && c.IsLoadNeeded() -} - -func (c *Column) equalRowCount(sctx sessionctx.Context, val types.Datum, encodedVal []byte, realtimeRowCount int64) (float64, error) { - if val.IsNull() { - return float64(c.NullCount), nil - } - if c.StatsVer < Version2 { - // All the values are null. - if c.Histogram.Bounds.NumRows() == 0 { - return 0.0, nil - } - if c.Histogram.NDV > 0 && c.outOfRange(val) { - return outOfRangeEQSelectivity(c.Histogram.NDV, realtimeRowCount, int64(c.TotalRowCount())) * c.TotalRowCount(), nil - } - if c.CMSketch != nil { - count, err := queryValue(sctx.GetSessionVars().StmtCtx, c.CMSketch, c.TopN, val) - return float64(count), errors.Trace(err) - } - histRowCount, _ := c.Histogram.equalRowCount(val, false) - return histRowCount, nil - } - - // Stats version == 2 - // All the values are null. - if c.Histogram.Bounds.NumRows() == 0 && c.TopN.Num() == 0 { - return 0, nil - } - // 1. try to find this value in TopN - if c.TopN != nil { - rowcount, ok := c.QueryTopN(encodedVal) - if ok { - return float64(rowcount), nil - } - } - // 2. try to find this value in bucket.Repeat(the last value in every bucket) - histCnt, matched := c.Histogram.equalRowCount(val, true) - if matched { - return histCnt, nil - } - // 3. use uniform distribution assumption for the rest (even when this value is not covered by the range of stats) - histNDV := float64(c.Histogram.NDV - int64(c.TopN.Num())) - if histNDV <= 0 { - return 0, nil - } - return c.Histogram.notNullCount() / histNDV, nil -} - -// GetColumnRowCount estimates the row count by a slice of Range. -func (c *Column) GetColumnRowCount(sctx sessionctx.Context, ranges []*ranger.Range, realtimeRowCount int64, pkIsHandle bool) (float64, error) { - sc := sctx.GetSessionVars().StmtCtx - var rowCount float64 - for _, rg := range ranges { - highVal := *rg.HighVal[0].Clone() - lowVal := *rg.LowVal[0].Clone() - if highVal.Kind() == types.KindString { - highVal.SetBytes(collate.GetCollator(highVal.Collation()).Key(highVal.GetString())) - } - if lowVal.Kind() == types.KindString { - lowVal.SetBytes(collate.GetCollator(lowVal.Collation()).Key(lowVal.GetString())) - } - cmp, err := lowVal.Compare(sc, &highVal, collate.GetBinaryCollator()) - if err != nil { - return 0, errors.Trace(err) - } - lowEncoded, err := codec.EncodeKey(sc, nil, lowVal) - if err != nil { - return 0, err - } - highEncoded, err := codec.EncodeKey(sc, nil, highVal) - if err != nil { - return 0, err - } - if cmp == 0 { - // case 1: it's a point - if !rg.LowExclude && !rg.HighExclude { - // In this case, the row count is at most 1. - if pkIsHandle { - rowCount += 1 - continue - } - var cnt float64 - cnt, err = c.equalRowCount(sctx, lowVal, lowEncoded, realtimeRowCount) - if err != nil { - return 0, errors.Trace(err) - } - // If the current table row count has changed, we should scale the row count accordingly. - cnt *= c.GetIncreaseFactor(realtimeRowCount) - rowCount += cnt - } - continue - } - // In stats ver 1, we use CM Sketch to estimate row count for point condition, which is more accurate. - // So for the small range, we convert it to points. - if c.StatsVer < 2 { - rangeVals := enumRangeValues(lowVal, highVal, rg.LowExclude, rg.HighExclude) - - // case 2: it's a small range && using ver1 stats - if rangeVals != nil { - for _, val := range rangeVals { - cnt, err := c.equalRowCount(sctx, val, lowEncoded, realtimeRowCount) - if err != nil { - return 0, err - } - // If the current table row count has changed, we should scale the row count accordingly. - cnt *= c.GetIncreaseFactor(realtimeRowCount) - rowCount += cnt - } - - continue - } - } - - // case 3: it's an interval - cnt := c.BetweenRowCount(sctx, lowVal, highVal, lowEncoded, highEncoded) - // `betweenRowCount` returns count for [l, h) range, we adjust cnt for boundaries here. - // Note that, `cnt` does not include null values, we need specially handle cases - // where null is the lower bound. - // And because we use (2, MaxValue] to represent expressions like a > 2 and use [MinNotNull, 3) to represent - // expressions like b < 3, we need to exclude the special values. - if rg.LowExclude && !lowVal.IsNull() && lowVal.Kind() != types.KindMaxValue && lowVal.Kind() != types.KindMinNotNull { - lowCnt, err := c.equalRowCount(sctx, lowVal, lowEncoded, realtimeRowCount) - if err != nil { - return 0, errors.Trace(err) - } - cnt -= lowCnt - cnt = mathutil.Clamp(cnt, 0, c.notNullCount()) - } - if !rg.LowExclude && lowVal.IsNull() { - cnt += float64(c.NullCount) - } - if !rg.HighExclude && highVal.Kind() != types.KindMaxValue && highVal.Kind() != types.KindMinNotNull { - highCnt, err := c.equalRowCount(sctx, highVal, highEncoded, realtimeRowCount) - if err != nil { - return 0, errors.Trace(err) - } - cnt += highCnt - } - - cnt = mathutil.Clamp(cnt, 0, c.TotalRowCount()) - - // If the current table row count has changed, we should scale the row count accordingly. - cnt *= c.GetIncreaseFactor(realtimeRowCount) - - // handling the out-of-range part - if (c.outOfRange(lowVal) && !lowVal.IsNull()) || c.outOfRange(highVal) { - increaseCount := realtimeRowCount - int64(c.TotalRowCount()) - if increaseCount < 0 { - increaseCount = 0 - } - cnt += c.Histogram.outOfRangeRowCount(&lowVal, &highVal, increaseCount) - } - - rowCount += cnt - } - rowCount = mathutil.Clamp(rowCount, 0, float64(realtimeRowCount)) - return rowCount, nil -} - -// ItemID implements TableCacheItem -func (c *Column) ItemID() int64 { - return c.Info.ID -} - -// DropEvicted implements TableCacheItem -// DropEvicted drops evicted structures -func (c *Column) DropEvicted() { - if c.StatsVer < Version2 && c.IsStatsInitialized() { - c.CMSketch = nil - c.evictedStatus = onlyCmsEvicted - } -} - -// Index represents an index histogram. -type Index struct { - Histogram - *CMSketch - *TopN - FMSketch *FMSketch - ErrorRate - StatsVer int64 // StatsVer is the version of the current stats, used to maintain compatibility - Info *model.IndexInfo - Flag int64 - LastAnalyzePos types.Datum - PhysicalID int64 - StatsLoadedStatus -} - -// ItemID implements TableCacheItem -func (idx *Index) ItemID() int64 { - return idx.Info.ID -} - -// DropEvicted implements TableCacheItem -// DropEvicted drops evicted structures -func (idx *Index) DropEvicted() { - idx.CMSketch = nil -} - -// IsEvicted returns whether index statistics got evicted -func (idx *Index) IsEvicted() bool { - switch idx.StatsVer { - case Version1: - return idx.CMSketch == nil - default: - return false - } -} - -func (idx *Index) String() string { - return idx.Histogram.ToString(len(idx.Info.Columns)) -} - -// TotalRowCount returns the total count of this index. -func (idx *Index) TotalRowCount() float64 { - idx.checkStats() - if idx.StatsVer >= Version2 { - return idx.Histogram.TotalRowCount() + float64(idx.TopN.TotalCount()) - } - return idx.Histogram.TotalRowCount() -} - -// IsInvalid checks if this index is invalid. -func (idx *Index) IsInvalid(collPseudo bool) bool { - if !collPseudo { - idx.checkStats() - } - return (collPseudo && idx.NotAccurate()) || idx.TotalRowCount() == 0 -} - -// EvictAllStats evicts all stats -// Note that this function is only used for test -func (idx *Index) EvictAllStats() { - idx.Buckets = nil - idx.CMSketch = nil - idx.TopN = nil - idx.StatsLoadedStatus.evictedStatus = allEvicted -} - -// MemoryUsage returns the total memory usage of a Histogram and CMSketch in Index. -// We ignore the size of other metadata in Index. -func (idx *Index) MemoryUsage() CacheItemMemoryUsage { - var sum int64 - indexMemUsage := &IndexMemUsage{ - IndexID: idx.Info.ID, - } - histMemUsage := idx.Histogram.MemoryUsage() - indexMemUsage.HistogramMemUsage = histMemUsage - sum = histMemUsage - if idx.CMSketch != nil { - cmSketchMemUsage := idx.CMSketch.MemoryUsage() - indexMemUsage.CMSketchMemUsage = cmSketchMemUsage - sum += cmSketchMemUsage - } - indexMemUsage.TotalMemUsage = sum - return indexMemUsage -} - -var nullKeyBytes, _ = codec.EncodeKey(nil, nil, types.NewDatum(nil)) - -func (idx *Index) equalRowCount(b []byte, realtimeRowCount int64) float64 { - if len(idx.Info.Columns) == 1 { - if bytes.Equal(b, nullKeyBytes) { - return float64(idx.NullCount) - } - } - val := types.NewBytesDatum(b) - if idx.StatsVer < Version2 { - if idx.NDV > 0 && idx.outOfRange(val) { - return outOfRangeEQSelectivity(idx.NDV, realtimeRowCount, int64(idx.TotalRowCount())) * idx.TotalRowCount() - } - if idx.CMSketch != nil { - return float64(idx.QueryBytes(b)) - } - histRowCount, _ := idx.Histogram.equalRowCount(val, false) - return histRowCount - } - // stats version == 2 - // 1. try to find this value in TopN - count, found := idx.TopN.QueryTopN(b) - if found { - return float64(count) - } - // 2. try to find this value in bucket.Repeat(the last value in every bucket) - histCnt, matched := idx.Histogram.equalRowCount(val, true) - if matched { - return histCnt - } - // 3. use uniform distribution assumption for the rest (even when this value is not covered by the range of stats) - histNDV := float64(idx.Histogram.NDV - int64(idx.TopN.Num())) - if histNDV <= 0 { - return 0 - } - return idx.Histogram.notNullCount() / histNDV -} - -// QueryBytes is used to query the count of specified bytes. -func (idx *Index) QueryBytes(d []byte) uint64 { - idx.checkStats() - h1, h2 := murmur3.Sum128(d) - if count, ok := idx.TopN.QueryTopN(d); ok { - return count - } - return idx.queryHashValue(h1, h2) -} - -// GetRowCount returns the row count of the given ranges. -// It uses the modifyCount to adjust the influence of modifications on the table. -func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRanges []*ranger.Range, realtimeRowCount int64) (float64, error) { - idx.checkStats() - sc := sctx.GetSessionVars().StmtCtx - totalCount := float64(0) - isSingleCol := len(idx.Info.Columns) == 1 - for _, indexRange := range indexRanges { - lb, err := codec.EncodeKey(sc, nil, indexRange.LowVal...) - if err != nil { - return 0, err - } - rb, err := codec.EncodeKey(sc, nil, indexRange.HighVal...) - if err != nil { - return 0, err - } - fullLen := len(indexRange.LowVal) == len(indexRange.HighVal) && len(indexRange.LowVal) == len(idx.Info.Columns) - if bytes.Equal(lb, rb) { - // case 1: it's a point - if indexRange.LowExclude || indexRange.HighExclude { - continue - } - if fullLen { - // At most 1 in this case. - if idx.Info.Unique { - totalCount += 1 - continue - } - count := idx.equalRowCount(lb, realtimeRowCount) - // If the current table row count has changed, we should scale the row count accordingly. - count *= idx.GetIncreaseFactor(realtimeRowCount) - totalCount += count - continue - } - } - - // case 2: it's an interval - // The final interval is [low, high) - if indexRange.LowExclude { - lb = kv.Key(lb).PrefixNext() - } - if !indexRange.HighExclude { - rb = kv.Key(rb).PrefixNext() - } - l := types.NewBytesDatum(lb) - r := types.NewBytesDatum(rb) - lowIsNull := bytes.Equal(lb, nullKeyBytes) - if isSingleCol && lowIsNull { - totalCount += float64(idx.NullCount) - } - expBackoffSuccess := false - // Due to the limitation of calcFraction and convertDatumToScalar, the histogram actually won't estimate anything. - // If the first column's range is point. - if rangePosition := GetOrdinalOfRangeCond(sc, indexRange); rangePosition > 0 && idx.StatsVer >= Version2 && coll != nil { - var expBackoffSel float64 - expBackoffSel, expBackoffSuccess, err = idx.expBackoffEstimation(sctx, coll, indexRange) - if err != nil { - return 0, err - } - if expBackoffSuccess { - expBackoffCnt := expBackoffSel * idx.TotalRowCount() - - upperLimit := expBackoffCnt - // Use the multi-column stats to calculate the max possible row count of [l, r) - if idx.Len() > 0 { - _, lowerBkt, _, _ := idx.locateBucket(l) - _, upperBkt, _, _ := idx.locateBucket(r) - // Use Count of the Bucket before l as the lower bound. - preCount := float64(0) - if lowerBkt > 0 { - preCount = float64(idx.Buckets[lowerBkt-1].Count) - } - // Use Count of the Bucket where r exists as the upper bound. - upperCnt := float64(idx.Buckets[upperBkt].Count) - upperLimit = upperCnt - preCount - upperLimit += float64(idx.TopN.BetweenCount(lb, rb)) - } - - // If the result of exponential backoff strategy is larger than the result from multi-column stats, - // use the upper limit from multi-column histogram instead. - if expBackoffCnt > upperLimit { - expBackoffCnt = upperLimit - } - totalCount += expBackoffCnt - } - } - if !expBackoffSuccess { - totalCount += idx.BetweenRowCount(l, r) - } - - // If the current table row count has changed, we should scale the row count accordingly. - totalCount *= idx.GetIncreaseFactor(realtimeRowCount) - - // handling the out-of-range part - if (idx.outOfRange(l) && !(isSingleCol && lowIsNull)) || idx.outOfRange(r) { - increaseCount := realtimeRowCount - int64(idx.TotalRowCount()) - if increaseCount < 0 { - increaseCount = 0 - } - totalCount += idx.Histogram.outOfRangeRowCount(&l, &r, increaseCount) - } - } - totalCount = mathutil.Clamp(totalCount, 0, float64(realtimeRowCount)) - return totalCount, nil -} - -// expBackoffEstimation estimate the multi-col cases following the Exponential Backoff. See comment below for details. -func (idx *Index) expBackoffEstimation(sctx sessionctx.Context, coll *HistColl, indexRange *ranger.Range) (float64, bool, error) { - tmpRan := []*ranger.Range{ - { - LowVal: make([]types.Datum, 1), - HighVal: make([]types.Datum, 1), - Collators: make([]collate.Collator, 1), - }, - } - colsIDs := coll.Idx2ColumnIDs[idx.ID] - singleColumnEstResults := make([]float64, 0, len(indexRange.LowVal)) - // The following codes uses Exponential Backoff to reduce the impact of independent assumption. It works like: - // 1. Calc the selectivity of each column. - // 2. Sort them and choose the first 4 most selective filter and the corresponding selectivity is sel_1, sel_2, sel_3, sel_4 where i < j => sel_i < sel_j. - // 3. The final selectivity would be sel_1 * sel_2^{1/2} * sel_3^{1/4} * sel_4^{1/8}. - // This calculation reduced the independence assumption and can work well better than it. - for i := 0; i < len(indexRange.LowVal); i++ { - tmpRan[0].LowVal[0] = indexRange.LowVal[i] - tmpRan[0].HighVal[0] = indexRange.HighVal[i] - tmpRan[0].Collators[0] = indexRange.Collators[0] - if i == len(indexRange.LowVal)-1 { - tmpRan[0].LowExclude = indexRange.LowExclude - tmpRan[0].HighExclude = indexRange.HighExclude - } - colID := colsIDs[i] - var ( - count float64 - err error - ) - if anotherIdxID, ok := coll.ColID2IdxID[colID]; ok && anotherIdxID != idx.ID { - count, err = coll.GetRowCountByIndexRanges(sctx, anotherIdxID, tmpRan) - } else if col, ok := coll.Columns[colID]; ok && !col.IsInvalid(sctx, coll.Pseudo) { - count, err = coll.GetRowCountByColumnRanges(sctx, colID, tmpRan) - } else { - continue - } - if err != nil { - return 0, false, err - } - singleColumnEstResults = append(singleColumnEstResults, count) - } - // 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.Count) - } - failpoint.Inject("cleanEstResults", func() { - singleColumnEstResults = singleColumnEstResults[:0] - l = 0 - }) - if l == 1 { - return singleColumnEstResults[0], true, nil - } else if l == 2 { - return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]), true, nil - } else if l == 3 { - return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])), true, nil - } else if l == 0 { - return 0, false, nil - } - return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])) * math.Sqrt(math.Sqrt(math.Sqrt(singleColumnEstResults[3]))), true, nil -} - -func (idx *Index) checkStats() { - if idx.IsFullLoad() { - return - } - HistogramNeededItems.insert(model.TableItemID{TableID: idx.PhysicalID, ID: idx.Info.ID, IsIndex: true}) -} - type countByRangeFunc = func(sessionctx.Context, int64, []*ranger.Range) (float64, error) // newHistogramBySelectivity fulfills the content of new histogram by the given selectivity result. @@ -1677,54 +983,6 @@ func newHistogramBySelectivity(sctx sessionctx.Context, histID int64, oldHist, n return nil } -func (idx *Index) newIndexBySelectivity(sc *stmtctx.StatementContext, statsNode *StatsNode) (*Index, error) { - var ( - ranLowEncode, ranHighEncode []byte - err error - ) - newIndexHist := &Index{Info: idx.Info, StatsVer: idx.StatsVer, CMSketch: idx.CMSketch, PhysicalID: idx.PhysicalID} - newIndexHist.Histogram = *NewHistogram(idx.ID, int64(float64(idx.NDV)*statsNode.Selectivity), 0, 0, types.NewFieldType(mysql.TypeBlob), chunk.InitialCapacity, 0) - - lowBucketIdx, highBucketIdx := 0, 0 - var totCnt int64 - - // Bucket bound of index is encoded one, so we need to decode it if we want to calculate the fraction accurately. - // TODO: enhance its calculation. - // Now just remove the bucket that no range fell in. - for _, ran := range statsNode.Ranges { - lowBucketIdx = highBucketIdx - ranLowEncode, ranHighEncode, err = ran.Encode(sc, ranLowEncode, ranHighEncode) - if err != nil { - return nil, err - } - for ; highBucketIdx < idx.Len(); highBucketIdx++ { - // Encoded value can only go to its next quickly. So ranHighEncode is actually range.HighVal's PrefixNext value. - // So the Bound should also go to its PrefixNext. - bucketLowerEncoded := idx.Bounds.GetRow(highBucketIdx * 2).GetBytes(0) - if bytes.Compare(ranHighEncode, kv.Key(bucketLowerEncoded).PrefixNext()) < 0 { - break - } - } - for ; lowBucketIdx < highBucketIdx; lowBucketIdx++ { - bucketUpperEncoded := idx.Bounds.GetRow(lowBucketIdx*2 + 1).GetBytes(0) - if bytes.Compare(ranLowEncode, bucketUpperEncoded) <= 0 { - break - } - } - if lowBucketIdx >= idx.Len() { - break - } - for i := lowBucketIdx; i < highBucketIdx; i++ { - newIndexHist.Bounds.AppendRow(idx.Bounds.GetRow(i * 2)) - newIndexHist.Bounds.AppendRow(idx.Bounds.GetRow(i*2 + 1)) - totCnt += idx.bucketCount(i) - newIndexHist.Buckets = append(newIndexHist.Buckets, Bucket{Repeat: idx.Buckets[i].Repeat, Count: totCnt}) - newIndexHist.scalars = append(newIndexHist.scalars, idx.scalars[i]) - } - } - return newIndexHist, nil -} - // NewHistCollBySelectivity creates new HistColl by the given statsNodes. func (coll *HistColl) NewHistCollBySelectivity(sctx sessionctx.Context, statsNodes []*StatsNode) *HistColl { newColl := &HistColl{ @@ -1807,25 +1065,6 @@ func (coll *HistColl) NewHistCollBySelectivity(sctx sessionctx.Context, statsNod return newColl } -func (idx *Index) outOfRange(val types.Datum) bool { - if !idx.Histogram.outOfRange(val) { - return false - } - if idx.Histogram.Len() > 0 && matchPrefix(idx.Bounds.GetRow(0), 0, &val) { - return false - } - return true -} - -// matchPrefix checks whether ad is the prefix of value -func matchPrefix(row chunk.Row, colIdx int, ad *types.Datum) bool { - switch ad.Kind() { - case types.KindString, types.KindBytes, types.KindBinaryLiteral, types.KindMysqlBit: - return strings.HasPrefix(row.GetString(colIdx), ad.GetString()) - } - return false -} - type dataCnt struct { data []byte cnt uint64 @@ -2157,6 +1396,8 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog if types.IsTypeTime(hists[0].Tp.GetType()) { // handle datetime values specially since they are encoded to int and we'll get int values if using DecodeOne. _, d, err = codec.DecodeAsDateTime(meta.Encoded, hists[0].Tp.GetType(), sc.TimeZone) + } else if types.IsTypeFloat(hists[0].Tp.GetType()) { + _, d, err = codec.DecodeAsFloat32(meta.Encoded, hists[0].Tp.GetType()) } else { _, d, err = codec.DecodeOne(meta.Encoded) } @@ -2301,7 +1542,7 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog const ( allLoaded = iota onlyCmsEvicted - //onlyHistRemained + onlyHistRemained allEvicted ) @@ -2345,6 +1586,11 @@ func (s StatsLoadedStatus) IsCMSEvicted() bool { return s.statsInitialized && s.evictedStatus >= onlyCmsEvicted } +// IsTopNEvicted indicates whether the topn got evicted now. +func (s StatsLoadedStatus) IsTopNEvicted() bool { + return s.statsInitialized && s.evictedStatus >= onlyHistRemained +} + // IsFullLoad indicates whether the stats are full loaded func (s StatsLoadedStatus) IsFullLoad() bool { return s.statsInitialized && s.evictedStatus == allLoaded diff --git a/statistics/histogram_test.go b/statistics/histogram_test.go index 78c68d3a16dab..8c858e49582d2 100644 --- a/statistics/histogram_test.go +++ b/statistics/histogram_test.go @@ -469,3 +469,23 @@ func TestMergeBucketNDV(t *testing.T) { require.Equal(t, res.disjointNDV, tt.result.disjointNDV) } } + +func TestIndexQueryBytes(t *testing.T) { + ctx := mock.NewContext() + sc := ctx.GetSessionVars().StmtCtx + idx := &Index{Info: &model.IndexInfo{Columns: []*model.IndexColumn{{Name: model.NewCIStr("a"), Offset: 0}}}} + idx.Histogram = *NewHistogram(0, 15, 0, 0, types.NewFieldType(mysql.TypeBlob), 0, 0) + low, err1 := codec.EncodeKey(sc, nil, types.NewBytesDatum([]byte("0"))) + require.NoError(t, err1) + high, err2 := codec.EncodeKey(sc, nil, types.NewBytesDatum([]byte("3"))) + require.NoError(t, err2) + idx.Bounds.AppendBytes(0, low) + idx.Bounds.AppendBytes(0, high) + idx.Buckets = append(idx.Buckets, Bucket{Repeat: 10, Count: 20, NDV: 20}) + idx.PreCalculateScalar() + idx.CMSketch = nil + // Count / NDV + require.Equal(t, idx.QueryBytes(low), uint64(1)) + // Repeat + require.Equal(t, idx.QueryBytes(high), uint64(10)) +} diff --git a/statistics/index.go b/statistics/index.go new file mode 100644 index 0000000000000..c5e023f47aee5 --- /dev/null +++ b/statistics/index.go @@ -0,0 +1,470 @@ +// 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 statistics + +import ( + "bytes" + "math" + "strings" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/mathutil" + "github.com/pingcap/tidb/util/ranger" + "github.com/twmb/murmur3" + "golang.org/x/exp/slices" +) + +// Index represents an index histogram. +type Index struct { + Histogram + CMSketch *CMSketch + TopN *TopN + FMSketch *FMSketch + ErrorRate + StatsVer int64 // StatsVer is the version of the current stats, used to maintain compatibility + Info *model.IndexInfo + Flag int64 + LastAnalyzePos types.Datum + PhysicalID int64 + StatsLoadedStatus +} + +// ItemID implements TableCacheItem +func (idx *Index) ItemID() int64 { + return idx.Info.ID +} + +// IsAllEvicted indicates whether all stats evicted +func (idx *Index) IsAllEvicted() bool { + return idx.statsInitialized && idx.evictedStatus >= allEvicted +} + +func (idx *Index) dropCMS() { + idx.CMSketch = nil + idx.evictedStatus = onlyCmsEvicted +} + +func (idx *Index) dropTopN() { + originTopNNum := int64(idx.TopN.Num()) + idx.TopN = nil + if len(idx.Histogram.Buckets) == 0 && originTopNNum >= idx.Histogram.NDV { + // This indicates index has topn instead of histogram + idx.evictedStatus = allEvicted + } else { + idx.evictedStatus = onlyHistRemained + } +} + +func (idx *Index) getEvictedStatus() int { + return idx.evictedStatus +} + +func (idx *Index) isStatsInitialized() bool { + return idx.statsInitialized +} + +func (idx *Index) statsVer() int64 { + return idx.StatsVer +} + +func (idx *Index) isCMSExist() bool { + return idx.CMSketch != nil +} + +// IsEvicted returns whether index statistics got evicted +func (idx *Index) IsEvicted() bool { + return idx.evictedStatus != allLoaded +} + +func (idx *Index) String() string { + return idx.Histogram.ToString(len(idx.Info.Columns)) +} + +// TotalRowCount returns the total count of this index. +func (idx *Index) TotalRowCount() float64 { + idx.checkStats() + if idx.StatsVer >= Version2 { + return idx.Histogram.TotalRowCount() + float64(idx.TopN.TotalCount()) + } + return idx.Histogram.TotalRowCount() +} + +// IsInvalid checks if this index is invalid. +func (idx *Index) IsInvalid(collPseudo bool) bool { + if !collPseudo { + idx.checkStats() + } + return (collPseudo && idx.ErrorRate.NotAccurate()) || idx.TotalRowCount() == 0 +} + +// EvictAllStats evicts all stats +// Note that this function is only used for test +func (idx *Index) EvictAllStats() { + idx.Histogram.Buckets = nil + idx.CMSketch = nil + idx.TopN = nil + idx.StatsLoadedStatus.evictedStatus = allEvicted +} + +// MemoryUsage returns the total memory usage of a Histogram and CMSketch in Index. +// We ignore the size of other metadata in Index. +func (idx *Index) MemoryUsage() CacheItemMemoryUsage { + var sum int64 + indexMemUsage := &IndexMemUsage{ + IndexID: idx.Info.ID, + } + histMemUsage := idx.Histogram.MemoryUsage() + indexMemUsage.HistogramMemUsage = histMemUsage + sum = histMemUsage + if idx.CMSketch != nil { + cmSketchMemUsage := idx.CMSketch.MemoryUsage() + indexMemUsage.CMSketchMemUsage = cmSketchMemUsage + sum += cmSketchMemUsage + } + if idx.TopN != nil { + topnMemUsage := idx.TopN.MemoryUsage() + indexMemUsage.TopNMemUsage = topnMemUsage + sum += topnMemUsage + } + indexMemUsage.TotalMemUsage = sum + return indexMemUsage +} + +var nullKeyBytes, _ = codec.EncodeKey(nil, nil, types.NewDatum(nil)) + +func (idx *Index) equalRowCount(b []byte, realtimeRowCount int64) float64 { + if len(idx.Info.Columns) == 1 { + if bytes.Equal(b, nullKeyBytes) { + return float64(idx.Histogram.NullCount) + } + } + val := types.NewBytesDatum(b) + if idx.StatsVer < Version2 { + if idx.Histogram.NDV > 0 && idx.outOfRange(val) { + return outOfRangeEQSelectivity(idx.Histogram.NDV, realtimeRowCount, int64(idx.TotalRowCount())) * idx.TotalRowCount() + } + if idx.CMSketch != nil { + return float64(idx.QueryBytes(b)) + } + histRowCount, _ := idx.Histogram.equalRowCount(val, false) + return histRowCount + } + // stats version == 2 + // 1. try to find this value in TopN + if idx.TopN != nil { + count, found := idx.TopN.QueryTopN(b) + if found { + return float64(count) + } + } + // 2. try to find this value in bucket.Repeat(the last value in every bucket) + histCnt, matched := idx.Histogram.equalRowCount(val, true) + if matched { + return histCnt + } + // 3. use uniform distribution assumption for the rest (even when this value is not covered by the range of stats) + histNDV := float64(idx.Histogram.NDV - int64(idx.TopN.Num())) + if histNDV <= 0 { + return 0 + } + return idx.Histogram.notNullCount() / histNDV +} + +// QueryBytes is used to query the count of specified bytes. +func (idx *Index) QueryBytes(d []byte) uint64 { + idx.checkStats() + h1, h2 := murmur3.Sum128(d) + if idx.TopN != nil { + if count, ok := idx.TopN.QueryTopN(d); ok { + return count + } + } + if idx.CMSketch != nil { + return idx.CMSketch.queryHashValue(h1, h2) + } + v, _ := idx.Histogram.equalRowCount(types.NewBytesDatum(d), idx.StatsVer >= Version2) + return uint64(v) +} + +// GetRowCount returns the row count of the given ranges. +// It uses the modifyCount to adjust the influence of modifications on the table. +func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRanges []*ranger.Range, realtimeRowCount int64) (float64, error) { + idx.checkStats() + sc := sctx.GetSessionVars().StmtCtx + totalCount := float64(0) + isSingleCol := len(idx.Info.Columns) == 1 + for _, indexRange := range indexRanges { + lb, err := codec.EncodeKey(sc, nil, indexRange.LowVal...) + if err != nil { + return 0, err + } + rb, err := codec.EncodeKey(sc, nil, indexRange.HighVal...) + if err != nil { + return 0, err + } + fullLen := len(indexRange.LowVal) == len(indexRange.HighVal) && len(indexRange.LowVal) == len(idx.Info.Columns) + if bytes.Equal(lb, rb) { + // case 1: it's a point + if indexRange.LowExclude || indexRange.HighExclude { + continue + } + if fullLen { + // At most 1 in this case. + if idx.Info.Unique { + totalCount += 1 + continue + } + count := idx.equalRowCount(lb, realtimeRowCount) + // If the current table row count has changed, we should scale the row count accordingly. + count *= idx.GetIncreaseFactor(realtimeRowCount) + totalCount += count + continue + } + } + + // case 2: it's an interval + // The final interval is [low, high) + if indexRange.LowExclude { + lb = kv.Key(lb).PrefixNext() + } + if !indexRange.HighExclude { + rb = kv.Key(rb).PrefixNext() + } + l := types.NewBytesDatum(lb) + r := types.NewBytesDatum(rb) + lowIsNull := bytes.Equal(lb, nullKeyBytes) + if isSingleCol && lowIsNull { + totalCount += float64(idx.Histogram.NullCount) + } + expBackoffSuccess := false + // Due to the limitation of calcFraction and convertDatumToScalar, the histogram actually won't estimate anything. + // If the first column's range is point. + if rangePosition := GetOrdinalOfRangeCond(sc, indexRange); rangePosition > 0 && idx.StatsVer >= Version2 && coll != nil { + var expBackoffSel float64 + expBackoffSel, expBackoffSuccess, err = idx.expBackoffEstimation(sctx, coll, indexRange) + if err != nil { + return 0, err + } + if expBackoffSuccess { + expBackoffCnt := expBackoffSel * idx.TotalRowCount() + + upperLimit := expBackoffCnt + // Use the multi-column stats to calculate the max possible row count of [l, r) + if idx.Histogram.Len() > 0 { + _, lowerBkt, _, _ := idx.Histogram.locateBucket(l) + _, upperBkt, _, _ := idx.Histogram.locateBucket(r) + // Use Count of the Bucket before l as the lower bound. + preCount := float64(0) + if lowerBkt > 0 { + preCount = float64(idx.Histogram.Buckets[lowerBkt-1].Count) + } + // Use Count of the Bucket where r exists as the upper bound. + upperCnt := float64(idx.Histogram.Buckets[upperBkt].Count) + upperLimit = upperCnt - preCount + upperLimit += float64(idx.TopN.BetweenCount(lb, rb)) + } + + // If the result of exponential backoff strategy is larger than the result from multi-column stats, + // use the upper limit from multi-column histogram instead. + if expBackoffCnt > upperLimit { + expBackoffCnt = upperLimit + } + totalCount += expBackoffCnt + } + } + if !expBackoffSuccess { + totalCount += idx.BetweenRowCount(l, r) + } + + // If the current table row count has changed, we should scale the row count accordingly. + totalCount *= idx.GetIncreaseFactor(realtimeRowCount) + + // handling the out-of-range part + if (idx.outOfRange(l) && !(isSingleCol && lowIsNull)) || idx.outOfRange(r) { + increaseCount := realtimeRowCount - int64(idx.TotalRowCount()) + if increaseCount < 0 { + increaseCount = 0 + } + totalCount += idx.Histogram.outOfRangeRowCount(&l, &r, increaseCount) + } + } + totalCount = mathutil.Clamp(totalCount, 0, float64(realtimeRowCount)) + return totalCount, nil +} + +// expBackoffEstimation estimate the multi-col cases following the Exponential Backoff. See comment below for details. +func (idx *Index) expBackoffEstimation(sctx sessionctx.Context, coll *HistColl, indexRange *ranger.Range) (float64, bool, error) { + tmpRan := []*ranger.Range{ + { + LowVal: make([]types.Datum, 1), + HighVal: make([]types.Datum, 1), + Collators: make([]collate.Collator, 1), + }, + } + colsIDs := coll.Idx2ColumnIDs[idx.Histogram.ID] + singleColumnEstResults := make([]float64, 0, len(indexRange.LowVal)) + // The following codes uses Exponential Backoff to reduce the impact of independent assumption. It works like: + // 1. Calc the selectivity of each column. + // 2. Sort them and choose the first 4 most selective filter and the corresponding selectivity is sel_1, sel_2, sel_3, sel_4 where i < j => sel_i < sel_j. + // 3. The final selectivity would be sel_1 * sel_2^{1/2} * sel_3^{1/4} * sel_4^{1/8}. + // This calculation reduced the independence assumption and can work well better than it. + for i := 0; i < len(indexRange.LowVal); i++ { + tmpRan[0].LowVal[0] = indexRange.LowVal[i] + tmpRan[0].HighVal[0] = indexRange.HighVal[i] + tmpRan[0].Collators[0] = indexRange.Collators[0] + if i == len(indexRange.LowVal)-1 { + tmpRan[0].LowExclude = indexRange.LowExclude + tmpRan[0].HighExclude = indexRange.HighExclude + } + colID := colsIDs[i] + var ( + count float64 + err error + ) + if anotherIdxID, ok := coll.ColID2IdxID[colID]; ok && anotherIdxID != idx.Histogram.ID { + count, err = coll.GetRowCountByIndexRanges(sctx, anotherIdxID, tmpRan) + } else if col, ok := coll.Columns[colID]; ok && !col.IsInvalid(sctx, coll.Pseudo) { + count, err = coll.GetRowCountByColumnRanges(sctx, colID, tmpRan) + } else { + continue + } + if err != nil { + return 0, false, err + } + singleColumnEstResults = append(singleColumnEstResults, count) + } + // 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.Count) + } + failpoint.Inject("cleanEstResults", func() { + singleColumnEstResults = singleColumnEstResults[:0] + l = 0 + }) + if l == 1 { + return singleColumnEstResults[0], true, nil + } else if l == 2 { + return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]), true, nil + } else if l == 3 { + return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])), true, nil + } else if l == 0 { + return 0, false, nil + } + return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])) * math.Sqrt(math.Sqrt(math.Sqrt(singleColumnEstResults[3]))), true, nil +} + +func (idx *Index) checkStats() { + if idx.IsFullLoad() { + return + } + HistogramNeededItems.insert(model.TableItemID{TableID: idx.PhysicalID, ID: idx.Info.ID, IsIndex: true}) +} + +func (idx *Index) newIndexBySelectivity(sc *stmtctx.StatementContext, statsNode *StatsNode) (*Index, error) { + var ( + ranLowEncode, ranHighEncode []byte + err error + ) + newIndexHist := &Index{Info: idx.Info, StatsVer: idx.StatsVer, CMSketch: idx.CMSketch, PhysicalID: idx.PhysicalID} + newIndexHist.Histogram = *NewHistogram(idx.Histogram.ID, int64(float64(idx.Histogram.NDV)*statsNode.Selectivity), 0, 0, types.NewFieldType(mysql.TypeBlob), chunk.InitialCapacity, 0) + + lowBucketIdx, highBucketIdx := 0, 0 + var totCnt int64 + + // Bucket bound of index is encoded one, so we need to decode it if we want to calculate the fraction accurately. + // TODO: enhance its calculation. + // Now just remove the bucket that no range fell in. + for _, ran := range statsNode.Ranges { + lowBucketIdx = highBucketIdx + ranLowEncode, ranHighEncode, err = ran.Encode(sc, ranLowEncode, ranHighEncode) + if err != nil { + return nil, err + } + for ; highBucketIdx < idx.Histogram.Len(); highBucketIdx++ { + // Encoded value can only go to its next quickly. So ranHighEncode is actually range.HighVal's PrefixNext value. + // So the Bound should also go to its PrefixNext. + bucketLowerEncoded := idx.Histogram.Bounds.GetRow(highBucketIdx * 2).GetBytes(0) + if bytes.Compare(ranHighEncode, kv.Key(bucketLowerEncoded).PrefixNext()) < 0 { + break + } + } + for ; lowBucketIdx < highBucketIdx; lowBucketIdx++ { + bucketUpperEncoded := idx.Histogram.Bounds.GetRow(lowBucketIdx*2 + 1).GetBytes(0) + if bytes.Compare(ranLowEncode, bucketUpperEncoded) <= 0 { + break + } + } + if lowBucketIdx >= idx.Histogram.Len() { + break + } + for i := lowBucketIdx; i < highBucketIdx; i++ { + newIndexHist.Histogram.Bounds.AppendRow(idx.Histogram.Bounds.GetRow(i * 2)) + newIndexHist.Histogram.Bounds.AppendRow(idx.Histogram.Bounds.GetRow(i*2 + 1)) + totCnt += idx.Histogram.bucketCount(i) + newIndexHist.Histogram.Buckets = append(newIndexHist.Histogram.Buckets, Bucket{Repeat: idx.Histogram.Buckets[i].Repeat, Count: totCnt}) + newIndexHist.Histogram.scalars = append(newIndexHist.Histogram.scalars, idx.Histogram.scalars[i]) + } + } + return newIndexHist, nil +} + +func (idx *Index) outOfRange(val types.Datum) bool { + if !idx.Histogram.outOfRange(val) { + return false + } + if idx.Histogram.Len() > 0 && matchPrefix(idx.Histogram.Bounds.GetRow(0), 0, &val) { + return false + } + return true +} + +// GetIncreaseFactor get the increase factor to adjust the final estimated count when the table is modified. +func (idx *Index) GetIncreaseFactor(realtimeRowCount int64) float64 { + columnCount := idx.TotalRowCount() + if columnCount == 0 { + return 1.0 + } + return float64(realtimeRowCount) / columnCount +} + +// BetweenRowCount estimates the row count for interval [l, r). +func (idx *Index) BetweenRowCount(l, r types.Datum) float64 { + histBetweenCnt := idx.Histogram.BetweenRowCount(l, r) + if idx.StatsVer == Version1 { + return histBetweenCnt + } + return float64(idx.TopN.BetweenCount(l.GetBytes(), r.GetBytes())) + histBetweenCnt +} + +// matchPrefix checks whether ad is the prefix of value +func matchPrefix(row chunk.Row, colIdx int, ad *types.Datum) bool { + switch ad.Kind() { + case types.KindString, types.KindBytes, types.KindBinaryLiteral, types.KindMysqlBit: + return strings.HasPrefix(row.GetString(colIdx), ad.GetString()) + } + return false +} diff --git a/statistics/sample_test.go b/statistics/sample_test.go index 6f14fbd04acd9..7e3058edcd537 100644 --- a/statistics/sample_test.go +++ b/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) + hist, topN, err := BuildHistAndTopN(ctx, 5, 4, 1, collector, tp, true, nil) require.Nilf(t, err, "%+v", err) topNStr, err := topN.DecodedString(ctx, []byte{tp.GetType()}) require.NoError(t, err) diff --git a/statistics/selectivity.go b/statistics/selectivity.go index 464b35875d3de..380887acf193f 100644 --- a/statistics/selectivity.go +++ b/statistics/selectivity.go @@ -317,109 +317,175 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp } } - // Try to cover Constants + notCoveredConstants := make(map[int]*expression.Constant) + notCoveredDNF := make(map[int]*expression.ScalarFunction) + notCoveredStrMatch := make(map[int]*expression.ScalarFunction) + notCoveredNegateStrMatch := make(map[int]*expression.ScalarFunction) + notCoveredOtherExpr := make(map[int]expression.Expression) if mask > 0 { for i, expr := range remainedExprs { if mask&(1< 0 { - OUTER: - for i, expr := range remainedExprs { - if mask&(1< 0 { - ret *= selectionFactor + minSelectivity := 1.0 + if len(notCoveredConstants) > 0 || len(notCoveredDNF) > 0 || len(notCoveredOtherExpr) > 0 { + minSelectivity = math.Min(minSelectivity, selectionFactor) + } + if len(notCoveredStrMatch) > 0 { + minSelectivity = math.Min(minSelectivity, ctx.GetSessionVars().GetStrMatchDefaultSelectivity()) + } + if len(notCoveredNegateStrMatch) > 0 { + minSelectivity = math.Min(minSelectivity, ctx.GetSessionVars().GetNegateStrMatchDefaultSelectivity()) + } + ret *= minSelectivity } + if sc.EnableOptimizerCETrace { // Tracing for the expression estimation results after applying the default selectivity. totalExpr := expression.ComposeCNFCondition(ctx, remainedExprs...) diff --git a/statistics/selectivity_test.go b/statistics/selectivity_test.go index 675263bc241be..3d773eb0b51c7 100644 --- a/statistics/selectivity_test.go +++ b/statistics/selectivity_test.go @@ -19,12 +19,14 @@ import ( "fmt" "math" "os" + "regexp" "runtime/pprof" "testing" "time" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" plannercore "github.com/pingcap/tidb/planner/core" @@ -893,3 +895,118 @@ func TestSelectivityGreedyAlgo(t *testing.T) { require.Equal(t, 1, len(usedSets)) require.Equal(t, int64(1), usedSets[0].ID) } + +func TestDefaultSelectivityForStrMatch(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b varchar(100))") + + var ( + input []string + output []struct { + SQL string + Result []string + } + ) + + statsSuiteData := statistics.GetIntegrationSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + + matchExplain, err := regexp.Compile("^explain") + require.NoError(t, err) + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + }) + ok := matchExplain.MatchString(tt) + if !ok { + testKit.MustExec(tt) + continue + } + testdata.OnRecord(func() { + output[i].Result = testdata.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } +} + +func TestTopNAssistedEstimationWithoutNewCollation(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + collate.SetNewCollationEnabledForTest(false) + var ( + input []string + output []outputType + ) + statsSuiteData := statistics.GetIntegrationSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + testTopNAssistedEstimationInner(t, input, output, store, dom) +} + +func TestTopNAssistedEstimationWithNewCollation(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + collate.SetNewCollationEnabledForTest(true) + var ( + input []string + output []outputType + ) + statsSuiteData := statistics.GetIntegrationSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + testTopNAssistedEstimationInner(t, input, output, store, dom) +} + +func testTopNAssistedEstimationInner(t *testing.T, input []string, output []outputType, store kv.Storage, dom *domain.Domain) { + h := dom.StatsHandle() + h.Clear() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_default_string_match_selectivity = 0") + tk.MustExec("set @@tidb_stats_load_sync_wait = 3000") + tk.MustExec("create table t(" + + "a varchar(100) charset utf8mb4 collate utf8mb4_bin," + + "b varchar(100) charset utf8mb4 collate utf8mb4_general_ci," + + "c varchar(100) charset utf8mb4 collate utf8mb4_general_ci," + + "d varchar(100) charset gbk collate gbk_bin," + + "e varchar(100) charset gbk collate gbk_chinese_ci," + + "f varbinary(100))") + // data distribution: + // "111abc111", "111cba111", "111234111": 10 rows for each value + // null: 3 rows + // "tttttt", "uuuuuu", "vvvvvv", "wwwwww", "xxxxxx", "yyyyyy", "zzzzzz": 1 rows for each value + // total: 40 rows + for i := 0; i < 10; i++ { + tk.MustExec(`insert into t value("111abc111", "111abc111", "111abc111", "111abc111", "111abc111", "111abc111")`) + tk.MustExec(`insert into t value("111cba111", "111cba111", "111cba111", "111cba111", "111cba111", "111cba111")`) + tk.MustExec(`insert into t value("111234111", "111234111", "111234111", "111234111", "111234111", "111234111")`) + } + for i := 0; i < 3; i++ { + tk.MustExec(`insert into t value(null, null, null, null, null, null)`) + } + tk.MustExec(`insert into t value("tttttt", "tttttt", "tttttt", "tttttt", "tttttt", "tttttt")`) + tk.MustExec(`insert into t value("uuuuuu", "uuuuuu", "uuuuuu", "uuuuuu", "uuuuuu", "uuuuuu")`) + tk.MustExec(`insert into t value("vvvvvv", "vvvvvv", "vvvvvv", "vvvvvv", "vvvvvv", "vvvvvv")`) + tk.MustExec(`insert into t value("wwwwww", "wwwwww", "wwwwww", "wwwwww", "wwwwww", "wwwwww")`) + tk.MustExec(`insert into t value("xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx", "xxxxxx")`) + tk.MustExec(`insert into t value("yyyyyy", "yyyyyy", "yyyyyy", "yyyyyy", "yyyyyy", "yyyyyy")`) + tk.MustExec(`insert into t value("zzzzzz", "zzzzzz", "zzzzzz", "zzzzzz", "zzzzzz", "zzzzzz")`) + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + tk.MustExec(`analyze table t with 3 topn`) + + for i, tt := range input { + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } +} + +type outputType struct { + SQL string + Result []string +} diff --git a/statistics/statistics_test.go b/statistics/statistics_test.go index bb35b094f3f25..a72f6edff9d12 100644 --- a/statistics/statistics_test.go +++ b/statistics/statistics_test.go @@ -568,7 +568,7 @@ func SubTestBuild() func(*testing.T) { count = col.lessRowCount(types.NewIntDatum(1)) require.Equal(t, 5, int(count)) - colv2, topnv2, err := BuildHistAndTopN(ctx, int(bucketCount), topNCount, 2, collector, types.NewFieldType(mysql.TypeLonglong), true) + colv2, topnv2, err := BuildHistAndTopN(ctx, int(bucketCount), topNCount, 2, collector, types.NewFieldType(mysql.TypeLonglong), true, nil) 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/statistics/table.go b/statistics/table.go index 1adcdb01dcb96..6c44d85b32f02 100644 --- a/statistics/table.go +++ b/statistics/table.go @@ -144,8 +144,37 @@ func (t *TableMemoryUsage) TotalTrackingMemUsage() int64 { // TableCacheItem indicates the unit item stored in statsCache, eg: Column/Index type TableCacheItem interface { ItemID() int64 - DropEvicted() MemoryUsage() CacheItemMemoryUsage + IsAllEvicted() bool + + dropCMS() + dropTopN() + isStatsInitialized() bool + getEvictedStatus() int + statsVer() int64 + isCMSExist() bool +} + +// DropEvicted drop stats for table column/index +func DropEvicted(item TableCacheItem) { + if !item.isStatsInitialized() { + return + } + switch item.getEvictedStatus() { + case allLoaded: + if item.isCMSExist() && item.statsVer() < Version2 { + item.dropCMS() + return + } + // For stats version2, there is no cms thus we directly drop topn + item.dropTopN() + return + case onlyCmsEvicted: + item.dropTopN() + return + default: + return + } } // CacheItemMemoryUsage indicates the memory usage of TableCacheItem @@ -161,6 +190,7 @@ type ColumnMemUsage struct { HistogramMemUsage int64 CMSketchMemUsage int64 FMSketchMemUsage int64 + TopNMemUsage int64 TotalMemUsage int64 } @@ -176,7 +206,7 @@ func (c *ColumnMemUsage) ItemID() int64 { // TrackingMemUsage implements CacheItemMemoryUsage func (c *ColumnMemUsage) TrackingMemUsage() int64 { - return c.CMSketchMemUsage + return c.CMSketchMemUsage + c.TopNMemUsage } // IndexMemUsage records index memory usage @@ -184,6 +214,7 @@ type IndexMemUsage struct { IndexID int64 HistogramMemUsage int64 CMSketchMemUsage int64 + TopNMemUsage int64 TotalMemUsage int64 } @@ -199,7 +230,7 @@ func (c *IndexMemUsage) ItemID() int64 { // TrackingMemUsage implements CacheItemMemoryUsage func (c *IndexMemUsage) TrackingMemUsage() int64 { - return c.CMSketchMemUsage + return c.CMSketchMemUsage + c.TopNMemUsage } // MemoryUsage returns the total memory usage of this Table. @@ -565,6 +596,148 @@ func CETraceRange(sctx sessionctx.Context, tableID int64, colNames []string, ran sc.OptimizerCETrace = append(sc.OptimizerCETrace, &CERecord) } +func (coll *HistColl) findAvailableStatsForCol(sctx sessionctx.Context, uniqueID int64) (isIndex bool, idx int64) { + // try to find available stats in column stats + if colStats, ok := coll.Columns[uniqueID]; ok && colStats != nil && !colStats.IsInvalid(sctx, coll.Pseudo) { + return false, uniqueID + } + // try to find available stats in single column index stats (except for prefix index) + for idxStatsIdx, cols := range coll.Idx2ColumnIDs { + if len(cols) == 1 && cols[0] == uniqueID { + idxStats, ok := coll.Indices[idxStatsIdx] + if ok && + idxStats.Info.Columns[0].Length == types.UnspecifiedLength && + !idxStats.IsInvalid(coll.Pseudo) { + return true, idxStatsIdx + } + } + } + return false, -1 +} + +// GetSelectivityByFilter try to estimate selectivity of expressions by evaluate the expressions using TopN and NULL. +// The data represented by the Histogram would use the defaultSelectivity parameter as the selectivity. +// Currently, this method can only handle expressions involving a single column. +func (coll *HistColl) GetSelectivityByFilter(sctx sessionctx.Context, + defaultSelectivity float64, + filters []expression.Expression) (ok bool, selectivity float64, err error) { + // 1. Make sure the expressions + // (1) are safe to be evaluated here, + // (2) involve only one column, + // (3) and this column is not a "new collation" string column so that we're able to restore values from the stats. + for _, filter := range filters { + if expression.IsMutableEffectsExpr(filter) { + return false, 0, nil + } + } + if expression.ContainCorrelatedColumn(filters) { + return false, 0, nil + } + cols := expression.ExtractColumnsFromExpressions(nil, filters, nil) + if len(cols) != 1 { + return false, 0, nil + } + col := cols[0] + tp := col.RetType + if types.IsString(tp.GetType()) && collate.NewCollationEnabled() && !collate.IsBinCollation(tp.GetCollate()) { + return false, 0, nil + } + + // 2. Get the available stats, make sure it's a ver2 stats and get the needed data structure from it. + isIndex, i := coll.findAvailableStatsForCol(sctx, col.UniqueID) + if i < 0 { + return false, 0, nil + } + var statsVer, nullCnt int64 + var histTotalCnt, totalCnt float64 + var topnTotalCnt uint64 + var hist *Histogram + var topn *TopN + if isIndex { + stats := coll.Indices[i] + statsVer = stats.StatsVer + hist = &stats.Histogram + nullCnt = hist.NullCount + topn = stats.TopN + } else { + stats := coll.Columns[i] + statsVer = stats.StatsVer + hist = &stats.Histogram + nullCnt = hist.NullCount + topn = stats.TopN + } + // Only in stats ver2, we can assume that: TopN + Histogram + NULL == All data + if statsVer != Version2 { + return false, 0, nil + } + topnTotalCnt = topn.TotalCount() + histTotalCnt = hist.notNullCount() + totalCnt = float64(topnTotalCnt) + histTotalCnt + float64(nullCnt) + + var topNSel, histSel, nullSel float64 + + // Prepare for evaluation. + + // For execution, we use Column.Index instead of Column.UniqueID to locate a column. + // We have only one column here, so we set it to 0. + originalIndex := col.Index + col.Index = 0 + defer func() { + // Restore the original Index to avoid unexpected situation. + col.Index = originalIndex + }() + size := 1 + if topn != nil { + size = len(topn.TopN) + } + c := chunk.NewChunkWithCapacity([]*types.FieldType{tp}, size) + selected := make([]bool, 0, size) + + // 3. Calculate the TopN part selectivity. + // This stage is considered as the core functionality of this method, errors in this stage would make this entire method fail. + var topNSelectedCnt uint64 + if topn != nil { + for _, item := range topn.TopN { + _, val, err := codec.DecodeOne(item.Encoded) + if err != nil { + return false, 0, err + } + c.AppendDatum(0, &val) + } + selected, err = expression.VectorizedFilter(sctx, filters, chunk.NewIterator4Chunk(c), selected) + if err != nil { + return false, 0, err + } + for i, isTrue := range selected { + if isTrue { + topNSelectedCnt += topn.TopN[i].Count + } + } + } + topNSel = float64(topNSelectedCnt) / totalCnt + + // 4. Calculate the Histogram part selectivity. + histSel = defaultSelectivity * histTotalCnt / totalCnt + + // 5. Calculate the NULL part selectivity. + // Errors in this staged would be returned, but would not make this entire method fail. + c.Reset() + c.AppendNull(0) + selected = selected[:0] + selected, err = expression.VectorizedFilter(sctx, filters, chunk.NewIterator4Chunk(c), selected) + if err != nil || len(selected) != 1 { + nullSel = defaultSelectivity * float64(nullCnt) / totalCnt + } else if selected[0] { + nullSel = float64(nullCnt) / totalCnt + } else { + nullSel = 0 + } + + // 6. Get the final result. + res := topNSel + histSel + nullSel + return true, res, err +} + // PseudoAvgCountPerValue gets a pseudo average count if histogram not exists. func (t *Table) PseudoAvgCountPerValue() float64 { return float64(t.Count) / pseudoEqualRate diff --git a/statistics/testdata/integration_suite_in.json b/statistics/testdata/integration_suite_in.json index 17afe048b3419..6d258b2072158 100644 --- a/statistics/testdata/integration_suite_in.json +++ b/statistics/testdata/integration_suite_in.json @@ -16,5 +16,115 @@ "show stats_topn", "show stats_buckets" ] + }, + { + "name": "TestDefaultSelectivityForStrMatch", + "cases": [ + "set @@tidb_default_string_match_selectivity = 0.8", + "explain format = 'brief' select * from t where a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%'", + "explain format = 'brief' select * from t where b not like '%test%'", + "explain format = 'brief' select * from t where b regexp '.*test.*'", + "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "set @@tidb_default_string_match_selectivity = 0.9", + "explain format = 'brief' select * from t where a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%'", + "explain format = 'brief' select * from t where b not like '%test%'", + "explain format = 'brief' select * from t where b regexp '.*test.*'", + "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "set @@tidb_default_string_match_selectivity = 0.1", + "explain format = 'brief' select * from t where a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%'", + "explain format = 'brief' select * from t where b like '%test%' is true", + "explain format = 'brief' select * from t where b not like '%test%'", + "explain format = 'brief' select * from t where b regexp '.*test.*'", + "explain format = 'brief' select * from t where b rlike '.*test.*'", + "explain format = 'brief' select * from t where b not rlike '.*test.*'", + "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "set @@tidb_default_string_match_selectivity = 0", + "explain format = 'brief' select * from t where a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%'", + "explain format = 'brief' select * from t where b not like '%test%'", + "explain format = 'brief' select * from t where b regexp '.*test.*'", + "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100" + ] + }, + { + "name": "TestTopNAssistedEstimationWithNewCollation", + "cases": [ + "explain format = 'brief' select * from t where a like '%111%'", + "explain format = 'brief' select * from t where a not like '%111%'", + "explain format = 'brief' select * from t where a regexp '.*111.*'", + "explain format = 'brief' select * from t where a not regexp '.*111.*'", + "explain format = 'brief' select * from t where ifnull(a, '1111') like '%111%'", + "explain format = 'brief' select * from t where f like '%111%'", + "explain format = 'brief' select * from t where f not like '%111%'", + "explain format = 'brief' select * from t where f regexp '.*111.*'", + "explain format = 'brief' select * from t where f not regexp '.*111.*'", + "explain format = 'brief' select * from t where ifnull(f, '1111') like '%111%'", + "explain format = 'brief' select * from t where a like '%111%' and f rlike '.*111.*'", + "explain format = 'brief' select * from t where a like '%111%' or f like '%111%'", + "explain format = 'brief' select * from t where b like '%111%'", + "explain format = 'brief' select * from t where b not like '%111%'", + "explain format = 'brief' select * from t where b regexp '.*111.*'", + "explain format = 'brief' select * from t where b not regexp '.*111.*'", + "explain format = 'brief' select * from t where ifnull(b, '1111') like '%111%'", + "explain format = 'brief' select * from t where b like '%111%' and f like '%111%'", + "explain format = 'brief' select * from t where b like '%111%' or f like '%111%'", + "explain format = 'brief' select * from t where c like '%111%'", + "explain format = 'brief' select * from t where c not like '%111%'", + "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "explain format = 'brief' select * from t where d like '%111%'", + "explain format = 'brief' select * from t where d not like '%111%'", + "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "explain format = 'brief' select * from t where e like '%111%'", + "explain format = 'brief' select * from t where e not like '%111%'", + "explain format = 'brief' select * from t where ifnull(e, '1111') like '%111%'" + ] + }, + { + "name": "TestTopNAssistedEstimationWithoutNewCollation", + "cases": [ + "explain format = 'brief' select * from t where a like '%111%'", + "explain format = 'brief' select * from t where a not like '%111%'", + "explain format = 'brief' select * from t where a regexp '.*111.*'", + "explain format = 'brief' select * from t where a not regexp '.*111.*'", + "explain format = 'brief' select * from t where ifnull(a, '1111') like '%111%'", + "explain format = 'brief' select * from t where f like '%111%'", + "explain format = 'brief' select * from t where f not like '%111%'", + "explain format = 'brief' select * from t where f regexp '.*111.*'", + "explain format = 'brief' select * from t where f not regexp '.*111.*'", + "explain format = 'brief' select * from t where ifnull(f, '1111') like '%111%'", + "explain format = 'brief' select * from t where a like '%111%' and f rlike '.*111.*'", + "explain format = 'brief' select * from t where a like '%111%' or f like '%111%'", + "explain format = 'brief' select * from t where b like '%111%'", + "explain format = 'brief' select * from t where b not like '%111%'", + "explain format = 'brief' select * from t where b regexp '.*111.*'", + "explain format = 'brief' select * from t where b not regexp '.*111.*'", + "explain format = 'brief' select * from t where ifnull(b, '1111') like '%111%'", + "explain format = 'brief' select * from t where b like '%111%' and f like '%111%'", + "explain format = 'brief' select * from t where b like '%111%' or f like '%111%'", + "explain format = 'brief' select * from t where c like '%111%'", + "explain format = 'brief' select * from t where c not like '%111%'", + "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "explain format = 'brief' select * from t where d like '%111%'", + "explain format = 'brief' select * from t where d not like '%111%'", + "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "explain format = 'brief' select * from t where e like '%111%'", + "explain format = 'brief' select * from t where e not like '%111%'", + "explain format = 'brief' select * from t where ifnull(e, '1111') like '%111%'" + ] } ] diff --git a/statistics/testdata/integration_suite_out.json b/statistics/testdata/integration_suite_out.json index 550d10caba8e1..28b8494b2b315 100644 --- a/statistics/testdata/integration_suite_out.json +++ b/statistics/testdata/integration_suite_out.json @@ -47,5 +47,766 @@ "test t idx 1 1 2 1 4 4 0" ] ] + }, + { + "Name": "TestDefaultSelectivityForStrMatch", + "Cases": [ + { + "SQL": "set @@tidb_default_string_match_selectivity = 0.8", + "Result": null + }, + { + "SQL": "explain format = 'brief' select * from t where a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%'", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%'", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b regexp '.*test.*'", + "Result": [ + "Selection 8000.00 root regexp(test.t.b, \".*test.*\")", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "Result": [ + "Selection 8000.00 root not(istrue_with_null(regexp(test.t.b, \".*test.*\")))", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100), like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100), not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "Result": [ + "TableReader 9600.00 root data:Selection", + "└─Selection 9600.00 cop[tikv] or(like(test.t.b, \"%test%\", 92), gt(plus(test.t.a, 10), 100))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "set @@tidb_default_string_match_selectivity = 0.9", + "Result": null + }, + { + "SQL": "explain format = 'brief' select * from t where a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%'", + "Result": [ + "TableReader 9000.00 root data:Selection", + "└─Selection 9000.00 cop[tikv] like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%'", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b regexp '.*test.*'", + "Result": [ + "Selection 9000.00 root regexp(test.t.b, \".*test.*\")", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "Result": [ + "Selection 1000.00 root not(istrue_with_null(regexp(test.t.b, \".*test.*\")))", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100), like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] gt(plus(test.t.a, 10), 100), not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "Result": [ + "TableReader 9800.00 root data:Selection", + "└─Selection 9800.00 cop[tikv] or(like(test.t.b, \"%test%\", 92), gt(plus(test.t.a, 10), 100))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "set @@tidb_default_string_match_selectivity = 0.1", + "Result": null + }, + { + "SQL": "explain format = 'brief' select * from t where a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%'", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' is true", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] istrue(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%'", + "Result": [ + "TableReader 9000.00 root data:Selection", + "└─Selection 9000.00 cop[tikv] not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b regexp '.*test.*'", + "Result": [ + "Selection 1000.00 root regexp(test.t.b, \".*test.*\")", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b rlike '.*test.*'", + "Result": [ + "Selection 1000.00 root regexp(test.t.b, \".*test.*\")", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not rlike '.*test.*'", + "Result": [ + "Selection 9000.00 root not(istrue_with_null(regexp(test.t.b, \".*test.*\")))", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "Result": [ + "Selection 9000.00 root not(istrue_with_null(regexp(test.t.b, \".*test.*\")))", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] gt(plus(test.t.a, 10), 100), like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100), not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "Result": [ + "TableReader 8200.00 root data:Selection", + "└─Selection 8200.00 cop[tikv] or(like(test.t.b, \"%test%\", 92), gt(plus(test.t.a, 10), 100))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "set @@tidb_default_string_match_selectivity = 0", + "Result": null + }, + { + "SQL": "explain format = 'brief' select * from t where a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%'", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%'", + "Result": [ + "TableReader 9000.00 root data:Selection", + "└─Selection 9000.00 cop[tikv] not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b regexp '.*test.*'", + "Result": [ + "Selection 1000.00 root regexp(test.t.b, \".*test.*\")", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not regexp '.*test.*'", + "Result": [ + "Selection 9000.00 root not(istrue_with_null(regexp(test.t.b, \".*test.*\")))", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 1000.00 root data:Selection", + "└─Selection 1000.00 cop[tikv] gt(plus(test.t.a, 10), 100), like(test.t.b, \"%test%\", 92)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%test%' and a + 10 > 100", + "Result": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] gt(plus(test.t.a, 10), 100), not(like(test.t.b, \"%test%\", 92))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%test%' or a + 10 > 100", + "Result": [ + "TableReader 8200.00 root data:Selection", + "└─Selection 8200.00 cop[tikv] or(like(test.t.b, \"%test%\", 92), gt(plus(test.t.a, 10), 100))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestTopNAssistedEstimationWithNewCollation", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where a like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.a, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.a, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a regexp '.*111.*'", + "Result": [ + "Selection 30.70 root regexp(test.t.a, \".*111.*\")", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a not regexp '.*111.*'", + "Result": [ + "Selection 6.30 root not(istrue_with_null(regexp(test.t.a, \".*111.*\")))", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(a, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.a, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.f, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.f, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f regexp '.*111.*'", + "Result": [ + "Selection 30.70 root regexp(test.t.f, \".*111.*\")", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f not regexp '.*111.*'", + "Result": [ + "Selection 6.30 root not(istrue_with_null(regexp(test.t.f, \".*111.*\")))", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(f, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.f, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a like '%111%' and f rlike '.*111.*'", + "Result": [ + "Selection 23.56 root regexp(test.t.f, \".*111.*\")", + "└─TableReader 30.70 root data:Selection", + " └─Selection 30.70 cop[tikv] like(test.t.a, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a like '%111%' or f like '%111%'", + "Result": [ + "TableReader 37.84 root data:Selection", + "└─Selection 37.84 cop[tikv] or(like(test.t.a, \"%111%\", 92), like(test.t.f, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(test.t.b, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%111%'", + "Result": [ + "TableReader 36.00 root data:Selection", + "└─Selection 36.00 cop[tikv] not(like(test.t.b, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b regexp '.*111.*'", + "Result": [ + "Selection 4.00 root regexp(test.t.b, \".*111.*\")", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not regexp '.*111.*'", + "Result": [ + "Selection 36.00 root not(istrue_with_null(regexp(test.t.b, \".*111.*\")))", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(b, '1111') like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(ifnull(test.t.b, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%111%' and f like '%111%'", + "Result": [ + "TableReader 3.07 root data:Selection", + "└─Selection 3.07 cop[tikv] like(test.t.b, \"%111%\", 92), like(test.t.f, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%111%' or f like '%111%'", + "Result": [ + "TableReader 31.63 root data:Selection", + "└─Selection 31.63 cop[tikv] or(like(test.t.b, \"%111%\", 92), like(test.t.f, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where c like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(test.t.c, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where c not like '%111%'", + "Result": [ + "TableReader 36.00 root data:Selection", + "└─Selection 36.00 cop[tikv] not(like(test.t.c, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(ifnull(test.t.c, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where d like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(test.t.d, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where d not like '%111%'", + "Result": [ + "TableReader 36.00 root data:Selection", + "└─Selection 36.00 cop[tikv] not(like(test.t.d, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(ifnull(test.t.c, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where e like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(test.t.e, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where e not like '%111%'", + "Result": [ + "TableReader 36.00 root data:Selection", + "└─Selection 36.00 cop[tikv] not(like(test.t.e, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(e, '1111') like '%111%'", + "Result": [ + "TableReader 4.00 root data:Selection", + "└─Selection 4.00 cop[tikv] like(ifnull(test.t.e, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + } + ] + }, + { + "Name": "TestTopNAssistedEstimationWithoutNewCollation", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where a like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.a, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.a, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a regexp '.*111.*'", + "Result": [ + "Selection 30.70 root regexp(test.t.a, \".*111.*\")", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a not regexp '.*111.*'", + "Result": [ + "Selection 6.30 root not(istrue_with_null(regexp(test.t.a, \".*111.*\")))", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(a, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.a, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.f, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.f, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f regexp '.*111.*'", + "Result": [ + "Selection 30.70 root regexp(test.t.f, \".*111.*\")", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where f not regexp '.*111.*'", + "Result": [ + "Selection 6.30 root not(istrue_with_null(regexp(test.t.f, \".*111.*\")))", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(f, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.f, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a like '%111%' and f rlike '.*111.*'", + "Result": [ + "Selection 23.56 root regexp(test.t.f, \".*111.*\")", + "└─TableReader 30.70 root data:Selection", + " └─Selection 30.70 cop[tikv] like(test.t.a, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a like '%111%' or f like '%111%'", + "Result": [ + "TableReader 37.84 root data:Selection", + "└─Selection 37.84 cop[tikv] or(like(test.t.a, \"%111%\", 92), like(test.t.f, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.b, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.b, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b regexp '.*111.*'", + "Result": [ + "Selection 30.70 root regexp(test.t.b, \".*111.*\")", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b not regexp '.*111.*'", + "Result": [ + "Selection 6.30 root not(istrue_with_null(regexp(test.t.b, \".*111.*\")))", + "└─TableReader 40.00 root data:TableFullScan", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(b, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.b, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%111%' and f like '%111%'", + "Result": [ + "TableReader 23.56 root data:Selection", + "└─Selection 23.56 cop[tikv] like(test.t.b, \"%111%\", 92), like(test.t.f, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where b like '%111%' or f like '%111%'", + "Result": [ + "TableReader 37.84 root data:Selection", + "└─Selection 37.84 cop[tikv] or(like(test.t.b, \"%111%\", 92), like(test.t.f, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where c like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.c, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where c not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.c, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.c, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where d like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.d, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where d not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.d, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(c, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.c, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where e like '%111%'", + "Result": [ + "TableReader 30.70 root data:Selection", + "└─Selection 30.70 cop[tikv] like(test.t.e, \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where e not like '%111%'", + "Result": [ + "TableReader 6.30 root data:Selection", + "└─Selection 6.30 cop[tikv] not(like(test.t.e, \"%111%\", 92))", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where ifnull(e, '1111') like '%111%'", + "Result": [ + "TableReader 33.70 root data:Selection", + "└─Selection 33.70 cop[tikv] like(ifnull(test.t.e, \"1111\"), \"%111%\", 92)", + " └─TableFullScan 40.00 cop[tikv] table:t keep order:false" + ] + } + ] } ] diff --git a/store/copr/BUILD.bazel b/store/copr/BUILD.bazel index f6cde5564e9f6..12723d9ec2d3d 100644 --- a/store/copr/BUILD.bazel +++ b/store/copr/BUILD.bazel @@ -24,6 +24,7 @@ go_library( "//store/driver/backoff", "//store/driver/error", "//store/driver/options", + "//util", "//util/execdetails", "//util/logutil", "//util/mathutil", diff --git a/store/copr/coprocessor.go b/store/copr/coprocessor.go index 29cc437b182e6..135ce1a7ad8df 100644 --- a/store/copr/coprocessor.go +++ b/store/copr/coprocessor.go @@ -97,6 +97,14 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, variables interfa bo := backoff.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) ranges := NewKeyRanges(req.KeyRanges) tasks, err := buildCopTasks(bo, c.store.GetRegionCache(), ranges, req, eventCb) + reqType := "null" + if req.ClosestReplicaReadAdjuster != nil { + reqType = "miss" + if req.ClosestReplicaReadAdjuster(req, len(tasks)) { + reqType = "hit" + } + } + tidbmetrics.DistSQLCoprClosestReadCounter.WithLabelValues(reqType).Inc() if err != nil { return copErrorResponse{err} } @@ -120,24 +128,27 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, variables interfa } if it.req.KeepOrder { + // Don't set high concurrency for the keep order case. It wastes a lot of memory and gains nothing. + // TL;DR + // Because for a keep order coprocessor request, the cop tasks are handled one by one, if we set a + // higher concurrency, the data is just cached and not consumed for a while, this increase the memory usage. + // Set concurrency to 2 can reduce the memory usage and I've tested that it does not necessarily + // decrease the performance. + if it.concurrency > 2 { + oldConcurrency := it.concurrency + it.concurrency = 2 + + failpoint.Inject("testRateLimitActionMockConsumeAndAssert", func(val failpoint.Value) { + if val.(bool) { + // When the concurrency is too small, test case tests/realtikvtest/sessiontest.TestCoprocessorOOMAction can't trigger OOM condition + it.concurrency = oldConcurrency + } + }) + } it.sendRate = util.NewRateLimit(2 * it.concurrency) it.respChan = nil } else { - capacity := it.concurrency - if enabledRateLimitAction { - // The count of cached response in memory is controlled by the capacity of the it.sendRate, not capacity of the respChan. - // As the worker will send finCopResponse after each task being handled, we make the capacity of the respCh equals to - // 2*it.concurrency to avoid deadlock in the unit test caused by the `MustExec` or `Exec` - capacity = it.concurrency * 2 - } - // in paging request, a request will be returned in multi batches, - // enlarge the channel size to avoid the request blocked by buffer full. - if req.Paging { - if capacity < 2048 { - capacity = 2048 - } - } - it.respChan = make(chan *copResponse, capacity) + it.respChan = make(chan *copResponse) it.sendRate = util.NewRateLimit(it.concurrency) } it.actionOnExceed = newRateLimitAction(uint(it.sendRate.GetCapacity())) @@ -197,7 +208,7 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv // in paging request, a request will be returned in multi batches, // enlarge the channel size to avoid the request blocked by buffer full. if req.Paging { - chanSize = 128 + chanSize = 18 } var tasks []*copTask @@ -211,7 +222,7 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv // the size will grow every round. pagingSize := uint64(0) if req.Paging { - pagingSize = paging.MinPagingSize + pagingSize = req.MinPagingSize } tasks = append(tasks, &copTask{ region: loc.Location.Region, @@ -776,18 +787,23 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch // Set task.storeAddr field so its task.String() method have the store address information. task.storeAddr = storeAddr costTime := time.Since(startTime) + copResp := resp.Resp.(*coprocessor.Response) + if costTime > minLogCopTaskTime { - worker.logTimeCopTask(costTime, task, bo, resp) + worker.logTimeCopTask(costTime, task, bo, copResp) } storeID := strconv.FormatUint(req.Context.GetPeer().GetStoreId(), 10) metrics.TiKVCoprocessorHistogram.WithLabelValues(storeID, strconv.FormatBool(staleRead)).Observe(costTime.Seconds()) + if copResp != nil { + tidbmetrics.DistSQLCoprRespBodySize.WithLabelValues(storeAddr).Observe(float64(len(copResp.Data))) + } if worker.req.Paging { - return worker.handleCopPagingResult(bo, rpcCtx, &copResponse{pbResp: resp.Resp.(*coprocessor.Response)}, cacheKey, cacheValue, task, ch, costTime) + return worker.handleCopPagingResult(bo, rpcCtx, &copResponse{pbResp: copResp}, cacheKey, cacheValue, task, ch, costTime) } // Handles the response for non-paging copTask. - return worker.handleCopResponse(bo, rpcCtx, &copResponse{pbResp: resp.Resp.(*coprocessor.Response)}, cacheKey, cacheValue, task, ch, nil, costTime) + return worker.handleCopResponse(bo, rpcCtx, &copResponse{pbResp: copResp}, cacheKey, cacheValue, task, ch, nil, costTime) } const ( @@ -795,24 +811,15 @@ const ( minLogKVProcessTime = 100 ) -func (worker *copIteratorWorker) logTimeCopTask(costTime time.Duration, task *copTask, bo *Backoffer, resp *tikvrpc.Response) { +func (worker *copIteratorWorker) logTimeCopTask(costTime time.Duration, task *copTask, bo *Backoffer, resp *coprocessor.Response) { logStr := fmt.Sprintf("[TIME_COP_PROCESS] resp_time:%s txnStartTS:%d region_id:%d store_addr:%s", costTime, worker.req.StartTs, task.region.GetID(), task.storeAddr) if bo.GetTotalSleep() > minLogBackoffTime { backoffTypes := strings.Replace(fmt.Sprintf("%v", bo.TiKVBackoffer().GetTypes()), " ", ",", -1) logStr += fmt.Sprintf(" backoff_ms:%d backoff_types:%s", bo.GetTotalSleep(), backoffTypes) } - var detailV2 *kvrpcpb.ExecDetailsV2 - var detail *kvrpcpb.ExecDetails - if resp.Resp != nil { - switch r := resp.Resp.(type) { - case *coprocessor.Response: - detailV2 = r.ExecDetailsV2 - detail = r.ExecDetails - default: - panic("unreachable") - } - } - + // resp might be nil, but it is safe to call resp.GetXXX here. + detailV2 := resp.GetExecDetailsV2() + detail := resp.GetExecDetails() var timeDetail *kvrpcpb.TimeDetail if detailV2 != nil && detailV2.TimeDetail != nil { timeDetail = detailV2.TimeDetail @@ -868,6 +875,7 @@ func (worker *copIteratorWorker) handleCopPagingResult(bo *Backoffer, rpcCtx *ti // So we finish here. return nil, nil } + // calculate next ranges and grow the paging size task.ranges = worker.calculateRemain(task.ranges, pagingRange, worker.req.Desc) if task.ranges.Len() == 0 { @@ -991,7 +999,7 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *tikv.R // Cache not hit or cache hit but not valid: update the cache if the response can be cached. if cacheKey != nil && resp.pbResp.CanBeCached && resp.pbResp.CacheLastVersion > 0 { if resp.detail != nil { - if worker.store.coprCache.CheckResponseAdmission(resp.pbResp.Data.Size(), resp.detail.TimeDetail.ProcessTime) { + if worker.store.coprCache.CheckResponseAdmission(resp.pbResp.Data.Size(), resp.detail.TimeDetail.ProcessTime, worker.req.Paging) { data := make([]byte, len(resp.pbResp.Data)) copy(data, resp.pbResp.Data) diff --git a/store/copr/coprocessor_cache.go b/store/copr/coprocessor_cache.go index 1adef9915cb48..2ee1ccffe2547 100644 --- a/store/copr/coprocessor_cache.go +++ b/store/copr/coprocessor_cache.go @@ -185,14 +185,19 @@ func (c *coprCache) CheckRequestAdmission(ranges int) bool { } // CheckResponseAdmission checks whether a response item is worth caching. -func (c *coprCache) CheckResponseAdmission(dataSize int, processTime time.Duration) bool { +func (c *coprCache) CheckResponseAdmission(dataSize int, processTime time.Duration, paging bool) bool { if c == nil { return false } if dataSize == 0 || dataSize > c.admissionMaxSize { return false } - if processTime < c.admissionMinProcessTime { + + admissionMinProcessTime := c.admissionMinProcessTime + if paging { + admissionMinProcessTime = admissionMinProcessTime / 3 + } + if processTime < admissionMinProcessTime { return false } return true diff --git a/store/copr/coprocessor_cache_test.go b/store/copr/coprocessor_cache_test.go index 91906c980d0f8..f629eb57f2c57 100644 --- a/store/copr/coprocessor_cache_test.go +++ b/store/copr/coprocessor_cache_test.go @@ -79,7 +79,7 @@ func TestDisable(t *testing.T) { v2 := cache.Get([]byte("foo")) require.Nil(t, v2) - v = cache.CheckResponseAdmission(1024, time.Second*5) + v = cache.CheckResponseAdmission(1024, time.Second*5, false) require.False(t, v) cache, err = newCoprCache(&config.CoprocessorCache{CapacityMB: 0.001}) @@ -104,34 +104,34 @@ func TestAdmission(t *testing.T) { v = cache.CheckRequestAdmission(1000) require.True(t, v) - v = cache.CheckResponseAdmission(0, 0) + v = cache.CheckResponseAdmission(0, 0, false) require.False(t, v) - v = cache.CheckResponseAdmission(0, 4*time.Millisecond) + v = cache.CheckResponseAdmission(0, 4*time.Millisecond, false) require.False(t, v) - v = cache.CheckResponseAdmission(0, 5*time.Millisecond) + v = cache.CheckResponseAdmission(0, 5*time.Millisecond, false) require.False(t, v) - v = cache.CheckResponseAdmission(1, 0) + v = cache.CheckResponseAdmission(1, 0, false) require.False(t, v) - v = cache.CheckResponseAdmission(1, 4*time.Millisecond) + v = cache.CheckResponseAdmission(1, 4*time.Millisecond, false) require.False(t, v) - v = cache.CheckResponseAdmission(1, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1, 5*time.Millisecond, false) require.True(t, v) - v = cache.CheckResponseAdmission(1024, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1024, 5*time.Millisecond, false) require.True(t, v) - v = cache.CheckResponseAdmission(1024*1024, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1024*1024, 5*time.Millisecond, false) require.True(t, v) - v = cache.CheckResponseAdmission(1024*1024+1, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1024*1024+1, 5*time.Millisecond, false) require.False(t, v) - v = cache.CheckResponseAdmission(1024*1024+1, 4*time.Millisecond) + v = cache.CheckResponseAdmission(1024*1024+1, 4*time.Millisecond, false) require.False(t, v) cache, err = newCoprCache(&config.CoprocessorCache{AdmissionMaxRanges: 5, AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) diff --git a/store/copr/coprocessor_test.go b/store/copr/coprocessor_test.go index 7f2efa0e2db71..c32ce383374d1 100644 --- a/store/copr/coprocessor_test.go +++ b/store/copr/coprocessor_test.go @@ -509,6 +509,7 @@ func TestBuildPagingTasks(t *testing.T) { req := &kv.Request{} req.Paging = true + req.MinPagingSize = paging.MinPagingSize flashReq := &kv.Request{} flashReq.StoreType = kv.TiFlash tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) diff --git a/store/copr/mpp.go b/store/copr/mpp.go index 22061039616a5..656fc11186ce1 100644 --- a/store/copr/mpp.go +++ b/store/copr/mpp.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/driver/backoff" derr "github.com/pingcap/tidb/store/driver/error" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mathutil" "github.com/tikv/client-go/v2/tikv" @@ -341,13 +342,18 @@ func (m *mppIterator) cancelMppTasks() { } // send cancel cmd to all stores where tasks run + wg := util.WaitGroupWrapper{} for addr := range usedStoreAddrs { - _, err := m.store.GetTiKVClient().SendRequest(context.Background(), addr, wrappedReq, tikv.ReadTimeoutShort) - logutil.BgLogger().Debug("cancel task ", zap.Uint64("query id ", m.startTs), zap.String(" on addr ", addr)) - if err != nil { - logutil.BgLogger().Error("cancel task error: ", zap.Error(err), zap.Uint64(" for query id ", m.startTs), zap.String(" on addr ", addr)) - } + storeAddr := addr + wg.Run(func() { + _, err := m.store.GetTiKVClient().SendRequest(context.Background(), storeAddr, wrappedReq, tikv.ReadTimeoutShort) + logutil.BgLogger().Debug("cancel task", zap.Uint64("query id ", m.startTs), zap.String("on addr", storeAddr)) + if err != nil { + logutil.BgLogger().Error("cancel task error", zap.Error(err), zap.Uint64("query id", m.startTs), zap.String("on addr", storeAddr)) + } + }) } + wg.Wait() } func (m *mppIterator) establishMPPConns(bo *Backoffer, req *kv.MPPDispatchRequest, taskMeta *mpp.TaskMeta) { diff --git a/store/driver/options/options.go b/store/driver/options/options.go index 09e1757b12267..1b677ffc348d0 100644 --- a/store/driver/options/options.go +++ b/store/driver/options/options.go @@ -30,6 +30,8 @@ func GetTiKVReplicaReadType(t kv.ReplicaReadType) storekv.ReplicaReadType { return storekv.ReplicaReadMixed case kv.ReplicaReadClosest: return storekv.ReplicaReadMixed + case kv.ReplicaReadClosestAdaptive: + return storekv.ReplicaReadMixed } return 0 } diff --git a/store/driver/txn/BUILD.bazel b/store/driver/txn/BUILD.bazel index fc5bd8a2d7037..15e3c56cb6320 100644 --- a/store/driver/txn/BUILD.bazel +++ b/store/driver/txn/BUILD.bazel @@ -36,6 +36,7 @@ go_library( "@com_github_tikv_client_go_v2//tikv", "@com_github_tikv_client_go_v2//tikvrpc", "@com_github_tikv_client_go_v2//tikvrpc/interceptor", + "@com_github_tikv_client_go_v2//txnkv", "@com_github_tikv_client_go_v2//txnkv/transaction", "@com_github_tikv_client_go_v2//txnkv/txnsnapshot", "@com_github_tikv_client_go_v2//txnkv/txnutil", diff --git a/store/driver/txn/snapshot.go b/store/driver/txn/snapshot.go index 9b39e635b1d71..ae84351e56c6c 100644 --- a/store/driver/txn/snapshot.go +++ b/store/driver/txn/snapshot.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/store/driver/options" "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/tikvrpc/interceptor" + "github.com/tikv/client-go/v2/txnkv" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" "github.com/tikv/client-go/v2/txnkv/txnutil" ) @@ -110,7 +111,7 @@ func (s *tikvSnapshot) SetOption(opt int, val interface{}) { s.KVSnapshot.SetRuntimeStats(val.(*txnsnapshot.SnapshotRuntimeStats)) } case kv.IsStalenessReadOnly: - s.KVSnapshot.SetIsStatenessReadOnly(val.(bool)) + s.KVSnapshot.SetIsStalenessReadOnly(val.(bool)) case kv.MatchStoreLabels: s.KVSnapshot.SetMatchStoreLabels(val.([]*metapb.StoreLabel)) case kv.ResourceGroupTag: @@ -127,6 +128,8 @@ func (s *tikvSnapshot) SetOption(opt int, val interface{}) { s.KVSnapshot.SetRequestSourceInternal(val.(bool)) case kv.RequestSourceType: s.KVSnapshot.SetRequestSourceType(val.(string)) + case kv.ReplicaReadAdjuster: + s.KVSnapshot.SetReplicaReadAdjuster(val.(txnkv.ReplicaReadAdjuster)) } } diff --git a/store/driver/txn/txn_driver.go b/store/driver/txn/txn_driver.go index 29baf3c48c06f..22b22957865a9 100644 --- a/store/driver/txn/txn_driver.go +++ b/store/driver/txn/txn_driver.go @@ -34,6 +34,7 @@ import ( "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/tikvrpc/interceptor" + "github.com/tikv/client-go/v2/txnkv" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" "go.uber.org/zap" ) @@ -232,7 +233,7 @@ func (txn *tikvTxn) SetOption(opt int, val interface{}) { case kv.TxnScope: txn.SetScope(val.(string)) case kv.IsStalenessReadOnly: - txn.KVTxn.GetSnapshot().SetIsStatenessReadOnly(val.(bool)) + txn.KVTxn.GetSnapshot().SetIsStalenessReadOnly(val.(bool)) case kv.MatchStoreLabels: txn.KVTxn.GetSnapshot().SetMatchStoreLabels(val.([]*metapb.StoreLabel)) case kv.ResourceGroupTag: @@ -255,6 +256,8 @@ func (txn *tikvTxn) SetOption(opt int, val interface{}) { txn.KVTxn.SetRequestSourceInternal(val.(bool)) case kv.RequestSourceType: txn.KVTxn.SetRequestSourceType(val.(string)) + case kv.ReplicaReadAdjuster: + txn.KVTxn.GetSnapshot().SetReplicaReadAdjuster(val.(txnkv.ReplicaReadAdjuster)) } } diff --git a/store/gcworker/BUILD.bazel b/store/gcworker/BUILD.bazel index 9ac77dd4ceb30..f43e28c02958b 100644 --- a/store/gcworker/BUILD.bazel +++ b/store/gcworker/BUILD.bazel @@ -6,6 +6,7 @@ go_library( importpath = "github.com/pingcap/tidb/store/gcworker", visibility = ["//visibility:public"], deps = [ + "//br/pkg/utils", "//ddl", "//ddl/label", "//ddl/placement", diff --git a/store/gcworker/gc_worker.go b/store/gcworker/gc_worker.go index e07536e599795..a92858befc8fc 100644 --- a/store/gcworker/gc_worker.go +++ b/store/gcworker/gc_worker.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/ddl/label" "github.com/pingcap/tidb/ddl/placement" @@ -78,6 +79,7 @@ type GCWorker struct { batchResolveLocks func(locks []*txnlock.Lock, regionID tikv.RegionVerID, safepoint uint64) (ok bool, err error) resolveLocks func(locks []*txnlock.Lock, lowResolutionTS uint64) (int64, error) } + logBackupEnabled bool } // NewGCWorker creates a GCWorker instance. @@ -307,12 +309,31 @@ func (w *GCWorker) leaderTick(ctx context.Context) error { return nil } + concurrency, err := w.getGCConcurrency(ctx) + if err != nil { + logutil.Logger(ctx).Info("[gc worker] failed to get gc concurrency.", + zap.String("uuid", w.uuid), + zap.Error(err)) + return errors.Trace(err) + } + ok, safePoint, err := w.prepare(ctx) - if err != nil || !ok { - if err != nil { - metrics.GCJobFailureCounter.WithLabelValues("prepare").Inc() - } + if err != nil { + metrics.GCJobFailureCounter.WithLabelValues("prepare").Inc() return errors.Trace(err) + } else if !ok { + // If skip gc, it still needs to resolve locks with expired TTL, in order not to block log backup. + if w.logBackupEnabled { + tryResolveLocksTS, err := w.getTryResolveLocksTS() + if err != nil { + return errors.Trace(err) + } + // Set 0 to safepoint, which means resolving locks with expired TTL only. + if err = w.legacyResolveLocks(ctx, 0, tryResolveLocksTS, concurrency); err != nil { + return errors.Trace(err) + } + } + return nil } // When the worker is just started, or an old GC job has just finished, // wait a while before starting a new job. @@ -322,14 +343,6 @@ func (w *GCWorker) leaderTick(ctx context.Context) error { return nil } - concurrency, err := w.getGCConcurrency(ctx) - if err != nil { - logutil.Logger(ctx).Info("[gc worker] failed to get gc concurrency.", - zap.String("uuid", w.uuid), - zap.Error(err)) - return errors.Trace(err) - } - w.gcIsRunning = true logutil.Logger(ctx).Info("[gc worker] starts the whole job", zap.String("uuid", w.uuid), @@ -1027,9 +1040,8 @@ func (w *GCWorker) resolveLocks(ctx context.Context, safePoint uint64, concurren if tryResolveLocksTS < safePoint { tryResolveLocksTS = safePoint - } else { - // to do: add a switch for tryResolveLocksTS. - // if the config log-backup.enable is false in PiTR, set safePoint to tryResolveLocksTS directly. + } else if !w.logBackupEnabled { + tryResolveLocksTS = safePoint } if !usePhysical { @@ -1778,6 +1790,7 @@ func (w *GCWorker) checkLeader(ctx context.Context) (bool, error) { se := createSession(w.store) defer se.Close() + w.logBackupEnabled = utils.CheckLogBackupEnabled(se) _, err := se.ExecuteInternal(ctx, "BEGIN") if err != nil { return false, errors.Trace(err) diff --git a/store/gcworker/gc_worker_test.go b/store/gcworker/gc_worker_test.go index 362c304efafe5..c453545a4362b 100644 --- a/store/gcworker/gc_worker_test.go +++ b/store/gcworker/gc_worker_test.go @@ -1820,6 +1820,8 @@ func TestGCLabelRules(t *testing.T) { func TestGCWithPendingTxn(t *testing.T) { s, clean := createGCWorkerSuite(t) defer clean() + // set to false gc worker won't resolve locks after safepoint. + s.gcWorker.logBackupEnabled = false ctx := gcContext() gcSafePointCacheInterval = 0 @@ -1866,11 +1868,13 @@ func TestGCWithPendingTxn(t *testing.T) { require.NoError(t, err) err = txn.Commit(ctx) - require.Error(t, err) + require.NoError(t, err) } func TestGCWithPendingTxn2(t *testing.T) { s, clean := createGCWorkerSuite(t) + // only when log backup enabled will scan locks after safepoint. + s.gcWorker.logBackupEnabled = true defer clean() ctx := gcContext() @@ -1940,6 +1944,65 @@ func TestGCWithPendingTxn2(t *testing.T) { require.NoError(t, err) } +func TestSkipGCAndOnlyResolveLock(t *testing.T) { + s, clean := createGCWorkerSuite(t) + // only when log backup enabled will scan locks after safepoint. + s.gcWorker.logBackupEnabled = true + defer clean() + + ctx := gcContext() + gcSafePointCacheInterval = 0 + err := s.gcWorker.saveValueToSysTable(gcEnableKey, booleanFalse) + require.NoError(t, err) + now, err := s.oracle.GetTimestamp(ctx, &oracle.Option{}) + require.NoError(t, err) + + // Prepare to run gc with txn's startTS as the safepoint ts. + spkv := s.tikvStore.GetSafePointKV() + err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "a"), strconv.FormatUint(now, 10)) + require.NoError(t, err) + s.mustSetTiDBServiceSafePoint(t, now, now) + veryLong := gcDefaultLifeTime * 100 + lastRunTime := oracle.GetTimeFromTS(s.mustAllocTs(t)).Add(-veryLong) + newGcLifeTime := time.Hour * 24 + err = s.gcWorker.saveTime(gcLastRunTimeKey, lastRunTime) + require.NoError(t, err) + err = s.gcWorker.saveTime(gcSafePointKey, oracle.GetTimeFromTS(s.mustAllocTs(t)).Add(-time.Minute*10)) + require.NoError(t, err) + err = s.gcWorker.saveDuration(gcLifeTimeKey, newGcLifeTime) + require.NoError(t, err) + s.gcWorker.lastFinish = time.Now().Add(-veryLong) + err = s.gcWorker.saveValueToSysTable(gcEnableKey, booleanTrue) + require.NoError(t, err) + + // lock the key1 + k1 := []byte("tk1") + v1 := []byte("v1") + txn, err := s.store.Begin(tikv.WithStartTS(now)) + require.NoError(t, err) + txn.SetOption(kv.Pessimistic, true) + lockCtx := &kv.LockCtx{ForUpdateTS: txn.StartTS(), WaitStartTime: time.Now()} + + err = txn.Set(k1, v1) + require.NoError(t, err) + err = txn.LockKeys(ctx, lockCtx, k1) + require.NoError(t, err) + + // Trigger the tick let the gc job start. + s.oracle.AddOffset(time.Minute * 5) + err = s.gcWorker.leaderTick(ctx) + require.NoError(t, err) + + // check the lock has been resolved. + err = txn.Commit(ctx) + require.Error(t, err) + + // check gc is skipped + last, err := s.gcWorker.loadTime(gcLastRunTimeKey) + require.NoError(t, err) + require.Equal(t, last.Unix(), lastRunTime.Unix()) +} + func bootstrap(t testing.TB, store kv.Storage, lease time.Duration) (*domain.Domain, func()) { session.SetSchemaLease(lease) session.DisableStats4Test() diff --git a/store/helper/helper.go b/store/helper/helper.go index 760cfb11f6a3a..97aefbc142ae6 100644 --- a/store/helper/helper.go +++ b/store/helper/helper.go @@ -183,7 +183,7 @@ func (h *Helper) GetMvccByStartTs(startTS uint64, startKey, endKey kv.Key) (*Mvc if len(curRegion.EndKey) == 0 { return nil, nil } - startKey = kv.Key(curRegion.EndKey) + startKey = curRegion.EndKey } } @@ -313,7 +313,7 @@ func (h *Helper) FetchRegionTableIndex(metrics map[uint64]RegionMetric, allSchem } // FindTableIndexOfRegion finds what table is involved in this hot region. And constructs the new frame item for future use. -func (h *Helper) FindTableIndexOfRegion(allSchemas []*model.DBInfo, hotRange *RegionFrameRange) *FrameItem { +func (*Helper) FindTableIndexOfRegion(allSchemas []*model.DBInfo, hotRange *RegionFrameRange) *FrameItem { for _, db := range allSchemas { for _, tbl := range db.Tables { if f := findRangeInTable(hotRange, db, tbl); f != nil { @@ -608,12 +608,12 @@ func isBehind(x, y withKeyRange) bool { } // IsBefore returns true is x is before [startKey, endKey) -func isBeforeKeyRange(x withKeyRange, startKey, endKey string) bool { +func isBeforeKeyRange(x withKeyRange, startKey, _ string) bool { return x.getEndKey() != "" && x.getEndKey() <= startKey } // IsBehind returns true is x is behind [startKey, endKey) -func isBehindKeyRange(x withKeyRange, startKey, endKey string) bool { +func isBehindKeyRange(x withKeyRange, _, endKey string) bool { return endKey != "" && x.getStartKey() >= endKey } @@ -689,7 +689,7 @@ func newPartitionTableWithKeyRange(db *model.DBInfo, table *model.TableInfo, par } // FilterMemDBs filters memory databases in the input schemas. -func (h *Helper) FilterMemDBs(oldSchemas []*model.DBInfo) (schemas []*model.DBInfo) { +func (*Helper) FilterMemDBs(oldSchemas []*model.DBInfo) (schemas []*model.DBInfo) { for _, dbInfo := range oldSchemas { if util.IsMemDB(dbInfo.Name.L) { continue @@ -715,7 +715,7 @@ func (h *Helper) GetRegionsTableInfo(regionsInfo *RegionsInfo, schemas []*model. } // GetTablesInfoWithKeyRange returns a slice containing tableInfos with key ranges of all tables in schemas. -func (h *Helper) GetTablesInfoWithKeyRange(schemas []*model.DBInfo) []TableInfoWithKeyRange { +func (*Helper) GetTablesInfoWithKeyRange(schemas []*model.DBInfo) []TableInfoWithKeyRange { tables := []TableInfoWithKeyRange{} for _, db := range schemas { for _, table := range db.Tables { @@ -738,7 +738,7 @@ func (h *Helper) GetTablesInfoWithKeyRange(schemas []*model.DBInfo) []TableInfoW } // ParseRegionsTableInfos parses the tables or indices in regions according to key range. -func (h *Helper) ParseRegionsTableInfos(regionsInfo []*RegionInfo, tables []TableInfoWithKeyRange) map[int64][]TableInfo { +func (*Helper) ParseRegionsTableInfos(regionsInfo []*RegionInfo, tables []TableInfoWithKeyRange) map[int64][]TableInfo { tableInfos := make(map[int64][]TableInfo, len(regionsInfo)) if len(tables) == 0 || len(regionsInfo) == 0 { @@ -1166,7 +1166,7 @@ func GetTiFlashTableIDFromEndKey(endKey string) int64 { e, _ := hex.DecodeString(endKey) _, decodedEndKey, _ := codec.DecodeBytes(e, []byte{}) tableID := tablecodec.DecodeTableID(decodedEndKey) - tableID -= 1 + tableID-- return tableID } @@ -1195,7 +1195,7 @@ func ComputeTiFlashStatus(reader *bufio.Reader, regionReplica *map[int64]int) er if s == "" { continue } - realN += 1 + realN++ r, err := strconv.ParseInt(s, 10, 32) if err != nil { return errors.Trace(err) diff --git a/store/mockstore/unistore/cophandler/cop_handler.go b/store/mockstore/unistore/cophandler/cop_handler.go index 75fa686ff8fca..5f375f2bfdc30 100644 --- a/store/mockstore/unistore/cophandler/cop_handler.go +++ b/store/mockstore/unistore/cophandler/cop_handler.go @@ -179,6 +179,7 @@ func buildAndRunMPPExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest, pagingS if pagingSize > 0 { lastRange = &coprocessor.KeyRange{} builder.paging = lastRange + builder.pagingSize = pagingSize } exec, err := builder.buildMPPExecutor(rootExec) if err != nil { @@ -221,7 +222,7 @@ func mppExecute(exec mppExec, dagCtx *dagContext, dagReq *tipb.DAGRequest, pagin if pagingSize > 0 { totalRows += uint64(chk.NumRows()) if totalRows > pagingSize { - break + return } } default: diff --git a/store/mockstore/unistore/cophandler/mpp.go b/store/mockstore/unistore/cophandler/mpp.go index fb9cfeaf1aff1..1cf0746e861dd 100644 --- a/store/mockstore/unistore/cophandler/mpp.go +++ b/store/mockstore/unistore/cophandler/mpp.go @@ -51,14 +51,15 @@ const ( ) type mppExecBuilder struct { - sc *stmtctx.StatementContext - dbReader *dbreader.DBReader - mppCtx *MPPCtx - dagReq *tipb.DAGRequest - dagCtx *dagContext - counts []int64 - ndvs []int64 - paging *coprocessor.KeyRange + sc *stmtctx.StatementContext + dbReader *dbreader.DBReader + mppCtx *MPPCtx + dagReq *tipb.DAGRequest + dagCtx *dagContext + counts []int64 + ndvs []int64 + paging *coprocessor.KeyRange + pagingSize uint64 } func (b *mppExecBuilder) buildMPPTableScan(pb *tipb.TableScan) (*tableScanExec, error) { @@ -199,7 +200,7 @@ func (b *mppExecBuilder) buildLimit(pb *tipb.Limit) (*limitExec, error) { return exec, nil } -func (b *mppExecBuilder) buildTopN(pb *tipb.TopN) (*topNExec, error) { +func (b *mppExecBuilder) buildTopN(pb *tipb.TopN) (mppExec, error) { child, err := b.buildMPPExecutor(pb.Child) if err != nil { return nil, err @@ -227,6 +228,12 @@ func (b *mppExecBuilder) buildTopN(pb *tipb.TopN) (*topNExec, error) { row: newTopNSortRow(len(conds)), topn: pb.Limit, } + + // When using paging protocol, if paging size < topN limit, the topN exec degenerate to do nothing. + if b.paging != nil && b.pagingSize < pb.Limit { + exec.dummy = true + } + return exec, nil } diff --git a/store/mockstore/unistore/cophandler/mpp_exec.go b/store/mockstore/unistore/cophandler/mpp_exec.go index 8e079991c7daa..3e164da24d458 100644 --- a/store/mockstore/unistore/cophandler/mpp_exec.go +++ b/store/mockstore/unistore/cophandler/mpp_exec.go @@ -319,7 +319,8 @@ func (e *indexScanExec) Process(key, value []byte) error { if e.chk.IsFull() { e.chunks = append(e.chunks, e.chk) if e.paging != nil { - e.chunkLastProcessedKeys = append(e.chunkLastProcessedKeys, key) + lastProcessed := kv.Key(append([]byte{}, key...)) // need a deep copy to store the key + e.chunkLastProcessedKeys = append(e.chunkLastProcessedKeys, lastProcessed) } e.chk = chunk.NewChunkWithCapacity(e.fieldTypes, DefaultBatchSize) } @@ -423,6 +424,9 @@ type topNExec struct { conds []expression.Expression row *sortRow recv []*chunk.Chunk + + // When dummy is true, topNExec just copy what it read from children to its parent. + dummy bool } func (e *topNExec) open() error { @@ -432,6 +436,11 @@ func (e *topNExec) open() error { if err != nil { return err } + + if e.dummy { + return nil + } + for { chk, err = e.children[0].next() if err != nil { @@ -466,6 +475,10 @@ func (e *topNExec) open() error { } func (e *topNExec) next() (*chunk.Chunk, error) { + if e.dummy { + return e.children[0].next() + } + chk := chunk.NewChunkWithCapacity(e.getFieldTypes(), DefaultBatchSize) for ; !chk.IsFull() && e.idx < e.topn && e.idx < uint64(e.heap.heapSize); e.idx++ { row := e.heap.rows[e.idx] diff --git a/store/mockstore/unistore/lockstore/load_dump.go b/store/mockstore/unistore/lockstore/load_dump.go index 4f8e9acf46dff..85d16938baa0e 100644 --- a/store/mockstore/unistore/lockstore/load_dump.go +++ b/store/mockstore/unistore/lockstore/load_dump.go @@ -65,7 +65,7 @@ func (ls *MemStore) LoadFromFile(fileName string) (meta []byte, err error) { var endian = binary.LittleEndian -func (ls *MemStore) readItem(reader *bufio.Reader, buf []byte) ([]byte, error) { +func (*MemStore) readItem(reader *bufio.Reader, buf []byte) ([]byte, error) { lenBuf := make([]byte, 4) _, err := io.ReadFull(reader, lenBuf) if err != nil { @@ -83,7 +83,7 @@ func (ls *MemStore) readItem(reader *bufio.Reader, buf []byte) ([]byte, error) { return buf, nil } -func (ls *MemStore) writeItem(writer *bufio.Writer, data []byte) error { +func (*MemStore) writeItem(writer *bufio.Writer, data []byte) error { lenBuf := make([]byte, 4) endian.PutUint32(lenBuf, uint32(len(data))) _, err := writer.Write(lenBuf) diff --git a/store/mockstore/unistore/lockstore/lockstore.go b/store/mockstore/unistore/lockstore/lockstore.go index 02da0c06aed5a..1ae54ccecdb20 100644 --- a/store/mockstore/unistore/lockstore/lockstore.go +++ b/store/mockstore/unistore/lockstore/lockstore.go @@ -233,7 +233,7 @@ func (ls *MemStore) findLess(key []byte, allowEqual bool) (entry, bool) { // findSpliceForLevel returns (outBefore, outAfter) with outBefore.key < key <= outAfter.key. // The input "before" tells us where to start looking. // If we found a node with the same key, then we return true. -func (ls *MemStore) findSpliceForLevel(arena *arena, key []byte, before *node, level int) (*node, *node, bool) { +func (*MemStore) findSpliceForLevel(arena *arena, key []byte, before *node, level int) (*node, *node, bool) { for { // Assume before.key < key. nextAddr := before.getNextAddr(level) @@ -274,7 +274,7 @@ func (ls *MemStore) findLast() entry { } } -func (ls *MemStore) getNode(arena *arena, addr arenaAddr) *node { +func (*MemStore) getNode(arena *arena, addr arenaAddr) *node { data := arena.get(addr, nodeHeaderSize) return (*node)(unsafe.Pointer(&data[0])) } diff --git a/store/mockstore/unistore/pd/client.go b/store/mockstore/unistore/pd/client.go index 3ac364d5c0284..55547e9461899 100644 --- a/store/mockstore/unistore/pd/client.go +++ b/store/mockstore/unistore/pd/client.go @@ -211,8 +211,8 @@ func (c *client) switchLeader(addrs []string) error { return nil } -func (c *client) getMembers(ctx context.Context, url string) (*pdpb.GetMembersResponse, error) { - cc, err := c.getOrCreateConn(url) +func (c *client) getMembers(ctx context.Context, addr string) (*pdpb.GetMembersResponse, error) { + cc, err := c.getOrCreateConn(addr) if err != nil { return nil, err } @@ -466,7 +466,7 @@ func (c *client) GetStore(ctx context.Context, storeID uint64) (*metapb.Store, e return resp.Store, nil } -func (c *client) GetAllStores(ctx context.Context, opts ...pd.GetStoreOption) ([]*metapb.Store, error) { +func (c *client) GetAllStores(ctx context.Context, _ ...pd.GetStoreOption) ([]*metapb.Store, error) { var resp *pdpb.GetAllStoresResponse err := c.doRequest(ctx, func(ctx context.Context, client pdpb.PDClient) error { var err1 error @@ -503,7 +503,7 @@ func (c *client) GetClusterConfig(ctx context.Context) (*metapb.Cluster, error) return resp.Cluster, nil } -func (c *client) GetRegion(ctx context.Context, key []byte, opts ...pd.GetRegionOption) (*pd.Region, error) { +func (c *client) GetRegion(ctx context.Context, key []byte, _ ...pd.GetRegionOption) (*pd.Region, error) { var resp *pdpb.GetRegionResponse err := c.doRequest(ctx, func(ctx context.Context, client pdpb.PDClient) error { var err1 error @@ -530,7 +530,7 @@ func (c *client) GetRegion(ctx context.Context, key []byte, opts ...pd.GetRegion return r, nil } -func (c *client) GetRegionByID(ctx context.Context, regionID uint64, opts ...pd.GetRegionOption) (*pd.Region, error) { +func (c *client) GetRegionByID(ctx context.Context, regionID uint64, _ ...pd.GetRegionOption) (*pd.Region, error) { var resp *pdpb.GetRegionResponse err := c.doRequest(ctx, func(ctx context.Context, client pdpb.PDClient) error { var err1 error @@ -650,9 +650,9 @@ func (c *client) StoreHeartbeat(ctx context.Context, stats *pdpb.StoreStats) err return nil } -func (c *client) GetTS(ctx context.Context) (int64, int64, error) { +func (c *client) GetTS(ctx context.Context) (physical int64, logical int64, err error) { var resp *pdpb.TsoResponse - err := c.doRequest(ctx, func(ctx context.Context, client pdpb.PDClient) error { + err = c.doRequest(ctx, func(ctx context.Context, client pdpb.PDClient) error { tsoClient, err := client.Tso(ctx) if err != nil { return err diff --git a/store/mockstore/unistore/tikv/dbreader/db_reader.go b/store/mockstore/unistore/tikv/dbreader/db_reader.go index 474c7bb6b58d1..23de917f66252 100644 --- a/store/mockstore/unistore/tikv/dbreader/db_reader.go +++ b/store/mockstore/unistore/tikv/dbreader/db_reader.go @@ -74,7 +74,7 @@ type DBReader struct { } // GetMvccInfoByKey fills MvccInfo reading committed keys from db -func (r *DBReader) GetMvccInfoByKey(key []byte, isRowKey bool, mvccInfo *kvrpcpb.MvccInfo) error { +func (r *DBReader) GetMvccInfoByKey(key []byte, _ bool, mvccInfo *kvrpcpb.MvccInfo) error { it := r.GetIter() it.SetAllVersions(true) for it.Seek(key); it.Valid(); it.Next() { diff --git a/store/mockstore/unistore/tikv/kverrors/errors.go b/store/mockstore/unistore/tikv/kverrors/errors.go index 7081b4a7f80c8..abaa681ed5a89 100644 --- a/store/mockstore/unistore/tikv/kverrors/errors.go +++ b/store/mockstore/unistore/tikv/kverrors/errors.go @@ -75,7 +75,7 @@ func (e ErrInvalidOp) Error() string { // committed lock. type ErrAlreadyCommitted uint64 -func (e ErrAlreadyCommitted) Error() string { +func (ErrAlreadyCommitted) Error() string { return "txn already committed" } @@ -84,7 +84,7 @@ type ErrKeyAlreadyExists struct { Key []byte } -func (e ErrKeyAlreadyExists) Error() string { +func (ErrKeyAlreadyExists) Error() string { return "key already exists" } @@ -96,7 +96,7 @@ type ErrDeadlock struct { WaitChain []*deadlockpb.WaitForEntry } -func (e ErrDeadlock) Error() string { +func (ErrDeadlock) Error() string { return "deadlock" } @@ -108,7 +108,7 @@ type ErrConflict struct { Key []byte } -func (e *ErrConflict) Error() string { +func (*ErrConflict) Error() string { return "write conflict" } @@ -120,7 +120,7 @@ type ErrCommitExpire struct { Key []byte } -func (e *ErrCommitExpire) Error() string { +func (*ErrCommitExpire) Error() string { return "commit expired" } @@ -130,7 +130,7 @@ type ErrTxnNotFound struct { PrimaryKey []byte } -func (e *ErrTxnNotFound) Error() string { +func (*ErrTxnNotFound) Error() string { return "txn not found" } diff --git a/structure/hash.go b/structure/hash.go index 7a40172c98ff7..18983767c3001 100644 --- a/structure/hash.go +++ b/structure/hash.go @@ -49,7 +49,7 @@ func (t *TxStructure) HGet(key []byte, field []byte) ([]byte, error) { return value, errors.Trace(err) } -func (t *TxStructure) hashFieldIntegerVal(val int64) []byte { +func (*TxStructure) hashFieldIntegerVal(val int64) []byte { return []byte(strconv.FormatInt(val, 10)) } @@ -284,8 +284,7 @@ func (i *ReverseHashIterator) Value() []byte { } // Close Implements the Iterator Close. -func (i *ReverseHashIterator) Close() { -} +func (*ReverseHashIterator) Close() {} // NewHashReverseIter creates a reverse hash iterator. func NewHashReverseIter(t *TxStructure, key []byte) (*ReverseHashIterator, error) { diff --git a/table/table.go b/table/table.go index 775cb03bb6cf9..09dc61feb0fdc 100644 --- a/table/table.go +++ b/table/table.go @@ -242,6 +242,7 @@ type PartitionedTable interface { GetPartitionByRow(sessionctx.Context, []types.Datum) (PhysicalTable, error) GetAllPartitionIDs() []int64 GetPartitionColumnNames() []model.CIStr + CheckForExchangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum, pid int64) error } // TableFromMeta builds a table.Table from *model.TableInfo. diff --git a/table/tables/partition.go b/table/tables/partition.go index 9f84333213a82..89d3c02e4b559 100644 --- a/table/tables/partition.go +++ b/table/tables/partition.go @@ -247,12 +247,16 @@ func (item *btreeListColumnItem) Less(other btree.Item) bool { return item.key < other.(*btreeListColumnItem).key } +func lessBtreeListColumnItem(a, b *btreeListColumnItem) bool { + return a.key < b.key +} + // ForListColumnPruning is used for list columns partition pruning. type ForListColumnPruning struct { ExprCol *expression.Column valueTp *types.FieldType valueMap map[string]ListPartitionLocation - sorted *btree.BTree + sorted *btree.BTreeG[*btreeListColumnItem] // To deal with the location partition failure caused by inconsistent NewCollationEnabled values(see issue #32416). // The following fields are used to delay building valueMap. @@ -677,7 +681,7 @@ func (lp *ForListPruning) buildListColumnsPruner(ctx sessionctx.Context, tblInfo ExprCol: columns[idx], valueTp: &colInfo.FieldType, valueMap: make(map[string]ListPartitionLocation), - sorted: btree.New(btreeDegree), + sorted: btree.NewG[*btreeListColumnItem](btreeDegree, lessBtreeListColumnItem), } err := colPrune.buildPartitionValueMapAndSorted(p) if err != nil { @@ -891,8 +895,8 @@ func (lp *ForListColumnPruning) LocateRanges(sc *stmtctx.StatementContext, r *ra } locations := make([]ListPartitionLocation, 0, lp.sorted.Len()) - lp.sorted.AscendRange(newBtreeListColumnSearchItem(string(hack.String(lowKey))), newBtreeListColumnSearchItem(string(hack.String(highKey))), func(item btree.Item) bool { - locations = append(locations, item.(*btreeListColumnItem).location) + lp.sorted.AscendRange(newBtreeListColumnSearchItem(string(hack.String(lowKey))), newBtreeListColumnSearchItem(string(hack.String(highKey))), func(item *btreeListColumnItem) bool { + locations = append(locations, item.location) return true }) return locations, nil @@ -964,6 +968,17 @@ func PartitionRecordKey(pid int64, handle int64) kv.Key { return tablecodec.EncodeRecordKey(recordPrefix, kv.IntHandle(handle)) } +func (t *partitionedTable) CheckForExchangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum, pid int64) error { + defID, err := t.locatePartition(ctx, pi, r) + if err != nil { + return err + } + if defID != pid { + return errors.WithStack(table.ErrRowDoesNotMatchGivenPartitionSet) + } + return nil +} + // locatePartition returns the partition ID of the input record. func (t *partitionedTable) locatePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int64, error) { var err error diff --git a/table/temptable/BUILD.bazel b/table/temptable/BUILD.bazel index efeab02191b93..e4f8e9d841905 100644 --- a/table/temptable/BUILD.bazel +++ b/table/temptable/BUILD.bazel @@ -30,6 +30,7 @@ go_library( go_test( name = "temptable_test", + timeout = "short", srcs = [ "ddl_test.go", "interceptor_test.go", diff --git a/tablecodec/BUILD.bazel b/tablecodec/BUILD.bazel index 29b92a92d62f7..e46ad1e5bd03f 100644 --- a/tablecodec/BUILD.bazel +++ b/tablecodec/BUILD.bazel @@ -26,6 +26,7 @@ go_library( go_test( name = "tablecodec_test", + timeout = "short", srcs = [ "bench_test.go", "main_test.go", diff --git a/tablecodec/rowindexcodec/BUILD.bazel b/tablecodec/rowindexcodec/BUILD.bazel index 1956fbbf19933..8bbe71ffb9c67 100644 --- a/tablecodec/rowindexcodec/BUILD.bazel +++ b/tablecodec/rowindexcodec/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "rowindexcodec_test", + timeout = "short", srcs = [ "main_test.go", "rowindexcodec_test.go", diff --git a/tablecodec/tablecodec.go b/tablecodec/tablecodec.go index 3db97ef11f9c0..df7f4d188efff 100644 --- a/tablecodec/tablecodec.go +++ b/tablecodec/tablecodec.go @@ -1203,7 +1203,7 @@ func TryGetCommonPkColumnRestoredIds(tbl *model.TableInfo) []int64 { } // GenIndexValueForClusteredIndexVersion1 generates the index value for the clustered index with version 1(New in v5.0.0). -func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, IdxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64, handleRestoredData []types.Datum) ([]byte, error) { +func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, idxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64, handleRestoredData []types.Datum) ([]byte, error) { idxVal := make([]byte, 0) idxVal = append(idxVal, 0) tailLen := 0 @@ -1217,7 +1217,7 @@ func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInf if idxInfo.Global { idxVal = encodePartitionID(idxVal, partitionID) } - if IdxValNeedRestoredData || len(handleRestoredData) > 0 { + if idxValNeedRestoredData || len(handleRestoredData) > 0 { colIds := make([]int64, 0, len(idxInfo.Columns)) allRestoredData := make([]types.Datum, 0, len(handleRestoredData)+len(idxInfo.Columns)) for i, idxCol := range idxInfo.Columns { @@ -1261,7 +1261,7 @@ func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInf } // genIndexValueVersion0 create index value for both local and global index. -func genIndexValueVersion0(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, IdxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64) ([]byte, error) { +func genIndexValueVersion0(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, idxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64) ([]byte, error) { idxVal := make([]byte, 0) idxVal = append(idxVal, 0) newEncode := false @@ -1274,7 +1274,7 @@ func genIndexValueVersion0(sc *stmtctx.StatementContext, tblInfo *model.TableInf idxVal = encodePartitionID(idxVal, partitionID) newEncode = true } - if IdxValNeedRestoredData { + if idxValNeedRestoredData { colIds := make([]int64, len(idxInfo.Columns)) for i, col := range idxInfo.Columns { colIds[i] = tblInfo.Columns[col.Offset].ID @@ -1303,7 +1303,7 @@ func genIndexValueVersion0(sc *stmtctx.StatementContext, tblInfo *model.TableInf // If index is untouched and fetch here means the key is exists in TiKV, but not in txn mem-buffer, // then should also write the untouched index key/value to mem-buffer to make sure the data // is consistent with the index in txn mem-buffer. - tailLen += 1 + tailLen++ idxVal = append(idxVal, kv.UnCommitIndexKVFlag) } idxVal[0] = byte(tailLen) diff --git a/telemetry/BUILD.bazel b/telemetry/BUILD.bazel index 66fc1c7a3631b..15ff2794210fb 100644 --- a/telemetry/BUILD.bazel +++ b/telemetry/BUILD.bazel @@ -18,6 +18,7 @@ go_library( importpath = "github.com/pingcap/tidb/telemetry", visibility = ["//visibility:public"], deps = [ + "//br/pkg/utils", "//config", "//domain/infosync", "//infoschema", @@ -47,6 +48,7 @@ go_library( go_test( name = "telemetry_test", + timeout = "short", srcs = [ "data_cluster_hardware_test.go", "data_feature_usage_test.go", @@ -58,14 +60,21 @@ go_test( embed = [":telemetry"], deps = [ "//config", + "//ddl", + "//domain", + "//domain/infosync", "//kv", "//session", "//sessionctx", "//sessionctx/variable", + "//store/mockstore", + "//store/mockstore/unistore", "//testkit", "//testkit/testsetup", "@com_github_jeffail_gabs_v2//:gabs", + "@com_github_pingcap_kvproto//pkg/metapb", "@com_github_stretchr_testify//require", + "@com_github_tikv_client_go_v2//testutils", "@io_etcd_go_etcd_tests_v3//integration", "@org_uber_go_goleak//:goleak", ], diff --git a/telemetry/cte_test/BUILD.bazel b/telemetry/cte_test/BUILD.bazel index b73c62623079c..40ab5c9d45bf3 100644 --- a/telemetry/cte_test/BUILD.bazel +++ b/telemetry/cte_test/BUILD.bazel @@ -2,6 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "cte_test_test", + timeout = "short", srcs = ["cte_test.go"], deps = [ "//config", diff --git a/telemetry/data.go b/telemetry/data.go index 49bac14ce69f8..119293560b631 100644 --- a/telemetry/data.go +++ b/telemetry/data.go @@ -48,7 +48,7 @@ func generateTelemetryData(sctx sessionctx.Context, trackingID string) telemetry if f, err := getFeatureUsage(ctx, sctx); err == nil { r.FeatureUsage = f } - if s, err := getSlowQueryStats(ctx, sctx); err == nil { + if s, err := getSlowQueryStats(); err == nil { r.SlowQueryStats = s } @@ -63,4 +63,5 @@ func postReportTelemetryData() { postReportMultiSchemaChangeUsage() postReportSlowQueryStats() postReportNonTransactionalCounter() + PostSavepointCount() } diff --git a/telemetry/data_feature_usage.go b/telemetry/data_feature_usage.go index bc73153a84e15..7caf0dd286314 100644 --- a/telemetry/data_feature_usage.go +++ b/telemetry/data_feature_usage.go @@ -18,6 +18,7 @@ import ( "context" "errors" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/infoschema" m "github.com/pingcap/tidb/metrics" @@ -47,6 +48,9 @@ type featureUsage struct { NonTransactionalUsage *m.NonTransactionalStmtCounter `json:"nonTransactional"` GlobalKill bool `json:"globalKill"` MultiSchemaChange *m.MultiSchemaChangeUsageCounter `json:"multiSchemaChange"` + TiFlashModeStatistics TiFlashModeStatistics `json:"TiFlashModeStatistics"` + LogBackup bool `json:"logBackup"` + EnablePaging bool `json:"enablePaging"` } type placementPolicyUsage struct { @@ -81,6 +85,12 @@ func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsag usage.GlobalKill = getGlobalKillUsageInfo() + usage.TiFlashModeStatistics = getTiFlashModeStatistics(sctx) + + usage.LogBackup = getLogBackupUsageInfo(sctx) + + usage.EnablePaging = getPagingUsageInfo(sctx) + return &usage, nil } @@ -199,12 +209,14 @@ type TxnUsage struct { MutationCheckerUsed bool `json:"mutationCheckerUsed"` AssertionLevel string `json:"assertionLevel"` RcCheckTS bool `json:"rcCheckTS"` + SavepointCounter int64 `json:"SavepointCounter"` } var initialTxnCommitCounter metrics.TxnCommitCounter var initialCTECounter m.CTEUsageCounter var initialNonTransactionalCounter m.NonTransactionalStmtCounter var initialMultiSchemaChangeCounter m.MultiSchemaChangeUsageCounter +var initialSavepointStmtCounter int64 // getTxnUsageInfo gets the usage info of transaction related features. It's exported for tests. func getTxnUsageInfo(ctx sessionctx.Context) *TxnUsage { @@ -230,7 +242,9 @@ func getTxnUsageInfo(ctx sessionctx.Context) *TxnUsage { if val, err := variable.GetGlobalSystemVar(ctx.GetSessionVars(), variable.TiDBRCReadCheckTS); err == nil { rcCheckTSUsed = val == variable.On } - return &TxnUsage{asyncCommitUsed, onePCUsed, diff, mutationCheckerUsed, assertionUsed, rcCheckTSUsed} + currSavepointCount := m.GetSavepointStmtCounter() + diffSavepointCount := currSavepointCount - initialSavepointStmtCounter + return &TxnUsage{asyncCommitUsed, onePCUsed, diff, mutationCheckerUsed, assertionUsed, rcCheckTSUsed, diffSavepointCount} } func postReportTxnUsage() { @@ -241,6 +255,11 @@ func postReportCTEUsage() { initialCTECounter = m.GetCTECounter() } +// PostSavepointCount exports for testing. +func PostSavepointCount() { + initialSavepointStmtCounter = m.GetSavepointStmtCounter() +} + // getCTEUsageInfo gets the CTE usages. func getCTEUsageInfo() *m.CTEUsageCounter { curr := m.GetCTECounter() @@ -279,3 +298,42 @@ func postReportNonTransactionalCounter() { func getGlobalKillUsageInfo() bool { return config.GetGlobalConfig().EnableGlobalKill } + +// TiFlashModeStatistics records the usage info of Fast Mode +type TiFlashModeStatistics struct { + FastModeTableCount int64 `json:"fast_mode_table_count"` + NormalModeTableCount int64 `json:"normal_mode_table_count"` + AllTableCount int64 `json:"all_table_count"` +} + +func getTiFlashModeStatistics(ctx sessionctx.Context) TiFlashModeStatistics { + is := GetDomainInfoSchema(ctx) + var fastModeTableCount int64 = 0 + var normalModeTableCount int64 = 0 + var allTableCount int64 = 0 + for _, dbInfo := range is.AllSchemas() { + for _, tbInfo := range is.SchemaTables(dbInfo.Name) { + allTableCount++ + if tbInfo.Meta().TiFlashReplica != nil { + if tbInfo.Meta().TiFlashMode == model.TiFlashModeFast { + fastModeTableCount++ + } else { + normalModeTableCount++ + } + } + } + } + + return TiFlashModeStatistics{FastModeTableCount: fastModeTableCount, NormalModeTableCount: normalModeTableCount, AllTableCount: allTableCount} +} + +func getLogBackupUsageInfo(ctx sessionctx.Context) bool { + return utils.CheckLogBackupEnabled(ctx) +} + +// getPagingUsageInfo gets the value of system variable `tidb_enable_paging`. +// This variable is set to true as default since v6.2.0. We want to know many +// users set it to false manually. +func getPagingUsageInfo(ctx sessionctx.Context) bool { + return ctx.GetSessionVars().EnablePaging +} diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index d89928bbcc19d..5c50756ebcd59 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -17,12 +17,22 @@ package telemetry_test import ( "fmt" "testing" + "time" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/telemetry" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/testutils" ) func TestTxnUsageInfo(t *testing.T) { @@ -279,3 +289,128 @@ func TestGlobalKillUsageInfo(t *testing.T) { require.NoError(t, err) require.False(t, usage.GlobalKill) } + +type tiflashContext struct { + store kv.Storage + dom *domain.Domain + tiflash *infosync.MockTiFlash + cluster *unistore.Cluster +} + +func createTiFlashContext(t *testing.T) (*tiflashContext, func()) { + s := &tiflashContext{} + var err error + + ddl.PollTiFlashInterval = 1000 * time.Millisecond + ddl.PullTiFlashPdTick.Store(60) + s.tiflash = infosync.NewMockTiFlash() + s.store, err = mockstore.NewMockStore( + mockstore.WithClusterInspector(func(c testutils.Cluster) { + mockCluster := c.(*unistore.Cluster) + _, _, region1 := mockstore.BootstrapWithSingleStore(c) + tiflashIdx := 0 + for tiflashIdx < 2 { + store2 := c.AllocID() + peer2 := c.AllocID() + addr2 := fmt.Sprintf("tiflash%d", tiflashIdx) + mockCluster.AddStore(store2, addr2, &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) + mockCluster.AddPeer(region1, store2, peer2) + tiflashIdx++ + } + s.cluster = mockCluster + }), + mockstore.WithStoreType(mockstore.EmbedUnistore), + ) + + require.NoError(t, err) + session.SetSchemaLease(0) + session.DisableStats4Test() + s.dom, err = session.BootstrapSession(s.store) + infosync.SetMockTiFlash(s.tiflash) + require.NoError(t, err) + s.dom.SetStatsUpdating(true) + + tearDown := func() { + s.tiflash.Lock() + s.tiflash.StatusServer.Close() + s.tiflash.Unlock() + s.dom.Close() + require.NoError(t, s.store.Close()) + ddl.PollTiFlashInterval = 2 * time.Second + } + return s, tearDown +} + +func TestTiFlashModeStatistics(t *testing.T) { + s, teardown := createTiFlashContext(t) + defer teardown() + + tk := testkit.NewTestKit(t, s.store) + tk.MustExec("use test") + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(0), usage.TiFlashModeStatistics.FastModeTableCount) + require.Equal(t, int64(0), usage.TiFlashModeStatistics.NormalModeTableCount) + + tk.MustExec(`create table t1(a int);`) + tk.MustExec(`alter table t1 set tiflash replica 1;`) + tk.MustExec(`alter table t1 set tiflash mode fast;`) + + tk.MustExec(`create table t2(a int);`) + tk.MustExec(`alter table t2 set tiflash replica 1;`) + tk.MustExec(`alter table t2 set tiflash mode normal;`) + + tk.MustExec(`create table t3(a int);`) + tk.MustExec(`alter table t3 set tiflash replica 1;`) + + tk.MustExec(`create table t4(a int);`) + + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(1), usage.TiFlashModeStatistics.FastModeTableCount) + require.Equal(t, int64(2), usage.TiFlashModeStatistics.NormalModeTableCount) + + tk.MustExec("drop table t1;") + tk.MustExec(`alter table t2 set tiflash mode fast;`) + + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, int64(1), usage.TiFlashModeStatistics.FastModeTableCount) + require.Equal(t, int64(1), usage.TiFlashModeStatistics.NormalModeTableCount) +} + +func TestPagingUsageInfo(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.True(t, usage.EnablePaging == variable.DefTiDBEnablePaging) + + tk.Session().GetSessionVars().EnablePaging = false + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.False(t, usage.EnablePaging) +} + +func TestTxnSavepointUsageInfo(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("savepoint sp1") + tk.MustExec("savepoint sp2") + txnUsage := telemetry.GetTxnUsageInfo(tk.Session()) + require.Equal(t, int64(2), txnUsage.SavepointCounter) + + tk.MustExec("savepoint sp3") + txnUsage = telemetry.GetTxnUsageInfo(tk.Session()) + require.Equal(t, int64(3), txnUsage.SavepointCounter) + + telemetry.PostSavepointCount() + tk.MustExec("savepoint sp1") + txnUsage = telemetry.GetTxnUsageInfo(tk.Session()) + require.Equal(t, int64(1), txnUsage.SavepointCounter) +} diff --git a/telemetry/data_slow_query.go b/telemetry/data_slow_query.go index 7b1b9ef00d440..188e2b3a4b5f3 100644 --- a/telemetry/data_slow_query.go +++ b/telemetry/data_slow_query.go @@ -25,7 +25,6 @@ import ( pingcapErrors "github.com/pingcap/errors" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/logutil" pmodel "github.com/prometheus/common/model" "go.uber.org/zap" @@ -62,8 +61,8 @@ var ( slowQueryLock sync.Mutex ) -func getSlowQueryStats(ctx context.Context, sctx sessionctx.Context) (*slowQueryStats, error) { - slowQueryBucket, err := getSlowQueryBucket(sctx) +func getSlowQueryStats() (*slowQueryStats, error) { + slowQueryBucket, err := getSlowQueryBucket() if err != nil { logutil.BgLogger().Info(err.Error()) return nil, err @@ -73,9 +72,9 @@ func getSlowQueryStats(ctx context.Context, sctx sessionctx.Context) (*slowQuery } // getSlowQueryBucket generates the delta SlowQueryBucket to report -func getSlowQueryBucket(sctx sessionctx.Context) (*SlowQueryBucket, error) { +func getSlowQueryBucket() (*SlowQueryBucket, error) { // update currentSQBInfo first, then gen delta - if err := updateCurrentSQB(sctx); err != nil { + if err := updateCurrentSQB(); err != nil { return nil, err } delta := calculateDeltaSQB() @@ -83,7 +82,7 @@ func getSlowQueryBucket(sctx sessionctx.Context) (*SlowQueryBucket, error) { } // updateCurrentSQB records current slow query buckets -func updateCurrentSQB(sctx sessionctx.Context) (err error) { +func updateCurrentSQB() (err error) { defer func() { if r := recover(); r != nil { err = pingcapErrors.Errorf(fmt.Sprintln(r)) diff --git a/telemetry/data_window.go b/telemetry/data_window.go index 0945326075083..4bee9522fde56 100644 --- a/telemetry/data_window.go +++ b/telemetry/data_window.go @@ -159,14 +159,14 @@ func getSQLSum(sqlTypeData *sqlType) uint64 { return result } -func readSQLMetric(timepoint time.Time, SQLResult *sqlUsageData) error { +func readSQLMetric(timepoint time.Time, sqlResult *sqlUsageData) error { ctx := context.TODO() promQL := "avg(tidb_executor_statement_total{}) by (type)" result, err := querySQLMetric(ctx, timepoint, promQL) if err != nil { return err } - analysisSQLUsage(result, SQLResult) + analysisSQLUsage(result, sqlResult) return nil } @@ -204,17 +204,16 @@ func querySQLMetric(ctx context.Context, queryTime time.Time, promQL string) (re return result, err } -func analysisSQLUsage(promResult pmodel.Value, SQLResult *sqlUsageData) { +func analysisSQLUsage(promResult pmodel.Value, sqlResult *sqlUsageData) { if promResult == nil { return } - switch promResult.Type() { - case pmodel.ValVector: + if promResult.Type() == pmodel.ValVector { matrix := promResult.(pmodel.Vector) for _, m := range matrix { v := m.Value promLable := string(m.Metric[pmodel.LabelName("type")]) - SQLResult.SQLType[promLable] = uint64(v) + sqlResult.SQLType[promLable] = uint64(v) } } } diff --git a/telemetry/util.go b/telemetry/util.go index bdbe8816201fc..0ac56649662c5 100644 --- a/telemetry/util.go +++ b/telemetry/util.go @@ -34,7 +34,7 @@ func hashString(text string) (string, error) { } // parseAddressAndHash parses an address in HOST:PORT format, returns the hashed host and the port. -func parseAddressAndHash(address string) (string, string, error) { +func parseAddressAndHash(address string) (result string, portName string, err error) { var host, port string if !strings.Contains(address, ":") { host = address diff --git a/testkit/testfork/BUILD.bazel b/testkit/testfork/BUILD.bazel index 89d1e33ac65a5..dd375877e8178 100644 --- a/testkit/testfork/BUILD.bazel +++ b/testkit/testfork/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "testfork_test", + timeout = "short", srcs = ["fork_test.go"], embed = [":testfork"], deps = ["@com_github_stretchr_testify//require"], diff --git a/testkit/testkit.go b/testkit/testkit.go index 912b5292dad10..4b47dd61f4b96 100644 --- a/testkit/testkit.go +++ b/testkit/testkit.go @@ -186,6 +186,28 @@ func (tk *TestKit) HasPlan(sql string, plan string, args ...interface{}) bool { return false } +// HasKeywordInOperatorInfo checks if the result execution plan contains specific keyword in the operator info. +func (tk *TestKit) HasKeywordInOperatorInfo(sql string, keyword string, args ...interface{}) bool { + rs := tk.MustQuery("explain "+sql, args...) + for i := range rs.rows { + if strings.Contains(rs.rows[i][4], keyword) { + return true + } + } + return false +} + +// NotHasKeywordInOperatorInfo checks if the result execution plan doesn't contain specific keyword in the operator info. +func (tk *TestKit) NotHasKeywordInOperatorInfo(sql string, keyword string, args ...interface{}) bool { + rs := tk.MustQuery("explain "+sql, args...) + for i := range rs.rows { + if strings.Contains(rs.rows[i][4], keyword) { + return false + } + } + return true +} + // HasPlan4ExplainFor checks if the result execution plan contains specific plan. func (tk *TestKit) HasPlan4ExplainFor(result *Result, plan string) bool { for i := range result.rows { diff --git a/testkit/testutil/BUILD.bazel b/testkit/testutil/BUILD.bazel index 2e167c384deda..4a1bd35f4cd65 100644 --- a/testkit/testutil/BUILD.bazel +++ b/testkit/testutil/BUILD.bazel @@ -22,6 +22,7 @@ go_library( go_test( name = "testutil_test", + timeout = "short", srcs = ["require_test.go"], embed = [":testutil"], deps = [ diff --git a/tests/readonlytest/readonly_test.go b/tests/readonlytest/readonly_test.go index bf2f267531788..dee5ff29196ea 100644 --- a/tests/readonlytest/readonly_test.go +++ b/tests/readonlytest/readonly_test.go @@ -64,7 +64,7 @@ func setVariableNoError(t *testing.T, db *sql.DB, variable string, status int) { require.NoError(t, err) } -func setVariable(t *testing.T, db *sql.DB, variable string, status int) error { +func setVariable(_ *testing.T, db *sql.DB, variable string, status int) error { _, err := db.Exec(fmt.Sprintf("set global %s=%d", variable, status)) return err } diff --git a/tests/realtikvtest/brietest/BUILD.bazel b/tests/realtikvtest/brietest/BUILD.bazel index dc4d8f961044c..29e6e6f2c9404 100644 --- a/tests/realtikvtest/brietest/BUILD.bazel +++ b/tests/realtikvtest/brietest/BUILD.bazel @@ -2,6 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "brietest_test", + timeout = "short", srcs = [ "backup_restore_test.go", "binlog_test.go", diff --git a/tests/realtikvtest/pessimistictest/BUILD.bazel b/tests/realtikvtest/pessimistictest/BUILD.bazel index 4e24498c34a4f..4b7904ed38dea 100644 --- a/tests/realtikvtest/pessimistictest/BUILD.bazel +++ b/tests/realtikvtest/pessimistictest/BUILD.bazel @@ -2,6 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "pessimistictest_test", + timeout = "short", srcs = [ "main_test.go", "pessimistic_test.go", diff --git a/tests/realtikvtest/sessiontest/BUILD.bazel b/tests/realtikvtest/sessiontest/BUILD.bazel index 14923fa0fa623..25319ceafe3b4 100644 --- a/tests/realtikvtest/sessiontest/BUILD.bazel +++ b/tests/realtikvtest/sessiontest/BUILD.bazel @@ -5,6 +5,7 @@ go_test( timeout = "short", srcs = [ "main_test.go", + "paging_test.go", "retry_test.go", "session_fail_test.go", "session_test.go", @@ -17,7 +18,6 @@ go_test( "//domain", "//errno", "//executor", - "//infoschema", "//kv", "//meta/autoid", "//parser", @@ -31,11 +31,9 @@ go_test( "//session", "//sessionctx", "//sessionctx/variable", - "//sessiontxn", "//store/copr", "//store/mockstore", "//table/tables", - "//tablecodec", "//testkit", "//tests/realtikvtest", "//types", diff --git a/tests/realtikvtest/sessiontest/paging_test.go b/tests/realtikvtest/sessiontest/paging_test.go new file mode 100644 index 0000000000000..0266534d8226b --- /dev/null +++ b/tests/realtikvtest/sessiontest/paging_test.go @@ -0,0 +1,105 @@ +// 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 sessiontest + +import ( + "fmt" + "math/rand" + "strconv" + "strings" + "testing" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/tests/realtikvtest" + "github.com/stretchr/testify/require" +) + +func TestPagingActRowsAndProcessKeys(t *testing.T) { + // Close copr-cache + defer config.RestoreFunc() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.CoprCache.CapacityMB = 0 + }) + + store, clean := realtikvtest.CreateMockStoreAndSetup(t) + defer clean() + session := testkit.NewTestKit(t, store) + session.MustExec("use test;") + session.MustExec("drop table if exists t;") + session.MustExec(`set @@tidb_wait_split_region_finish=1`) + session.MustExec("create table t(a int,b int,c int,index idx(a,b), primary key(a));") + // prepare data, insert 10w record + // [0, 999999] + for i := 0; i < 100; i++ { + sql := "insert into t value" + for j := 0; j < 1000; j++ { + if j != 0 { + sql += "," + } + sql += "(" + strconv.Itoa(i*1000+j) + "," + strconv.Itoa(i*1000+j) + "," + strconv.Itoa(i*1000+j) + ")" + } + session.MustExec(sql) + } + + testcase := []struct { + regionNumLowerBound int32 + regionNumUpperBound int32 + }{ + {10, 100}, // [10, 99] + {100, 500}, // [100,499] + {500, 1000}, // [500,999] + {1000, 1001}, // 1000 + } + + openOrClosePaging := []string{ + "set tidb_enable_paging = on;", + "set tidb_enable_paging = off;", + } + + sqls := []string{ + "desc analyze select a,b from t;", // TableScan + "desc analyze select /*+ use_index(t,idx) */ a,b from t;", // IndexScan + "desc analyze select /*+ use_index(t,idx) */ c from t;", // IndexLookUp + } + + checkScanOperator := func(strs []interface{}) { + require.Equal(t, strs[2].(string), "100000") + if *realtikvtest.WithRealTiKV { // Unistore don't collect process_keys now + require.True(t, strings.Contains(strs[5].(string), "total_process_keys: 100000"), strs[5]) + } + } + + checkResult := func(result [][]interface{}) { + for _, strs := range result { + if strings.Contains(strs[0].(string), "Scan") { + checkScanOperator(strs) + } + } + } + + for _, tc := range testcase { + regionNum := rand.Int31n(tc.regionNumUpperBound-tc.regionNumLowerBound) + tc.regionNumLowerBound + _ = session.MustQuery(fmt.Sprintf("split table t between (0) and (1000000) regions %v;", regionNum)) + _ = session.MustQuery(fmt.Sprintf("split table t index idx between (0) and (1000000) regions %v;", regionNum)) + for _, sql := range sqls { + for _, pagingSQL := range openOrClosePaging { + session.MustExec(pagingSQL) + rows := session.MustQuery(sql) + checkResult(rows.Rows()) + } + } + } +} diff --git a/tests/realtikvtest/sessiontest/session_test.go b/tests/realtikvtest/sessiontest/session_test.go index 33a36053dedb8..ffb52d4f2eb2b 100644 --- a/tests/realtikvtest/sessiontest/session_test.go +++ b/tests/realtikvtest/sessiontest/session_test.go @@ -1373,7 +1373,8 @@ func TestCoprocessorOOMAction(t *testing.T) { store, clean := realtikvtest.CreateMockStoreAndSetup(t) defer clean() tk := testkit.NewTestKit(t, store) - tk.MustExec("use test") + tk.MustExec("create database testoom") + tk.MustExec("use testoom") tk.MustExec(`set @@tidb_wait_split_region_finish=1`) // create table for non keep-order case tk.MustExec("drop table if exists t5") @@ -1414,7 +1415,7 @@ func TestCoprocessorOOMAction(t *testing.T) { quota := 5*copr.MockResponseSizeForTest - 100 defer tk.MustExec("SET GLOBAL tidb_mem_oom_action = DEFAULT") tk.MustExec("SET GLOBAL tidb_mem_oom_action='CANCEL'") - tk.MustExec("use test") + tk.MustExec("use testoom") tk.MustExec("set @@tidb_distsql_scan_concurrency = 10") tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) var expect []string @@ -1429,7 +1430,7 @@ 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("use test") + tk.MustExec("use testoom") tk.MustExec("set @@tidb_distsql_scan_concurrency = 10") tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) err := tk.QueryToErr(sql) @@ -1451,7 +1452,7 @@ func TestCoprocessorOOMAction(t *testing.T) { se.Close() } globaltk := testkit.NewTestKit(t, store) - globaltk.MustExec("use test") + globaltk.MustExec("use testoom") globaltk.MustExec("set global tidb_enable_rate_limit_action= 0") for _, testcase := range testcases { se, err := session.CreateSession4Test(store) @@ -1476,7 +1477,7 @@ func TestCoprocessorOOMAction(t *testing.T) { se, err := session.CreateSession4Test(store) require.NoError(t, err) tk.SetSession(se) - tk.MustExec("use test") + tk.MustExec("use testoom") tk.MustExec("set tidb_distsql_scan_concurrency = 1") tk.MustExec("set @@tidb_mem_quota_query=1;") err = tk.QueryToErr(testcase.sql) diff --git a/tests/realtikvtest/sessiontest/temporary_table_test.go b/tests/realtikvtest/sessiontest/temporary_table_test.go index 67f94d381fbf7..c669ac199544c 100644 --- a/tests/realtikvtest/sessiontest/temporary_table_test.go +++ b/tests/realtikvtest/sessiontest/temporary_table_test.go @@ -15,7 +15,6 @@ package sessiontest import ( - "context" "fmt" "sort" "strconv" @@ -23,14 +22,10 @@ import ( "testing" "github.com/pingcap/tidb/errno" - "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/sessiontxn" - "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/tests/realtikvtest" "github.com/stretchr/testify/require" @@ -284,65 +279,6 @@ func TestLocalTemporaryTableUpdate(t *testing.T) { } } -func TestTemporaryTableInterceptor(t *testing.T) { - store, clean := realtikvtest.CreateMockStoreAndSetup(t) - defer clean() - - tk := testkit.NewTestKit(t, store) - tk.MustExec("create temporary table test.tmp1 (id int primary key)") - tbl, err := tk.Session().GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tmp1")) - require.NoError(t, err) - require.Equal(t, model.TempTableLocal, tbl.Meta().TempTableType) - tblID := tbl.Meta().ID - - // prepare a kv pair for temporary table - k := append(tablecodec.EncodeTablePrefix(tblID), 1) - require.NoError(t, tk.Session().GetSessionVars().TemporaryTableData.SetTableKey(tblID, k, []byte("v1"))) - - initTxnFuncs := []func() error{ - func() error { - err := tk.Session().PrepareTxnCtx(context.TODO()) - if err == nil { - err = sessiontxn.GetTxnManager(tk.Session()).AdviseWarmup() - } - return err - }, - func() error { - return sessiontxn.NewTxn(context.Background(), tk.Session()) - }, - func() error { - return sessiontxn.GetTxnManager(tk.Session()).EnterNewTxn(context.TODO(), &sessiontxn.EnterNewTxnRequest{ - Type: sessiontxn.EnterNewTxnWithBeginStmt, - StaleReadTS: 0, - }) - }, - } - - for _, initFunc := range initTxnFuncs { - require.NoError(t, initFunc()) - - require.NoError(t, sessiontxn.GetTxnManager(tk.Session()).OnStmtStart(context.TODO(), nil)) - txn, err := tk.Session().Txn(true) - require.NoError(t, err) - - val, err := txn.Get(context.Background(), k) - require.NoError(t, err) - require.Equal(t, []byte("v1"), val) - - val, err = txn.GetSnapshot().Get(context.Background(), k) - require.NoError(t, err) - require.Equal(t, []byte("v1"), val) - - tk.Session().RollbackTxn(context.Background()) - } - - // Also check GetSnapshotWithTS - snap := sessiontxn.GetSnapshotWithTS(tk.Session(), 0) - val, err := snap.Get(context.Background(), k) - require.NoError(t, err) - require.Equal(t, []byte("v1"), val) -} - func TestTemporaryTableSize(t *testing.T) { // Test the @@tidb_tmp_table_max_size system variable. diff --git a/tests/realtikvtest/statisticstest/BUILD.bazel b/tests/realtikvtest/statisticstest/BUILD.bazel index 0baa43e00be64..f29270dfb7e90 100644 --- a/tests/realtikvtest/statisticstest/BUILD.bazel +++ b/tests/realtikvtest/statisticstest/BUILD.bazel @@ -2,6 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "statisticstest_test", + timeout = "short", srcs = [ "main_test.go", "statistics_test.go", diff --git a/tests/realtikvtest/testkit.go b/tests/realtikvtest/testkit.go index 501fafcd3e6ec..a50dd5ef0d85a 100644 --- a/tests/realtikvtest/testkit.go +++ b/tests/realtikvtest/testkit.go @@ -46,7 +46,7 @@ var WithRealTiKV = flag.Bool("with-real-tikv", false, "whether tests run with re func RunTestMain(m *testing.M) { testsetup.SetupForCommonTest() flag.Parse() - session.SetSchemaLease(20 * time.Millisecond) + session.SetSchemaLease(5 * time.Second) config.UpdateGlobal(func(conf *config.Config) { conf.TiKVClient.AsyncCommit.SafeWindow = 0 conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 diff --git a/tests/realtikvtest/txntest/BUILD.bazel b/tests/realtikvtest/txntest/BUILD.bazel index fd7e9fbdb3753..4b7188bc5ecf6 100644 --- a/tests/realtikvtest/txntest/BUILD.bazel +++ b/tests/realtikvtest/txntest/BUILD.bazel @@ -2,6 +2,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "txntest_test", + timeout = "short", srcs = [ "isolation_test.go", "main_test.go", diff --git a/tidb-binlog/driver/reader/BUILD.bazel b/tidb-binlog/driver/reader/BUILD.bazel index 11fd71c2dec51..cb4c859c4c7fc 100644 --- a/tidb-binlog/driver/reader/BUILD.bazel +++ b/tidb-binlog/driver/reader/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "reader_test", + timeout = "short", srcs = ["offset_test.go"], embed = [":reader"], deps = [ diff --git a/tidb-binlog/driver/reader/offset.go b/tidb-binlog/driver/reader/offset.go index 4efb90dcbeb29..bc91bb3cfb45e 100644 --- a/tidb-binlog/driver/reader/offset.go +++ b/tidb-binlog/driver/reader/offset.go @@ -52,8 +52,8 @@ func NewKafkaSeeker(addr []string, config *sarama.Config) (*KafkaSeeker, error) // Close releases resources of KafkaSeeker func (ks *KafkaSeeker) Close() { - ks.consumer.Close() - ks.client.Close() + _ = ks.consumer.Close() + _ = ks.client.Close() } // Seek seeks the first offset which binlog CommitTs bigger than ts @@ -178,7 +178,7 @@ func (ks *KafkaSeeker) getTSAtOffset(topic string, partition int32, offset int64 err = errors.Trace(err) return } - defer pc.Close() + defer func() { _ = pc.Close() }() errorCnt := 0 for { diff --git a/tidb-binlog/driver/reader/reader.go b/tidb-binlog/driver/reader/reader.go index 8784ab8e7fcaa..0418ce5324c79 100644 --- a/tidb-binlog/driver/reader/reader.go +++ b/tidb-binlog/driver/reader/reader.go @@ -150,7 +150,7 @@ func NewReader(cfg *Config) (r *Reader, err error) { func (r *Reader) Close() { close(r.stop) - r.client.Close() + _ = r.client.Close() } // Messages returns a chan that contains unread buffered message @@ -191,20 +191,23 @@ func (r *Reader) run() { if err != nil { log.Fatal("create kafka consumer failed", zap.Error(err)) } - defer consumer.Close() + defer func() { + _ = consumer.Close() + }() topic, partition := r.getTopic() partitionConsumer, err := consumer.ConsumePartition(topic, partition, offset) if err != nil { log.Fatal("create kafka partition consumer failed", zap.Error(err)) } - defer partitionConsumer.Close() - + defer func() { + _ = partitionConsumer.Close() + }() // add select to avoid message blocking while reading for { select { case <-r.stop: // clean environment - partitionConsumer.Close() + _ = partitionConsumer.Close() close(r.msgs) log.Info("reader stop to run") return diff --git a/tidb-binlog/node/BUILD.bazel b/tidb-binlog/node/BUILD.bazel index 4ab911cebb865..125ff3b471ae2 100644 --- a/tidb-binlog/node/BUILD.bazel +++ b/tidb-binlog/node/BUILD.bazel @@ -20,6 +20,7 @@ go_library( go_test( name = "node_test", + timeout = "short", srcs = ["registry_test.go"], embed = [":node"], deps = [ diff --git a/tidb-binlog/node/registry.go b/tidb-binlog/node/registry.go index 9ef55d3061318..5d7d07acb2044 100644 --- a/tidb-binlog/node/registry.go +++ b/tidb-binlog/node/registry.go @@ -48,7 +48,7 @@ func (r *EtcdRegistry) Close() error { return errors.Trace(err) } -func (r *EtcdRegistry) prefixed(p ...string) string { +func (*EtcdRegistry) prefixed(p ...string) string { return path.Join(p...) } @@ -173,15 +173,14 @@ func AnalyzeNodeID(key string) string { paths := strings.Split(key, "/") nodeIDOffset := 3 - if len(paths) >= 2 { - // version string start with 'v' - if !strings.HasPrefix(paths[1], "v") { - nodeIDOffset = 2 - } - } else { + if len(paths) < 2 { log.Error("can't get nodeID or node type", zap.String("key", key)) return "" } + // version string start with 'v' + if !strings.HasPrefix(paths[1], "v") { + nodeIDOffset = 2 + } if len(paths) < nodeIDOffset+1 { log.Error("can't get nodeID or node type", zap.String("key", key)) diff --git a/tidb-binlog/pump_client/BUILD.bazel b/tidb-binlog/pump_client/BUILD.bazel index 9063cb7e95a07..124e0a575482e 100644 --- a/tidb-binlog/pump_client/BUILD.bazel +++ b/tidb-binlog/pump_client/BUILD.bazel @@ -28,6 +28,7 @@ go_library( go_test( name = "pump_client_test", + timeout = "short", srcs = [ "bench_test.go", "client_test.go", diff --git a/tidb-binlog/pump_client/client.go b/tidb-binlog/pump_client/client.go index 1ef701973b9e3..59c21f9ef76ec 100644 --- a/tidb-binlog/pump_client/client.go +++ b/tidb-binlog/pump_client/client.go @@ -214,13 +214,13 @@ func NewLocalPumpsClient(etcdURLs, binlogSocket string, timeout time.Duration, s Security: security, binlogSocket: binlogSocket, } - newPumpsClient.getLocalPumpStatus(ctx) + newPumpsClient.syncLocalPumpStatus(ctx) return newPumpsClient, nil } -// getLocalPumpStatus gets the local pump. For compatible with kafka version tidb-binlog. -func (c *PumpsClient) getLocalPumpStatus(pctx context.Context) { +// getLocalPumpStatus sync the local pump. For compatible with kafka version tidb-binlog. +func (c *PumpsClient) syncLocalPumpStatus(_ context.Context) { nodeStatus := &node.Status{ NodeID: localPump, Addr: c.binlogSocket, @@ -326,7 +326,7 @@ func (c *PumpsClient) WriteBinlog(binlog *pb.Binlog) error { } log.Info("[pumps client] write binlog to available pumps all failed, will try unavailable pumps") - pump, err1 := c.backoffWriteBinlog(req, binlog.Tp, binlog.StartTs) + pump, err1 := c.backoffWriteBinlog(req, binlog.Tp) if err1 == nil { choosePump = pump return nil @@ -337,7 +337,7 @@ func (c *PumpsClient) WriteBinlog(binlog *pb.Binlog) error { // Return directly for non p-binlog. // Try every online pump for p-binlog. -func (c *PumpsClient) backoffWriteBinlog(req *pb.WriteBinlogReq, binlogType pb.BinlogType, startTS int64) (pump *PumpStatus, err error) { +func (c *PumpsClient) backoffWriteBinlog(req *pb.WriteBinlogReq, binlogType pb.BinlogType) (pump *PumpStatus, err error) { if binlogType != pb.BinlogType_Prewrite { // never return error for commit/rollback binlog. return nil, nil @@ -428,7 +428,6 @@ func (c *PumpsClient) addPump(pump *PumpStatus, updateSelector bool) { if updateSelector { c.Selector.SetPumps(copyPumps(c.Pumps.AvaliablePumps)) } - } // SetSelectStrategy sets the selector's strategy, strategy should be 'range' or 'hash' now. diff --git a/tidb-binlog/pump_client/pump.go b/tidb-binlog/pump_client/pump.go index a03d5a307b31c..82fa48da92da2 100644 --- a/tidb-binlog/pump_client/pump.go +++ b/tidb-binlog/pump_client/pump.go @@ -182,5 +182,4 @@ func (p *PumpStatus) IsUsable() bool { // ShouldBeUsable returns true if pump should be usable func (p *PumpStatus) ShouldBeUsable() bool { return p.Status.State == node.Online - } diff --git a/tidb-binlog/pump_client/selector.go b/tidb-binlog/pump_client/selector.go index f687049c69974..af879ab27330d 100644 --- a/tidb-binlog/pump_client/selector.go +++ b/tidb-binlog/pump_client/selector.go @@ -102,7 +102,7 @@ func (h *HashSelector) Select(binlog *pb.Binlog, retryTime int) *PumpStatus { } // Feedback implement PumpSelector.Feedback -func (h *HashSelector) Feedback(startTS int64, binlogType pb.BinlogType, pump *PumpStatus) { +func (*HashSelector) Feedback(startTS int64, binlogType pb.BinlogType, pump *PumpStatus) { maintainTSMap(startTS, binlogType, pump) } @@ -132,7 +132,7 @@ func (r *RangeSelector) SetPumps(pumps []*PumpStatus) { } // Select implement PumpSelector.Select. -func (r *RangeSelector) Select(binlog *pb.Binlog, retryTime int) *PumpStatus { +func (r *RangeSelector) Select(binlog *pb.Binlog, _ int) *PumpStatus { // TODO: use status' label to match suitable pump. selectorLock.Lock() defer selectorLock.Unlock() @@ -163,7 +163,7 @@ func (r *RangeSelector) Select(binlog *pb.Binlog, retryTime int) *PumpStatus { } // Feedback implement PumpSelector.Select -func (r *RangeSelector) Feedback(startTS int64, binlogType pb.BinlogType, pump *PumpStatus) { +func (*RangeSelector) Feedback(startTS int64, binlogType pb.BinlogType, pump *PumpStatus) { maintainTSMap(startTS, binlogType, pump) } @@ -190,7 +190,7 @@ func (u *LocalUnixSelector) SetPumps(pumps []*PumpStatus) { } // Select implement PumpSelector.Select. -func (u *LocalUnixSelector) Select(binlog *pb.Binlog, retryTime int) *PumpStatus { +func (u *LocalUnixSelector) Select(_ *pb.Binlog, _ int) *PumpStatus { selectorLock.RLock() defer selectorLock.RUnlock() @@ -198,8 +198,7 @@ func (u *LocalUnixSelector) Select(binlog *pb.Binlog, retryTime int) *PumpStatus } // Feedback implement PumpSelector.Feedback -func (u *LocalUnixSelector) Feedback(startTS int64, binlogType pb.BinlogType, pump *PumpStatus) { -} +func (*LocalUnixSelector) Feedback(_ int64, _ pb.BinlogType, _ *PumpStatus) {} // ScoreSelector select a pump by pump's score. type ScoreSelector struct{} @@ -210,18 +209,18 @@ func NewScoreSelector() PumpSelector { } // SetPumps implement PumpSelector.SetPumps. -func (s *ScoreSelector) SetPumps(pumps []*PumpStatus) { +func (*ScoreSelector) SetPumps(_ []*PumpStatus) { // TODO } // Select implement PumpSelector.Select. -func (s *ScoreSelector) Select(binlog *pb.Binlog, retryTime int) *PumpStatus { +func (*ScoreSelector) Select(_ *pb.Binlog, _ int) *PumpStatus { // TODO return nil } // Feedback implement PumpSelector.Feedback -func (s *ScoreSelector) Feedback(startTS int64, binlogType pb.BinlogType, pump *PumpStatus) { +func (*ScoreSelector) Feedback(_ int64, _ pb.BinlogType, _ *PumpStatus) { // TODO } diff --git a/tidb-server/BUILD.bazel b/tidb-server/BUILD.bazel index ad6526d69138e..67be8ca5ef563 100644 --- a/tidb-server/BUILD.bazel +++ b/tidb-server/BUILD.bazel @@ -85,6 +85,7 @@ go_binary( go_test( name = "tidb-server_test", + timeout = "short", srcs = ["main_test.go"], embed = [":tidb-server_lib"], deps = [ diff --git a/tidb-server/main.go b/tidb-server/main.go index bc8795875f360..5a4ef5b62fae2 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -26,6 +26,7 @@ import ( "sync/atomic" "time" + "github.com/coreos/go-semver/semver" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -34,6 +35,7 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" @@ -297,6 +299,8 @@ func createStoreAndDomain() (kv.Storage, *domain.Domain) { var err error storage, err := kvstore.New(fullPath) terror.MustNil(err) + err = infosync.CheckTiKVVersion(storage, *semver.New(versioninfo.TiKVMinVersion)) + terror.MustNil(err) // Bootstrap a session to load information schema. dom, err := session.BootstrapSession(storage) terror.MustNil(err) @@ -610,8 +614,6 @@ func setGlobalVars() { planReplayerGCLease := parseDuration(cfg.Performance.PlanReplayerGCLease) session.SetPlanReplayerGCLease(planReplayerGCLease) bindinfo.Lease = parseDuration(cfg.Performance.BindInfoLease) - statistics.FeedbackProbability.Store(cfg.Performance.FeedbackProbability) - statistics.MaxQueryFeedbackCount.Store(int64(cfg.Performance.QueryFeedbackLimit)) statistics.RatioOfPseudoEstimate.Store(cfg.Performance.PseudoEstimateRatio) ddl.RunWorker = cfg.RunDDL if cfg.SplitTable { diff --git a/tools/check/ut.go b/tools/check/ut.go index 45b969360d245..abef09e5b155d 100644 --- a/tools/check/ut.go +++ b/tools/check/ut.go @@ -20,10 +20,12 @@ import ( "encoding/xml" "fmt" "io" + "log" "math/rand" "os" "os/exec" "path" + "path/filepath" "regexp" "runtime" "sort" @@ -97,7 +99,7 @@ var workDir string func cmdList(args ...string) bool { pkgs, err := listPackages() if err != nil { - fmt.Println("list package error", err) + log.Println("list package error", err) return false } @@ -120,12 +122,12 @@ func cmdList(args ...string) bool { err := buildTestBinary(pkg) if err != nil { - fmt.Println("build package error", pkg, err) + log.Println("build package error", pkg, err) return false } exist, err := testBinaryExist(pkg) if err != nil { - fmt.Println("check test binary existence error", err) + log.Println("check test binary existence error", err) return false } if !exist { @@ -135,7 +137,7 @@ func cmdList(args ...string) bool { res, err := listTestCases(pkg, nil) if err != nil { - fmt.Println("list test cases for package error", err) + log.Println("list test cases for package error", err) return false } @@ -157,7 +159,7 @@ func cmdList(args ...string) bool { func cmdBuild(args ...string) bool { pkgs, err := listPackages() if err != nil { - fmt.Println("list package error", err) + log.Println("list package error", err) return false } @@ -165,7 +167,7 @@ func cmdBuild(args ...string) bool { if len(args) == 0 { err := buildTestBinaryMulti(pkgs) if err != nil { - fmt.Println("build package error", pkgs, err) + log.Println("build package error", pkgs, err) return false } return true @@ -176,7 +178,7 @@ func cmdBuild(args ...string) bool { pkg := args[0] err := buildTestBinary(pkg) if err != nil { - fmt.Println("build package error", pkg, err) + log.Println("build package error", pkg, err) return false } } @@ -196,14 +198,14 @@ func cmdRun(args ...string) bool { if len(args) == 0 { err := buildTestBinaryMulti(pkgs) if err != nil { - fmt.Println("build package error", pkgs, err) + log.Println("build package error", pkgs, err) return false } for _, pkg := range pkgs { exist, err := testBinaryExist(pkg) if err != nil { - fmt.Println("check test binary existence error", err) + log.Println("check test binary existence error", err) return false } if !exist { @@ -213,7 +215,7 @@ func cmdRun(args ...string) bool { tasks, err = listTestCases(pkg, tasks) if err != nil { - fmt.Println("list test cases error", err) + log.Println("list test cases error", err) return false } } @@ -224,12 +226,12 @@ func cmdRun(args ...string) bool { pkg := args[0] err := buildTestBinary(pkg) if err != nil { - fmt.Println("build package error", pkg, err) + log.Println("build package error", pkg, err) return false } exist, err := testBinaryExist(pkg) if err != nil { - fmt.Println("check test binary existence error", err) + log.Println("check test binary existence error", err) return false } @@ -239,7 +241,7 @@ func cmdRun(args ...string) bool { } tasks, err = listTestCases(pkg, tasks) if err != nil { - fmt.Println("list test cases error", err) + log.Println("list test cases error", err) return false } } @@ -249,12 +251,12 @@ func cmdRun(args ...string) bool { pkg := args[0] err := buildTestBinary(pkg) if err != nil { - fmt.Println("build package error", pkg, err) + log.Println("build package error", pkg, err) return false } exist, err := testBinaryExist(pkg) if err != nil { - fmt.Println("check test binary existence error", err) + log.Println("check test binary existence error", err) return false } if !exist { @@ -264,12 +266,12 @@ func cmdRun(args ...string) bool { tasks, err = listTestCases(pkg, tasks) if err != nil { - fmt.Println("list test cases error", err) + log.Println("list test cases error", err) return false } tasks, err = filterTestCases(tasks, args[1]) if err != nil { - fmt.Println("filter test cases error", err) + log.Println("filter test cases error", err) return false } } @@ -277,7 +279,7 @@ func cmdRun(args ...string) bool { if except != "" { list, err := parseCaseListFromFile(except) if err != nil { - fmt.Println("parse --except file error", err) + log.Println("parse --except file error", err) return false } tmp := tasks[:0] @@ -292,7 +294,7 @@ func cmdRun(args ...string) bool { if only != "" { list, err := parseCaseListFromFile(only) if err != nil { - fmt.Println("parse --only file error", err) + log.Println("parse --only file error", err) return false } tmp := tasks[:0] @@ -349,7 +351,7 @@ func cmdRun(args ...string) bool { } func parseCaseListFromFile(fileName string) (map[string]struct{}, error) { - f, err := os.Open(fileName) + f, err := os.Open(filepath.Clean(fileName)) if err != nil { return nil, withTrace(err) } @@ -624,7 +626,7 @@ func (b blocksByStart) Less(i, j int) bool { func listTestCases(pkg string, tasks []task) ([]task, error) { newCases, err := listNewTestCases(pkg) if err != nil { - fmt.Println("list test case error", pkg, err) + log.Println("list test case error", pkg, err) return nil, withTrace(err) } for _, c := range newCases { @@ -818,6 +820,7 @@ func (n *numa) testCommand(pkg string, fn string) *exec.Cmd { // session.test -test.run TestClusteredPrefixColum args = append(args, "-test.run", "^"+fn+"$") + return exec.Command(exe, args...) } diff --git a/tools/check/xprog.go b/tools/check/xprog.go index 23b8ebffe141e..e31bd0d52f354 100644 --- a/tools/check/xprog.go +++ b/tools/check/xprog.go @@ -34,7 +34,7 @@ func main() { cwd := os.Args[0] cwd = cwd[:len(cwd)-len("tools/bin/xprog")] - testBinaryPath := os.Args[1] + testBinaryPath := filepath.Clean(os.Args[1]) dir, _ := filepath.Split(testBinaryPath) // Extract the package info from /tmp/go-build2662369829/b1382/importcfg.link @@ -51,7 +51,7 @@ func main() { _, file := filepath.Split(pkg) // The path of the destination file looks like $CWD/util/topsql/topsql.test.bin - newName := filepath.Join(cwd, pkg, file+".test.bin") + newName := filepath.Clean(filepath.Join(cwd, pkg, file+".test.bin")) if err1 := os.Rename(testBinaryPath, newName); err1 != nil { // Rename fail, handle error like "invalid cross-device linkcd tools/check" @@ -64,7 +64,7 @@ func main() { func getPackageInfo(dir string) string { // Read the /tmp/go-build2662369829/b1382/importcfg.link file to get the package information - f, err := os.Open(filepath.Join(dir, "importcfg.link")) + f, err := os.Open(filepath.Join(filepath.Clean(dir), "importcfg.link")) if err != nil { os.Exit(-1) } @@ -84,6 +84,9 @@ func getPackageInfo(dir string) string { } func MoveFile(sourcePath, destPath string) error { + filepath.Clean(sourcePath) + filepath.Clean(destPath) + inputFile, err := os.Open(sourcePath) if err != nil { return fmt.Errorf("Couldn't open source file: %s", err) diff --git a/types/BUILD.bazel b/types/BUILD.bazel index cbe5865ec3c5d..f93db510cf800 100644 --- a/types/BUILD.bazel +++ b/types/BUILD.bazel @@ -52,6 +52,7 @@ go_library( go_test( name = "types_test", + timeout = "short", srcs = [ "benchmark_test.go", "binary_literal_test.go", diff --git a/types/binary_literal.go b/types/binary_literal.go index 93a0d59d4e873..3453c57e07760 100644 --- a/types/binary_literal.go +++ b/types/binary_literal.go @@ -147,11 +147,11 @@ func ParseBitStr(s string) (BinaryLiteral, error) { if s[0] == 'b' || s[0] == 'B' { // format is b'val' or B'val' s = strings.Trim(s[1:], "'") - } else if strings.HasPrefix(s, "0b") { - s = s[2:] - } else { + } else if !strings.HasPrefix(s, "0b") { // here means format is not b'val', B'val' or 0bval. return nil, errors.Errorf("invalid bit type format %s", s) + } else { + s = s[2:] } if len(s) == 0 { @@ -202,11 +202,11 @@ func ParseHexStr(s string) (BinaryLiteral, error) { if len(s)%2 != 0 { return nil, errors.Errorf("invalid hexadecimal format, must even numbers, but %d", len(s)) } - } else if strings.HasPrefix(s, "0x") { - s = s[2:] - } else { + } else if !strings.HasPrefix(s, "0x") { // here means format is not x'val', X'val' or 0xval. return nil, errors.Errorf("invalid hexadecimal format %s", s) + } else { + s = s[2:] } if len(s) == 0 { diff --git a/types/core_time.go b/types/core_time.go index 64820f98aaf79..59509059a30bb 100644 --- a/types/core_time.go +++ b/types/core_time.go @@ -142,7 +142,7 @@ func (t CoreTime) Weekday() gotime.Weekday { } // YearWeek returns year and week. -func (t CoreTime) YearWeek(mode int) (int, int) { +func (t CoreTime) YearWeek(mode int) (year int, week int) { behavior := weekMode(mode) | weekBehaviourYear return calcWeek(t, behavior) } diff --git a/types/datum.go b/types/datum.go index 1ad86c770a01b..1e28893318077 100644 --- a/types/datum.go +++ b/types/datum.go @@ -184,6 +184,12 @@ func (d *Datum) SetFloat32(f float32) { d.i = int64(math.Float64bits(float64(f))) } +// SetFloat32FromF64 sets float32 values from f64 +func (d *Datum) SetFloat32FromF64(f float64) { + d.k = KindFloat32 + d.i = int64(math.Float64bits(f)) +} + // GetString gets string value. func (d *Datum) GetString() string { return string(hack.String(d.b)) @@ -849,7 +855,7 @@ func (d *Datum) compareMysqlSet(sc *stmtctx.StatementContext, set Set, comparer } } -func (d *Datum) compareMysqlJSON(sc *stmtctx.StatementContext, target json.BinaryJSON) (int, error) { +func (d *Datum) compareMysqlJSON(_ *stmtctx.StatementContext, target json.BinaryJSON) (int, error) { origin, err := d.ToMysqlJSON() if err != nil { return 0, errors.Trace(err) @@ -1086,8 +1092,10 @@ func ProduceStrWithSpecifiedTp(s string, tp *FieldType, sc *stmtctx.StatementCon r, size = utf8.DecodeLastRuneInString(tempStr) if r == utf8.RuneError && size == 0 { // Empty string + continue } else if r == utf8.RuneError && size == 1 { // Invalid string + continue } else { // Get the truncate position break @@ -1118,7 +1126,6 @@ func ProduceStrWithSpecifiedTp(s string, tp *FieldType, sc *stmtctx.StatementCon s = truncateStr(s, truncateLen) } } - } else if len(s) > flen { characterLen = len(s) overflowed = s[flen:] @@ -1659,7 +1666,7 @@ func (d *Datum) convertToMysqlSet(sc *stmtctx.StatementContext, target *FieldTyp return ret, err } -func (d *Datum) convertToMysqlJSON(sc *stmtctx.StatementContext, target *FieldType) (ret Datum, err error) { +func (d *Datum) convertToMysqlJSON(_ *stmtctx.StatementContext, _ *FieldType) (ret Datum, err error) { switch d.k { case KindString, KindBytes: var j json.BinaryJSON @@ -1796,8 +1803,7 @@ func (d *Datum) ToDecimal(sc *stmtctx.StatementContext) (*MyDecimal, error) { // ToInt64 converts to a int64. func (d *Datum) ToInt64(sc *stmtctx.StatementContext) (int64, error) { - switch d.Kind() { - case KindMysqlBit: + if d.Kind() == KindMysqlBit { uintVal, err := d.GetBinaryLiteral().ToInt(sc) return int64(uintVal), err } @@ -2037,7 +2043,7 @@ func (d *Datum) MarshalJSON() ([]byte, error) { jd.MyDecimal = d.GetMysqlDecimal() default: if d.x != nil { - return nil, errors.New(fmt.Sprintf("unsupported type: %d", d.k)) + return nil, fmt.Errorf("unsupported type: %d", d.k) } } return gjson.Marshal(jd) diff --git a/types/datum_eval.go b/types/datum_eval.go index 7b6c7e568c9c5..126d13b2ed321 100644 --- a/types/datum_eval.go +++ b/types/datum_eval.go @@ -46,15 +46,13 @@ func ComputePlus(a, b Datum) (d Datum, err error) { return d, errors.Trace(err1) } case KindFloat64: - switch b.Kind() { - case KindFloat64: + if b.Kind() == KindFloat64 { r := a.GetFloat64() + b.GetFloat64() d.SetFloat64(r) return d, nil } case KindMysqlDecimal: - switch b.Kind() { - case KindMysqlDecimal: + if b.Kind() == KindMysqlDecimal { r := new(MyDecimal) err = DecimalAdd(a.GetMysqlDecimal(), b.GetMysqlDecimal(), r) d.SetMysqlDecimal(r) diff --git a/types/etc.go b/types/etc.go index c1cfb1aa0877f..4aa5576cfec25 100644 --- a/types/etc.go +++ b/types/etc.go @@ -66,6 +66,11 @@ func IsTypeTime(tp byte) bool { return tp == mysql.TypeDatetime || tp == mysql.TypeDate || tp == mysql.TypeTimestamp } +// IsTypeFloat indicates whether the type is TypeFloat +func IsTypeFloat(tp byte) bool { + return tp == mysql.TypeFloat +} + // IsTypeInteger returns a boolean indicating whether the tp is integer type. func IsTypeInteger(tp byte) bool { switch tp { diff --git a/types/explain_format.go b/types/explain_format.go index 6c8ef6f72d546..2599f7bb046ed 100644 --- a/types/explain_format.go +++ b/types/explain_format.go @@ -31,6 +31,8 @@ var ( ExplainFormatTraditional = "traditional" // ExplainFormatTrueCardCost indicates the optimizer to use true cardinality to calculate the cost. ExplainFormatTrueCardCost = "true_card_cost" + // ExplainFormatBinary prints the proto for binary plan. + ExplainFormatBinary = "binary" // ExplainFormats stores the valid formats for explain statement, used by validator. ExplainFormats = []string{ @@ -42,5 +44,6 @@ var ( ExplainFormatVerbose, ExplainFormatTraditional, ExplainFormatTrueCardCost, + ExplainFormatBinary, } ) diff --git a/types/field_type.go b/types/field_type.go index d7cfe3030ed56..f512642932b29 100644 --- a/types/field_type.go +++ b/types/field_type.go @@ -332,7 +332,7 @@ func DefaultTypeForValue(value interface{}, tp *FieldType, char string, collate } // DefaultCharsetForType returns the default charset/collation for mysql type. -func DefaultCharsetForType(tp byte) (string, string) { +func DefaultCharsetForType(tp byte) (defaultCharset string, defaultCollation string) { switch tp { case mysql.TypeVarString, mysql.TypeString, mysql.TypeVarchar: // Default charset for string types is utf8mb4. diff --git a/types/json/BUILD.bazel b/types/json/BUILD.bazel index f125a1a35c0ad..9c54ab586b6ad 100644 --- a/types/json/BUILD.bazel +++ b/types/json/BUILD.bazel @@ -24,6 +24,7 @@ go_library( go_test( name = "json_test", + timeout = "short", srcs = [ "binary_functions_test.go", "binary_test.go", diff --git a/types/json/binary.go b/types/json/binary.go index f21c1cb70cbf7..e13b12086d3b3 100644 --- a/types/json/binary.go +++ b/types/json/binary.go @@ -615,8 +615,7 @@ func appendBinaryValElem(buf []byte, docOff, valEntryOff int, val interface{}) ( if err != nil { return nil, errors.Trace(err) } - switch typeCode { - case TypeCodeLiteral: + if typeCode == TypeCodeLiteral { litCode := buf[elemDocOff] buf = buf[:elemDocOff] buf[valEntryOff] = TypeCodeLiteral diff --git a/types/json/binary_functions.go b/types/json/binary_functions.go index dc24bdaed4312..3d374c81fcecc 100644 --- a/types/json/binary_functions.go +++ b/types/json/binary_functions.go @@ -1103,7 +1103,6 @@ func (bj BinaryJSON) Search(containType string, search string, escape byte, path default: return CreateBinary(result), false, nil } - } // extractCallbackFn the type of CALLBACK function for extractToCallback diff --git a/types/mydecimal.go b/types/mydecimal.go index 0e2ca156a8bc4..81a7714288410 100644 --- a/types/mydecimal.go +++ b/types/mydecimal.go @@ -124,19 +124,20 @@ func zeroMyDecimalWithFrac(frac int8) MyDecimal { } // add adds a and b and carry, returns the sum and new carry. -func add(a, b, carry int32) (int32, int32) { - sum := a + b + carry +func add(a, b, carry int32) (sum int32, newCarry int32) { + sum = a + b + carry if sum >= wordBase { - carry = 1 + newCarry = 1 sum -= wordBase } else { - carry = 0 + newCarry = 0 } - return sum, carry + return sum, newCarry } // add2 adds a and b and carry, returns the sum and new carry. // It is only used in DecimalMul. +//nolint: revive func add2(a, b, carry int32) (int32, int32) { sum := int64(a) + int64(b) + int64(carry) if sum >= wordBase { @@ -154,32 +155,32 @@ func add2(a, b, carry int32) (int32, int32) { } // sub subtracts b and carry from a, returns the diff and new carry. -func sub(a, b, carry int32) (int32, int32) { - diff := a - b - carry +func sub(a, b, carry int32) (diff int32, newCarry int32) { + diff = a - b - carry if diff < 0 { - carry = 1 + newCarry = 1 diff += wordBase } else { - carry = 0 + newCarry = 0 } - return diff, carry + return diff, newCarry } // sub2 subtracts b and carry from a, returns the diff and new carry. // the new carry may be 2. -func sub2(a, b, carry int32) (int32, int32) { - diff := a - b - carry +func sub2(a, b, carry int32) (diff int32, newCarray int32) { + diff = a - b - carry if diff < 0 { - carry = 1 + newCarray = 1 diff += wordBase } else { - carry = 0 + newCarray = 0 } if diff < 0 { diff += wordBase - carry++ + newCarray++ } - return diff, carry + return diff, newCarray } // fixWordCntError limits word count in wordBufLen, and returns overflow or truncate error. @@ -1685,15 +1686,14 @@ func doSub(from1, from2, to *MyDecimal) (cmp int, err error) { carry = 0 } } else { - if idx2 <= end2 { - carry = 1 - } else { + if idx2 > end2 { if to == nil { return 0, nil } *to = zeroMyDecimalWithFrac(to.resultFrac) return 0, nil } + carry = 1 } } diff --git a/types/parser_driver/BUILD.bazel b/types/parser_driver/BUILD.bazel index 4cb8767c3e94b..478866d428e59 100644 --- a/types/parser_driver/BUILD.bazel +++ b/types/parser_driver/BUILD.bazel @@ -17,6 +17,7 @@ go_library( go_test( name = "parser_driver_test", + timeout = "short", srcs = [ "main_test.go", "value_expr_test.go", diff --git a/types/parser_driver/value_expr.go b/types/parser_driver/value_expr.go index e2490783fc329..e588548fcd589 100644 --- a/types/parser_driver/value_expr.go +++ b/types/parser_driver/value_expr.go @@ -227,7 +227,7 @@ type ParamMarkerExpr struct { } // Restore implements Node interface. -func (n *ParamMarkerExpr) Restore(ctx *format.RestoreCtx) error { +func (*ParamMarkerExpr) Restore(ctx *format.RestoreCtx) error { ctx.WritePlain("?") return nil } @@ -239,7 +239,7 @@ func newParamMarkerExpr(offset int) ast.ParamMarkerExpr { } // Format the ExprNode into a Writer. -func (n *ParamMarkerExpr) Format(w io.Writer) { +func (*ParamMarkerExpr) Format(_ io.Writer) { panic("Not implemented") } diff --git a/types/time.go b/types/time.go index 14c647f945788..c3608ee219a1c 100644 --- a/types/time.go +++ b/types/time.go @@ -919,6 +919,7 @@ func splitDateTime(format string) (seps []string, fracStr string, hasTZ bool, tz hasTZ = true for ; tzIndex > 0 && isPunctuation(format[tzIndex-1]); tzIndex-- { // In case of multiple separators, e.g. 2020-10--10 + continue } format = format[:tzIndex] } @@ -933,6 +934,7 @@ func splitDateTime(format string) (seps []string, fracStr string, hasTZ bool, tz fracStr = format[fracIndex+1 : fracEnd] for ; fracIndex > 0 && isPunctuation(format[fracIndex-1]); fracIndex-- { // In case of multiple separators, e.g. 2020-10..10 + continue } format = format[:fracIndex] } @@ -1091,9 +1093,7 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo // We must handle float => string => datetime, the difference is that fractional // part of float type is discarded directly, while fractional part of string type // is parsed to HH:MM:SS. - if isFloat { - // 20170118.123423 => 2017-01-18 00:00:00 - } else { + if !isFloat { // '20170118.123423' => 2017-01-18 12:34:23.234 switch len(fracStr) { case 0: @@ -1106,6 +1106,7 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo } truncatedOrIncorrect = err != nil } + // 20170118.123423 => 2017-01-18 00:00:00 } if l == 9 || l == 10 { if len(fracStr) == 0 { @@ -1153,11 +1154,10 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int, isFloat bo // we should adjust it. // TODO: adjust year is very complex, now we only consider the simplest way. if len(seps[0]) <= 2 && !isFloat { - if year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0 && fracStr == "" { - // Skip a special case "00-00-00". - } else { + if !(year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0 && fracStr == "") { year = adjustYear(year) } + // Skip a special case "00-00-00". } var microsecond int @@ -1242,11 +1242,9 @@ func ParseYear(str string) (int16, error) { } y := int16(v) - if len(str) == 4 { - // Nothing to do. - } else if len(str) == 2 || len(str) == 1 { + if len(str) == 2 || len(str) == 1 { y = int16(adjustYear(int(y))) - } else { + } else if len(str) != 4 { return 0, errors.Trace(ErrInvalidYearFormat) } @@ -1489,6 +1487,17 @@ func (d Duration) ConvertToTime(sc *stmtctx.StatementContext, tp uint8) (Time, e return t.Convert(sc, tp) } +// ConvertToTimeWithTimestamp converts duration to Time by system timestamp. +// Tp is TypeDatetime, TypeTimestamp and TypeDate. +func (d Duration) ConvertToTimeWithTimestamp(sc *stmtctx.StatementContext, tp uint8, ts gotime.Time) (Time, error) { + year, month, day := ts.In(sc.TimeZone).Date() + datePart := FromDate(year, int(month), day, 0, 0, 0, 0) + mixDateAndDuration(&datePart, d) + + t := NewTime(datePart, mysql.TypeDatetime, d.Fsp) + return t.Convert(sc, tp) +} + // RoundFrac rounds fractional seconds precision with new fsp and returns a new one. // We will use the “round half up” rule, e.g, >= 0.5 -> 1, < 0.5 -> 0, // so 10:10:10.999999 round 0 -> 10:10:11 @@ -1817,22 +1826,22 @@ func TruncateOverflowMySQLTime(d gotime.Duration) (gotime.Duration, error) { return d, nil } -func splitDuration(t gotime.Duration) (int, int, int, int, int) { - sign := 1 +func splitDuration(t gotime.Duration) (sign int, hours int, minutes int, seconds int, fraction int) { + sign = 1 if t < 0 { t = -t sign = -1 } - hours := t / gotime.Hour - t -= hours * gotime.Hour //nolint:durationcheck - minutes := t / gotime.Minute - t -= minutes * gotime.Minute //nolint:durationcheck - seconds := t / gotime.Second - t -= seconds * gotime.Second //nolint:durationcheck - fraction := t / gotime.Microsecond + hoursDuration := t / gotime.Hour + t -= hoursDuration * gotime.Hour //nolint:durationcheck + minutesDuration := t / gotime.Minute + t -= minutesDuration * gotime.Minute //nolint:durationcheck + secondsDuration := t / gotime.Second + t -= secondsDuration * gotime.Second //nolint:durationcheck + fractionDuration := t / gotime.Microsecond - return sign, int(hours), int(minutes), int(seconds), int(fraction) + return sign, int(hoursDuration), int(minutesDuration), int(secondsDuration), int(fractionDuration) } var maxDaysInMonth = []int{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} @@ -1998,7 +2007,7 @@ func ParseDate(sc *stmtctx.StatementContext, str string) (Time, error) { // ParseTimeFromYear parse a `YYYY` formed year to corresponded Datetime type. // Note: the invoker must promise the `year` is in the range [MinYear, MaxYear]. -func ParseTimeFromYear(sc *stmtctx.StatementContext, year int64) (Time, error) { +func ParseTimeFromYear(_ *stmtctx.StatementContext, year int64) (Time, error) { if year == 0 { return NewTime(ZeroCoreTime, mysql.TypeDate, DefaultFsp), nil } @@ -2263,7 +2272,7 @@ func ExtractDurationNum(d *Duration, unit string) (res int64, err error) { // parseSingleTimeValue parse the format according the given unit. If we set strictCheck true, we'll check whether // the converted value not exceed the range of MySQL's TIME type. // The returned values are year, month, day, nanosecond and fsp. -func parseSingleTimeValue(unit string, format string, strictCheck bool) (int64, int64, int64, int64, int, error) { +func parseSingleTimeValue(unit string, format string, strictCheck bool) (year int64, month int64, day int64, nanosecond int64, fsp int, err error) { // Format is a preformatted number, it format should be A[.[B]]. decimalPointPos := strings.IndexRune(format, '.') if decimalPointPos == -1 { @@ -2367,10 +2376,10 @@ func parseSingleTimeValue(unit string, format string, strictCheck bool) (int64, // nanosecond will not exceed length of single day // MySQL permits any punctuation delimiter in the expr format. // See https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-intervals -func parseTimeValue(format string, index, cnt int) (int64, int64, int64, int64, int, error) { +func parseTimeValue(format string, index, cnt int) (years int64, months int64, days int64, nanoseconds int64, fsp int, err error) { neg := false originalFmt := format - fsp := map[bool]int{true: MaxFsp, false: MinFsp}[index == MicrosecondIndex] + fsp = map[bool]int{true: MaxFsp, false: MinFsp}[index == MicrosecondIndex] format = strings.TrimSpace(format) if len(format) > 0 && format[0] == '-' { neg = true @@ -2393,15 +2402,15 @@ func parseTimeValue(format string, index, cnt int) (int64, int64, int64, int64, index-- } - years, err := strconv.ParseInt(fields[YearIndex], 10, 64) + years, err = strconv.ParseInt(fields[YearIndex], 10, 64) if err != nil { return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - months, err := strconv.ParseInt(fields[MonthIndex], 10, 64) + months, err = strconv.ParseInt(fields[MonthIndex], 10, 64) if err != nil { return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } - days, err := strconv.ParseInt(fields[DayIndex], 10, 64) + days, err = strconv.ParseInt(fields[DayIndex], 10, 64) if err != nil { return 0, 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, originalFmt) } @@ -2742,18 +2751,18 @@ func (t Time) convertDateFormat(b rune, buf *bytes.Buffer) error { case 'k': buf.WriteString(strconv.FormatInt(int64(t.Hour()), 10)) case 'h', 'I': - t := t.Hour() - if t%12 == 0 { + tt := t.Hour() + if tt%12 == 0 { buf.WriteString("12") } else { - buf.WriteString(FormatIntWidthN(t%12, 2)) + buf.WriteString(FormatIntWidthN(tt%12, 2)) } case 'l': - t := t.Hour() - if t%12 == 0 { + tt := t.Hour() + if tt%12 == 0 { buf.WriteString("12") } else { - buf.WriteString(strconv.FormatInt(int64(t%12), 10)) + buf.WriteString(strconv.FormatInt(int64(tt%12), 10)) } case 'i': buf.WriteString(FormatIntWidthN(t.Minute(), 2)) @@ -3085,20 +3094,20 @@ func matchDateWithToken(t *CoreTime, date string, token string, ctx map[string]i // Try to parse digits with number of `limit` starting from `input` // Return if success. // Return <_, 0> if fail. -func parseNDigits(input string, limit int) (int, int) { +func parseNDigits(input string, limit int) (number int, step int) { if limit <= 0 { return 0, 0 } var num uint64 = 0 - var step = 0 + step = 0 for ; step < len(input) && step < limit && '0' <= input[step] && input[step] <= '9'; step++ { num = num*10 + uint64(input[step]-'0') } return int(num), step } -func secondsNumeric(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func secondsNumeric(t *CoreTime, input string, _ map[string]int) (string, bool) { v, step := parseNDigits(input, 2) if step <= 0 || v >= 60 { return input, false @@ -3107,7 +3116,7 @@ func secondsNumeric(t *CoreTime, input string, ctx map[string]int) (string, bool return input[step:], true } -func minutesNumeric(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func minutesNumeric(t *CoreTime, input string, _ map[string]int) (string, bool) { v, step := parseNDigits(input, 2) if step <= 0 || v >= 60 { return input, false @@ -3138,7 +3147,7 @@ func parseSep(input string) (string, parseState) { return input, parseStateNormal } -func time12Hour(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func time12Hour(t *CoreTime, input string, _ map[string]int) (string, bool) { tryParse := func(input string) (string, parseState) { // hh:mm:ss AM /// Note that we should update `t` as soon as possible, or we @@ -3206,7 +3215,7 @@ func time12Hour(t *CoreTime, input string, ctx map[string]int) (string, bool) { return remain, true } -func time24Hour(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func time24Hour(t *CoreTime, input string, _ map[string]int) (string, bool) { tryParse := func(input string) (string, parseState) { // hh:mm:ss /// Note that we should update `t` as soon as possible, or we @@ -3255,7 +3264,7 @@ const ( constForPM ) -func isAMOrPM(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func isAMOrPM(_ *CoreTime, input string, ctx map[string]int) (string, bool) { if len(input) < 2 { return input, false } @@ -3278,7 +3287,7 @@ var oneToSixDigitRegex = regexp.MustCompile("^[0-9]{0,6}") // numericRegex: it was for any numeric characters var numericRegex = regexp.MustCompile("[0-9]+") -func dayOfMonthNumeric(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func dayOfMonthNumeric(t *CoreTime, input string, _ map[string]int) (string, bool) { v, step := parseNDigits(input, 2) // 0..31 if step <= 0 || v > 31 { return input, false @@ -3307,7 +3316,7 @@ func hour12Numeric(t *CoreTime, input string, ctx map[string]int) (string, bool) return input[step:], true } -func microSeconds(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func microSeconds(t *CoreTime, input string, _ map[string]int) (string, bool) { v, step := parseNDigits(input, 6) if step <= 0 { t.setMicrosecond(0) @@ -3328,7 +3337,7 @@ func yearNumericTwoDigits(t *CoreTime, input string, ctx map[string]int) (string return yearNumericNDigits(t, input, ctx, 2) } -func yearNumericNDigits(t *CoreTime, input string, ctx map[string]int, n int) (string, bool) { +func yearNumericNDigits(t *CoreTime, input string, _ map[string]int, n int) (string, bool) { year, step := parseNDigits(input, n) if step <= 0 { return input, false @@ -3339,7 +3348,7 @@ func yearNumericNDigits(t *CoreTime, input string, ctx map[string]int, n int) (s return input[step:], true } -func dayOfYearNumeric(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func dayOfYearNumeric(_ *CoreTime, input string, ctx map[string]int) (string, bool) { // MySQL declares that "%j" should be "Day of year (001..366)". But actually, // it accepts a number that is up to three digits, which range is [1, 999]. v, step := parseNDigits(input, 3) @@ -3350,7 +3359,7 @@ func dayOfYearNumeric(t *CoreTime, input string, ctx map[string]int) (string, bo return input[step:], true } -func abbreviatedMonth(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func abbreviatedMonth(t *CoreTime, input string, _ map[string]int) (string, bool) { if len(input) >= 3 { monthName := strings.ToLower(input[:3]) if month, ok := monthAbbrev[monthName]; ok { @@ -3368,7 +3377,7 @@ func hasCaseInsensitivePrefix(input, prefix string) bool { return strings.EqualFold(input[:len(prefix)], prefix) } -func fullNameMonth(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func fullNameMonth(t *CoreTime, input string, _ map[string]int) (string, bool) { for i, month := range MonthNames { if hasCaseInsensitivePrefix(input, month) { t.setMonth(uint8(i + 1)) @@ -3378,7 +3387,7 @@ func fullNameMonth(t *CoreTime, input string, ctx map[string]int) (string, bool) return input, false } -func monthNumeric(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func monthNumeric(t *CoreTime, input string, _ map[string]int) (string, bool) { v, step := parseNDigits(input, 2) // 1..12 if step <= 0 || v > 12 { return input, false @@ -3443,7 +3452,7 @@ func DateTimeIsOverflow(sc *stmtctx.StatementContext, date Time) (bool, error) { return !inRange, nil } -func skipAllNums(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func skipAllNums(_ *CoreTime, input string, _ map[string]int) (string, bool) { retIdx := 0 for i, ch := range input { if unicode.IsNumber(ch) { @@ -3455,7 +3464,7 @@ func skipAllNums(t *CoreTime, input string, ctx map[string]int) (string, bool) { return input[retIdx:], true } -func skipAllPunct(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func skipAllPunct(_ *CoreTime, input string, _ map[string]int) (string, bool) { retIdx := 0 for i, ch := range input { if unicode.IsPunct(ch) { @@ -3467,7 +3476,7 @@ func skipAllPunct(t *CoreTime, input string, ctx map[string]int) (string, bool) return input[retIdx:], true } -func skipAllAlpha(t *CoreTime, input string, ctx map[string]int) (string, bool) { +func skipAllAlpha(_ *CoreTime, input string, _ map[string]int) (string, bool) { retIdx := 0 for i, ch := range input { if unicode.IsLetter(ch) { diff --git a/util/BUILD.bazel b/util/BUILD.bazel index 00ae97bd39a22..6618ff6c0cc61 100644 --- a/util/BUILD.bazel +++ b/util/BUILD.bazel @@ -49,6 +49,7 @@ go_library( go_test( name = "util_test", + timeout = "short", srcs = [ "errors_test.go", "main_test.go", diff --git a/util/arena/arena.go b/util/arena/arena.go index 62f83098ad922..07ef575e8748d 100644 --- a/util/arena/arena.go +++ b/util/arena/arena.go @@ -37,16 +37,15 @@ type SimpleAllocator struct { type stdAllocator struct { } -func (a *stdAllocator) Alloc(capacity int) []byte { +func (*stdAllocator) Alloc(capacity int) []byte { return make([]byte, 0, capacity) } -func (a *stdAllocator) AllocWithLen(length int, capacity int) []byte { +func (*stdAllocator) AllocWithLen(length int, capacity int) []byte { return make([]byte, length, capacity) } -func (a *stdAllocator) Reset() { -} +func (*stdAllocator) Reset() {} var _ Allocator = &stdAllocator{} diff --git a/util/benchdaily/BUILD.bazel b/util/benchdaily/BUILD.bazel index a9359576c0fe4..32f9582fdad3b 100644 --- a/util/benchdaily/BUILD.bazel +++ b/util/benchdaily/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "benchdaily_test", + timeout = "short", srcs = [ "bench_daily_test.go", "main_test.go", diff --git a/util/bitmap/BUILD.bazel b/util/bitmap/BUILD.bazel index 1a2544f8dcc91..db914e5520de8 100644 --- a/util/bitmap/BUILD.bazel +++ b/util/bitmap/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "bitmap_test", + timeout = "short", srcs = [ "concurrent_test.go", "main_test.go", diff --git a/util/checksum/BUILD.bazel b/util/checksum/BUILD.bazel index adf3565326f01..0bf8901725b76 100644 --- a/util/checksum/BUILD.bazel +++ b/util/checksum/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "checksum_test", + timeout = "short", srcs = [ "checksum_test.go", "main_test.go", diff --git a/util/chunk/BUILD.bazel b/util/chunk/BUILD.bazel index 948adc6666223..512a407edb8fb 100644 --- a/util/chunk/BUILD.bazel +++ b/util/chunk/BUILD.bazel @@ -40,6 +40,7 @@ go_library( go_test( name = "chunk_test", + timeout = "short", srcs = [ "alloc_test.go", "chunk_test.go", diff --git a/util/chunk/codec.go b/util/chunk/codec.go index d7c30faec11dc..01a90dd9dc007 100644 --- a/util/chunk/codec.go +++ b/util/chunk/codec.go @@ -48,7 +48,7 @@ func (c *Codec) Encode(chk *Chunk) []byte { return buffer } -func (c *Codec) encodeColumn(buffer []byte, col *Column) []byte { +func (*Codec) encodeColumn(buffer []byte, col *Column) []byte { var lenBuffer [4]byte // encode length. binary.LittleEndian.PutUint32(lenBuffer[:], uint32(col.length)) @@ -148,7 +148,7 @@ func (c *Codec) decodeColumn(buffer []byte, col *Column, ordinal int) (remained var allNotNullBitmap [128]byte -func (c *Codec) setAllNotNull(col *Column) { +func (*Codec) setAllNotNull(col *Column) { numNullBitmapBytes := (col.length + 7) / 8 col.nullBitmap = col.nullBitmap[:0] for i := 0; i < numNullBitmapBytes; { diff --git a/util/chunk/disk_test.go b/util/chunk/disk_test.go index fa82eef01024d..3b25b6de1c1eb 100644 --- a/util/chunk/disk_test.go +++ b/util/chunk/disk_test.go @@ -259,42 +259,84 @@ func testListInDisk(t *testing.T, concurrency int) { wg.Wait() } -func TestListInDiskWithChecksum(t *testing.T) { +func TestListInDiskWithChecksum1(t *testing.T) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodPlaintext }) - t.Run("testListInDisk", func(t *testing.T) { - testListInDisk(t, 1) + testListInDisk(t, 1) +} + +func TestListInDiskWithChecksum2(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodPlaintext }) - t.Run("testListInDisk", func(t *testing.T) { - testListInDisk(t, 2) + testListInDisk(t, 2) +} + +func TestListInDiskWithChecksum8(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodPlaintext }) - t.Run("testListInDisk", func(t *testing.T) { - testListInDisk(t, 8) + testListInDisk(t, 8) +} + +func TestListInDiskWithChecksumReaderWithCache(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodPlaintext }) + testReaderWithCache(t) +} - t.Run("testReaderWithCache", testReaderWithCache) - t.Run("testReaderWithCacheNoFlush", testReaderWithCacheNoFlush) +func TestListInDiskWithChecksumReaderWithCacheNoFlush(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodPlaintext + }) + testReaderWithCacheNoFlush(t) } -func TestListInDiskWithChecksumAndEncrypt(t *testing.T) { +func TestListInDiskWithChecksumAndEncrypt1(t *testing.T) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodAES128CTR }) - t.Run("testListInDisk", func(t *testing.T) { - testListInDisk(t, 1) + testListInDisk(t, 1) +} + +func TestListInDiskWithChecksumAndEncrypt2(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodAES128CTR }) - t.Run("testListInDisk", func(t *testing.T) { - testListInDisk(t, 2) + testListInDisk(t, 2) +} + +func TestListInDiskWithChecksumAndEncrypt8(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodAES128CTR }) - t.Run("testListInDisk", func(t *testing.T) { - testListInDisk(t, 8) + testListInDisk(t, 8) +} + +func TestListInDiskWithChecksumAndEncryptReaderWithCache(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodAES128CTR }) + testReaderWithCache(t) +} - t.Run("testReaderWithCache", testReaderWithCache) - t.Run("testReaderWithCacheNoFlush", testReaderWithCacheNoFlush) +func TestListInDiskWithChecksumAndEncryptReaderWithCacheNoFlush(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Security.SpilledFileEncryptionMethod = config.SpilledFileEncryptionMethodAES128CTR + }) + testReaderWithCacheNoFlush(t) } // Following diagram describes the testdata we use to test: diff --git a/util/chunk/iterator.go b/util/chunk/iterator.go index e62ef08212349..7928f748fc4b4 100644 --- a/util/chunk/iterator.go +++ b/util/chunk/iterator.go @@ -111,7 +111,7 @@ func (it *iterator4Slice) Current() Row { } // End implements the Iterator interface. -func (it *iterator4Slice) End() Row { +func (*iterator4Slice) End() Row { return Row{} } @@ -126,7 +126,7 @@ func (it *iterator4Slice) Len() int { } // Error returns none-nil error if anything wrong happens during the iteration. -func (it *iterator4Slice) Error() error { +func (*iterator4Slice) Error() error { return nil } @@ -172,7 +172,7 @@ func (it *Iterator4Chunk) Current() Row { } // End implements the Iterator interface. -func (it *Iterator4Chunk) End() Row { +func (*Iterator4Chunk) End() Row { return Row{} } @@ -192,7 +192,7 @@ func (it *Iterator4Chunk) GetChunk() *Chunk { } // Error returns none-nil error if anything wrong happens during the iteration. -func (it *Iterator4Chunk) Error() error { +func (*Iterator4Chunk) Error() error { return nil } @@ -254,7 +254,7 @@ func (it *iterator4List) Current() Row { } // End implements the Iterator interface. -func (it *iterator4List) End() Row { +func (*iterator4List) End() Row { return Row{} } @@ -269,7 +269,7 @@ func (it *iterator4List) Len() int { } // Error returns none-nil error if anything wrong happens during the iteration. -func (it *iterator4List) Error() error { +func (*iterator4List) Error() error { return nil } @@ -313,7 +313,7 @@ func (it *iterator4RowPtr) Current() Row { } // End implements the Iterator interface. -func (it *iterator4RowPtr) End() Row { +func (*iterator4RowPtr) End() Row { return Row{} } @@ -328,7 +328,7 @@ func (it *iterator4RowPtr) Len() int { } // Error returns none-nil error if anything wrong happens during the iteration. -func (it *iterator4RowPtr) Error() error { +func (*iterator4RowPtr) Error() error { return nil } @@ -388,7 +388,7 @@ func (it *iterator4RowContainer) Current() Row { } // End implements the Iterator interface. -func (it *iterator4RowContainer) End() Row { +func (*iterator4RowContainer) End() Row { return Row{} } @@ -475,7 +475,7 @@ func (it *multiIterator) Current() Row { } // End implements the Iterator interface. -func (it *multiIterator) End() Row { +func (*multiIterator) End() Row { return Row{} } diff --git a/util/chunk/row_container.go b/util/chunk/row_container.go index e80e8b7485b77..7b1506636fdba 100644 --- a/util/chunk/row_container.go +++ b/util/chunk/row_container.go @@ -129,10 +129,10 @@ func (c *RowContainer) SpillToDisk() { defer c.actionSpill.setStatus(spilledYet) } var err error - N := c.m.records.inMemory.NumChunks() + n := c.m.records.inMemory.NumChunks() c.m.records.inDisk = NewListInDisk(c.m.records.inMemory.FieldTypes()) c.m.records.inDisk.diskTracker.AttachTo(c.diskTracker) - for i := 0; i < N; i++ { + for i := 0; i < n; i++ { chk := c.m.records.inMemory.GetChunk(i) err = c.m.records.inDisk.Add(chk) if err != nil { @@ -405,10 +405,10 @@ func (a *SpillDiskAction) Reset() { } // SetLogHook sets the hook, it does nothing just to form the memory.ActionOnExceed interface. -func (a *SpillDiskAction) SetLogHook(hook func(uint64)) {} +func (*SpillDiskAction) SetLogHook(_ func(uint64)) {} // GetPriority get the priority of the Action. -func (a *SpillDiskAction) GetPriority() int64 { +func (*SpillDiskAction) GetPriority() int64 { return memory.DefSpillPriority } @@ -442,10 +442,10 @@ type SortedRowContainer struct { } // NewSortedRowContainer creates a new SortedRowContainer in memory. -func NewSortedRowContainer(fieldType []*types.FieldType, chunkSize int, ByItemsDesc []bool, +func NewSortedRowContainer(fieldType []*types.FieldType, chunkSize int, byItemsDesc []bool, keyColumns []int, keyCmpFuncs []CompareFunc) *SortedRowContainer { src := SortedRowContainer{RowContainer: NewRowContainer(fieldType, chunkSize), - ByItemsDesc: ByItemsDesc, keyColumns: keyColumns, keyCmpFuncs: keyCmpFuncs} + ByItemsDesc: byItemsDesc, keyColumns: keyColumns, keyCmpFuncs: keyCmpFuncs} src.memTracker = memory.NewTracker(memory.LabelForRowContainer, -1) src.RowContainer.GetMemTracker().AttachTo(src.GetMemTracker()) return &src @@ -601,7 +601,7 @@ func (a *SortAndSpillDiskAction) Action(t *memory.Tracker) { } // SetLogHook sets the hook, it does nothing just to form the memory.ActionOnExceed interface. -func (a *SortAndSpillDiskAction) SetLogHook(hook func(uint64)) {} +func (*SortAndSpillDiskAction) SetLogHook(_ func(uint64)) {} // WaitForTest waits all goroutine have gone. func (a *SortAndSpillDiskAction) WaitForTest() { diff --git a/util/codec/BUILD.bazel b/util/codec/BUILD.bazel index a7387f4ad7e4d..a365c15d18537 100644 --- a/util/codec/BUILD.bazel +++ b/util/codec/BUILD.bazel @@ -29,6 +29,7 @@ go_library( go_test( name = "codec_test", + timeout = "short", srcs = [ "bench_test.go", "bytes_test.go", diff --git a/util/codec/codec.go b/util/codec/codec.go index 7d6104ff592bc..d905809bca196 100644 --- a/util/codec/codec.go +++ b/util/codec/codec.go @@ -68,7 +68,7 @@ func preRealloc(b []byte, vals []types.Datum, comparable1 bool) []byte { case types.KindMysqlTime, types.KindMysqlDuration, types.KindFloat32, types.KindFloat64: size += 9 case types.KindNull, types.KindMinNotNull, types.KindMaxValue: - size += 1 + size++ case types.KindMysqlJSON: size += 2 + len(vals[i].GetBytes()) case types.KindMysqlDecimal: @@ -762,6 +762,8 @@ func DecodeRange(b []byte, size int, idxColumnTypes []byte, loc *time.Location) if types.IsTypeTime(idxColumnTypes[i]) { // handle datetime values specially since they are encoded to int and we'll get int values if using DecodeOne. b, d, err = DecodeAsDateTime(b, idxColumnTypes[i], loc) + } else if types.IsTypeFloat(idxColumnTypes[i]) { + b, d, err = DecodeAsFloat32(b, idxColumnTypes[i]) } else { b, d, err = DecodeOne(b) } @@ -899,6 +901,22 @@ func DecodeAsDateTime(b []byte, tp byte, loc *time.Location) (remain []byte, d t return b, d, nil } +// DecodeAsFloat32 decodes value for mysql.TypeFloat +func DecodeAsFloat32(b []byte, tp byte) (remain []byte, d types.Datum, err error) { + if len(b) < 1 || tp != mysql.TypeFloat { + return nil, d, errors.New("invalid encoded key") + } + flag := b[0] + b = b[1:] + if flag != floatFlag { + return b, d, errors.Errorf("invalid encoded key flag %v for DecodeAsFloat32", flag) + } + var v float64 + b, v, err = DecodeFloat(b) + d.SetFloat32FromF64(v) + return b, d, nil +} + // CutOne cuts the first encoded value from b. // It will return the first encoded item and the remains as byte slice. func CutOne(b []byte) (data []byte, remain []byte, err error) { @@ -1282,7 +1300,7 @@ func HashGroupKey(sc *stmtctx.StatementContext, n int, col *chunk.Column, buf [] } } default: - return nil, errors.New(fmt.Sprintf("invalid eval type %v", ft.EvalType())) + return nil, fmt.Errorf("invalid eval type %v", ft.EvalType()) } return buf, nil } diff --git a/util/collate/bin.go b/util/collate/bin.go index 8d620b351e446..2d8509c8e1a46 100644 --- a/util/collate/bin.go +++ b/util/collate/bin.go @@ -24,44 +24,44 @@ type binCollator struct { } // Compare implement Collator interface. -func (bc *binCollator) Compare(a, b string) int { +func (*binCollator) Compare(a, b string) int { return strings.Compare(a, b) } // Key implement Collator interface. -func (bc *binCollator) Key(str string) []byte { +func (*binCollator) Key(str string) []byte { return []byte(str) } // KeyWithoutTrimRightSpace implement Collator interface. -func (bc *binCollator) KeyWithoutTrimRightSpace(str string) []byte { +func (*binCollator) KeyWithoutTrimRightSpace(str string) []byte { return []byte(str) } // Pattern implements Collator interface. -func (bc *binCollator) Pattern() WildcardPattern { +func (*binCollator) Pattern() WildcardPattern { return &binPattern{} } type binPaddingCollator struct { } -func (bpc *binPaddingCollator) Compare(a, b string) int { +func (*binPaddingCollator) Compare(a, b string) int { return strings.Compare(truncateTailingSpace(a), truncateTailingSpace(b)) } -func (bpc *binPaddingCollator) Key(str string) []byte { +func (*binPaddingCollator) Key(str string) []byte { return []byte(truncateTailingSpace(str)) } // KeyWithoutTrimRightSpace implement Collator interface. -func (bpc *binPaddingCollator) KeyWithoutTrimRightSpace(str string) []byte { +func (*binPaddingCollator) KeyWithoutTrimRightSpace(str string) []byte { return []byte(str) } // Pattern implements Collator interface. // Notice that trailing spaces are significant. -func (bpc *binPaddingCollator) Pattern() WildcardPattern { +func (*binPaddingCollator) Pattern() WildcardPattern { return &binPattern{} } diff --git a/util/collate/collate.go b/util/collate/collate.go index 69d4c33fdeba1..f8489798c4239 100644 --- a/util/collate/collate.go +++ b/util/collate/collate.go @@ -116,11 +116,10 @@ func CompatibleCollate(collate1, collate2 string) bool { // When new collations are not enabled, collation id remains the same. func RewriteNewCollationIDIfNeeded(id int32) int32 { if atomic.LoadInt32(&newCollationEnabled) == 1 { - if id < 0 { - logutil.BgLogger().Warn("Unexpected negative collation ID for rewrite.", zap.Int32("ID", id)) - } else { + if id >= 0 { return -id } + logutil.BgLogger().Warn("Unexpected negative collation ID for rewrite.", zap.Int32("ID", id)) } return id } @@ -128,11 +127,10 @@ func RewriteNewCollationIDIfNeeded(id int32) int32 { // RestoreCollationIDIfNeeded restores a collation id if the new collations are enabled. func RestoreCollationIDIfNeeded(id int32) int32 { if atomic.LoadInt32(&newCollationEnabled) == 1 { - if id > 0 { - logutil.BgLogger().Warn("Unexpected positive collation ID for restore.", zap.Int32("ID", id)) - } else { + if id <= 0 { return -id } + logutil.BgLogger().Warn("Unexpected positive collation ID for restore.", zap.Int32("ID", id)) } return id } diff --git a/util/collate/gbk_bin.go b/util/collate/gbk_bin.go index 7b28ad88ef799..807d7b8c1768e 100644 --- a/util/collate/gbk_bin.go +++ b/util/collate/gbk_bin.go @@ -79,7 +79,7 @@ func (g *gbkBinCollator) KeyWithoutTrimRightSpace(str string) []byte { } // Pattern implements Collator interface. -func (g *gbkBinCollator) Pattern() WildcardPattern { +func (*gbkBinCollator) Pattern() WildcardPattern { return &gbkBinPattern{} } diff --git a/util/collate/gbk_chinese_ci.go b/util/collate/gbk_chinese_ci.go index d06519fc8eb5e..a81003cd9ef6a 100644 --- a/util/collate/gbk_chinese_ci.go +++ b/util/collate/gbk_chinese_ci.go @@ -20,7 +20,7 @@ type gbkChineseCICollator struct { } // Compare implements Collator interface. -func (g *gbkChineseCICollator) Compare(a, b string) int { +func (*gbkChineseCICollator) Compare(a, b string) int { a = truncateTailingSpace(a) b = truncateTailingSpace(b) @@ -44,7 +44,7 @@ func (g *gbkChineseCICollator) Key(str string) []byte { } // KeyWithoutTrimRightSpace implement Collator interface. -func (g *gbkChineseCICollator) KeyWithoutTrimRightSpace(str string) []byte { +func (*gbkChineseCICollator) KeyWithoutTrimRightSpace(str string) []byte { buf := make([]byte, 0, len(str)*2) i := 0 r := rune(0) @@ -60,7 +60,7 @@ func (g *gbkChineseCICollator) KeyWithoutTrimRightSpace(str string) []byte { } // Pattern implements Collator interface. -func (g *gbkChineseCICollator) Pattern() WildcardPattern { +func (*gbkChineseCICollator) Pattern() WildcardPattern { return &gbkChineseCIPattern{} } diff --git a/util/collate/general_ci.go b/util/collate/general_ci.go index d9d9ab400a11a..00f9c817819f6 100644 --- a/util/collate/general_ci.go +++ b/util/collate/general_ci.go @@ -22,7 +22,7 @@ type generalCICollator struct { } // Compare implements Collator interface. -func (gc *generalCICollator) Compare(a, b string) int { +func (*generalCICollator) Compare(a, b string) int { a = truncateTailingSpace(a) b = truncateTailingSpace(b) r1, r2 := rune(0), rune(0) @@ -45,7 +45,7 @@ func (gc *generalCICollator) Key(str string) []byte { } // KeyWithoutTrimRightSpace implements Collator interface. -func (gc *generalCICollator) KeyWithoutTrimRightSpace(str string) []byte { +func (*generalCICollator) KeyWithoutTrimRightSpace(str string) []byte { buf := make([]byte, 0, len(str)) i := 0 r := rune(0) @@ -58,7 +58,7 @@ func (gc *generalCICollator) KeyWithoutTrimRightSpace(str string) []byte { } // Pattern implements Collator interface. -func (gc *generalCICollator) Pattern() WildcardPattern { +func (*generalCICollator) Pattern() WildcardPattern { return &ciPattern{} } diff --git a/util/collate/pinyin_tidb_as_cs.go b/util/collate/pinyin_tidb_as_cs.go index 4341d2cb6ef31..f995941f4a32b 100644 --- a/util/collate/pinyin_tidb_as_cs.go +++ b/util/collate/pinyin_tidb_as_cs.go @@ -18,22 +18,22 @@ package collate type zhPinyinTiDBASCSCollator struct { } -// Collator interface, no implements now. -func (py *zhPinyinTiDBASCSCollator) Compare(a, b string) int { +// Compare is not implemented. +func (*zhPinyinTiDBASCSCollator) Compare(_, _ string) int { panic("implement me") } -// Collator interface, no implements now. -func (py *zhPinyinTiDBASCSCollator) Key(str string) []byte { +// Key is not implemented. +func (*zhPinyinTiDBASCSCollator) Key(_ string) []byte { panic("implement me") } -// Collator interface, no implements now. -func (py *zhPinyinTiDBASCSCollator) KeyWithoutTrimRightSpace(str string) []byte { +// KeyWithoutTrimRightSpace is not implemented. +func (*zhPinyinTiDBASCSCollator) KeyWithoutTrimRightSpace(_ string) []byte { panic("implement me") } -// Collator interface, no implements now. -func (py *zhPinyinTiDBASCSCollator) Pattern() WildcardPattern { +// Pattern is not implemented. +func (*zhPinyinTiDBASCSCollator) Pattern() WildcardPattern { panic("implement me") } diff --git a/util/collate/unicode_ci.go b/util/collate/unicode_ci.go index 58575551d011b..41440ef6b941a 100644 --- a/util/collate/unicode_ci.go +++ b/util/collate/unicode_ci.go @@ -28,7 +28,7 @@ type unicodeCICollator struct { } // Compare implements Collator interface. -func (uc *unicodeCICollator) Compare(a, b string) int { +func (*unicodeCICollator) Compare(a, b string) int { a = truncateTailingSpace(a) b = truncateTailingSpace(b) // weight of a, b. weight in unicode_ci may has 8 uint16s. xn indicate first 4 u16s, xs indicate last 4 u16s @@ -73,12 +73,11 @@ func (uc *unicodeCICollator) Compare(a, b string) int { } for an != 0 && bn != 0 { - if (an^bn)&0xFFFF == 0 { - an >>= 16 - bn >>= 16 - } else { + if (an^bn)&0xFFFF != 0 { return sign(int(an&0xFFFF) - int(bn&0xFFFF)) } + an >>= 16 + bn >>= 16 } } } @@ -89,7 +88,7 @@ func (uc *unicodeCICollator) Key(str string) []byte { } // KeyWithoutTrimRightSpace implements Collator interface. -func (uc *unicodeCICollator) KeyWithoutTrimRightSpace(str string) []byte { +func (*unicodeCICollator) KeyWithoutTrimRightSpace(str string) []byte { buf := make([]byte, 0, len(str)*2) r := rune(0) si := 0 // decode index of s @@ -124,7 +123,7 @@ func convertRuneUnicodeCI(r rune) (first, second uint64) { } // Pattern implements Collator interface. -func (uc *unicodeCICollator) Pattern() WildcardPattern { +func (*unicodeCICollator) Pattern() WildcardPattern { return &unicodePattern{} } diff --git a/util/column-mapping/BUILD.bazel b/util/column-mapping/BUILD.bazel index 5b20244d7052e..bc77e021c7f9d 100644 --- a/util/column-mapping/BUILD.bazel +++ b/util/column-mapping/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "column-mapping_test", + timeout = "short", srcs = ["column_test.go"], embed = [":column-mapping"], deps = ["@com_github_stretchr_testify//require"], diff --git a/util/column-mapping/column.go b/util/column-mapping/column.go index 93a1443dc6173..054c561bd3661 100644 --- a/util/column-mapping/column.go +++ b/util/column-mapping/column.go @@ -130,7 +130,7 @@ func (r *Rule) Adjust() { } // check source and target position -func (r *Rule) adjustColumnPosition(source, target int) (int, int, error) { +func (r *Rule) adjustColumnPosition(source, target int) (src int, targ int, err error) { // if not found target, ignore it if target == -1 { return source, target, errors.NotFoundf("target column %s", r.TargetColumn) diff --git a/util/cpuprofile/BUILD.bazel b/util/cpuprofile/BUILD.bazel index 32f6638285bfb..d0b3dafa6e39f 100644 --- a/util/cpuprofile/BUILD.bazel +++ b/util/cpuprofile/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "cpuprofile_test", + timeout = "short", srcs = ["cpuprofile_test.go"], embed = [":cpuprofile"], deps = [ diff --git a/util/cpuprofile/pprof_api.go b/util/cpuprofile/pprof_api.go index 04d492da0e01e..4840138f38404 100644 --- a/util/cpuprofile/pprof_api.go +++ b/util/cpuprofile/pprof_api.go @@ -184,7 +184,7 @@ const labelSQL = "sql" // removeLabel uses to remove the sql_digest and plan_digest labels for pprof cpu profile data. // Since TopSQL will set the sql_digest and plan_digest label, they are strange for other users. -func (pc *Collector) removeLabel(profileData *profile.Profile) { +func (*Collector) removeLabel(profileData *profile.Profile) { for _, s := range profileData.Sample { for k := range s.Label { if k != labelSQL { diff --git a/util/cteutil/BUILD.bazel b/util/cteutil/BUILD.bazel index 1fab2fdcbeab5..990325cd33b93 100644 --- a/util/cteutil/BUILD.bazel +++ b/util/cteutil/BUILD.bazel @@ -16,6 +16,7 @@ go_library( go_test( name = "cteutil_test", + timeout = "short", srcs = [ "main_test.go", "storage_test.go", diff --git a/util/cteutil/storage.go b/util/cteutil/storage.go index c84cbc5217ad3..8b29bb41d7c37 100644 --- a/util/cteutil/storage.go +++ b/util/cteutil/storage.go @@ -117,7 +117,7 @@ func (s *StorageRC) OpenAndRef() (err error) { s.refCnt = 1 s.iter = 0 } else { - s.refCnt += 1 + s.refCnt++ } return nil } @@ -127,7 +127,7 @@ func (s *StorageRC) DerefAndClose() (err error) { if !s.valid() { return errors.New("Storage not opend yet") } - s.refCnt -= 1 + s.refCnt-- if s.refCnt < 0 { return errors.New("Storage ref count is less than zero") } else if s.refCnt == 0 { diff --git a/util/dbterror/BUILD.bazel b/util/dbterror/BUILD.bazel index 6c67f5fd4484d..6ded1d55dfe47 100644 --- a/util/dbterror/BUILD.bazel +++ b/util/dbterror/BUILD.bazel @@ -17,6 +17,7 @@ go_library( go_test( name = "dbterror_test", + timeout = "short", srcs = [ "main_test.go", "terror_test.go", diff --git a/util/dbterror/ddl_terror.go b/util/dbterror/ddl_terror.go index d9e268c650948..2e90d25ffdd2c 100644 --- a/util/dbterror/ddl_terror.go +++ b/util/dbterror/ddl_terror.go @@ -33,7 +33,7 @@ var ( // ErrCancelledDDLJob means the DDL job is cancelled. ErrCancelledDDLJob = ClassDDL.NewStd(mysql.ErrCancelledDDLJob) // 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"), nil)) + 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. ErrOperateSameColumn = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "operate same column '%s'"), nil)) // ErrOperateSameIndex means we change the same indexes multiple times in a DDL. @@ -69,8 +69,6 @@ var ( ErrUnsupportedAlterTableWithoutValidation = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER TABLE WITHOUT VALIDATION is currently unsupported", nil)) // ErrUnsupportedAlterTableOption means we don't support the alter table option. ErrUnsupportedAlterTableOption = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("This type of ALTER TABLE is currently unsupported", nil)) - // ErrUnsupportedAlterReplicaForSysTable means we don't support the alter replica for system table. - ErrUnsupportedAlterReplicaForSysTable = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER table replica for tables in system database is currently unsupported", nil)) // ErrUnsupportedAlterCacheForSysTable means we don't support the alter cache for system table. ErrUnsupportedAlterCacheForSysTable = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER table cache for tables in system database is currently unsupported", nil)) // ErrBlobKeyWithoutLength is used when BLOB is used as key but without a length. @@ -99,10 +97,6 @@ var ( ErrFkColumnCannotDrop = ClassDDL.NewStd(mysql.ErrFkColumnCannotDrop) // ErrFKIncompatibleColumns is used when foreign key column type is incompatible. ErrFKIncompatibleColumns = ClassDDL.NewStd(mysql.ErrFKIncompatibleColumns) - - // ErrAlterReplicaForUnsupportedCharsetTable is used when alter table with unsupported charset. - ErrAlterReplicaForUnsupportedCharsetTable = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "ALTER table replica for table contain %s charset"), nil)) - // ErrOnlyOnRangeListPartition is used when the partition type is range list. ErrOnlyOnRangeListPartition = ClassDDL.NewStd(mysql.ErrOnlyOnRangeListPartition) // ErrWrongKeyColumn is for table column cannot be indexed. @@ -391,4 +385,13 @@ var ( // ErrColumnInChange indicates there is modification on the column in parallel. ErrColumnInChange = ClassDDL.NewStd(mysql.ErrColumnInChange) + + // ErrAlterTiFlashModeForTableWithoutTiFlashReplica returns when set tiflash mode on table whose tiflash_replica is null or tiflash_replica_count = 0 + ErrAlterTiFlashModeForTableWithoutTiFlashReplica = ClassDDL.NewStdErr(0, parser_mysql.Message("TiFlash mode will take effect after at least one TiFlash replica is set for the table", nil)) + + // ErrUnsupportedTiFlashOperationForSysOrMemTable means we don't support the alter tiflash related action(e.g. set tiflash mode, set tiflash replica) for system table. + ErrUnsupportedTiFlashOperationForSysOrMemTable = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "ALTER TiFlash settings for system table and memory table"), nil)) + + // ErrUnsupportedTiFlashOperationForUnsupportedCharsetTable is used when alter alter tiflash related action(e.g. set tiflash mode, set tiflash replica) with unsupported charset. + ErrUnsupportedTiFlashOperationForUnsupportedCharsetTable = ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "ALTER TiFlash settings for tables not supported by TiFlash: table contains %s charset"), nil)) ) diff --git a/util/dbterror/terror_test.go b/util/dbterror/terror_test.go index cdd66b21bd507..5ecfc2acaee58 100644 --- a/util/dbterror/terror_test.go +++ b/util/dbterror/terror_test.go @@ -34,49 +34,49 @@ func TestErrorRedact(t *testing.T) { class := ErrClass{} - NoSensitiveValue := "no_sensitive" - SensitiveData := "sensitive_data" - QuestionMark := "?" + noSensitiveValue := "no_sensitive" + sensitiveData := "sensitive_data" + questionMark := "?" - err := class.NewStd(errno.ErrDupEntry).GenWithStackByArgs(SensitiveData, NoSensitiveValue) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDupEntry].Raw, QuestionMark, NoSensitiveValue)) - err = class.NewStd(errno.ErrCutValueGroupConcat).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrCutValueGroupConcat].Raw, QuestionMark)) - err = class.NewStd(errno.ErrDuplicatedValueInType).GenWithStackByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDuplicatedValueInType].Raw, NoSensitiveValue, QuestionMark)) - err = class.NewStd(errno.ErrTruncatedWrongValue).GenWithStackByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTruncatedWrongValue].Raw, NoSensitiveValue, QuestionMark)) - err = class.NewStd(errno.ErrInvalidCharacterString).FastGenByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidCharacterString].Raw, NoSensitiveValue, QuestionMark)) - err = class.NewStd(errno.ErrTruncatedWrongValueForField).FastGenByArgs(SensitiveData, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTruncatedWrongValueForField].Raw, QuestionMark, QuestionMark)) - err = class.NewStd(errno.ErrIllegalValueForType).FastGenByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrIllegalValueForType].Raw, NoSensitiveValue, QuestionMark)) + err := class.NewStd(errno.ErrDupEntry).GenWithStackByArgs(sensitiveData, noSensitiveValue) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDupEntry].Raw, questionMark, noSensitiveValue)) + err = class.NewStd(errno.ErrCutValueGroupConcat).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrCutValueGroupConcat].Raw, questionMark)) + err = class.NewStd(errno.ErrDuplicatedValueInType).GenWithStackByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDuplicatedValueInType].Raw, noSensitiveValue, questionMark)) + err = class.NewStd(errno.ErrTruncatedWrongValue).GenWithStackByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTruncatedWrongValue].Raw, noSensitiveValue, questionMark)) + err = class.NewStd(errno.ErrInvalidCharacterString).FastGenByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidCharacterString].Raw, noSensitiveValue, questionMark)) + err = class.NewStd(errno.ErrTruncatedWrongValueForField).FastGenByArgs(sensitiveData, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTruncatedWrongValueForField].Raw, questionMark, questionMark)) + err = class.NewStd(errno.ErrIllegalValueForType).FastGenByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrIllegalValueForType].Raw, noSensitiveValue, questionMark)) - err = class.NewStd(errno.ErrPartitionWrongValues).GenWithStackByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrPartitionWrongValues].Raw, NoSensitiveValue, QuestionMark)) - err = class.NewStd(errno.ErrNoParts).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrNoParts].Raw, QuestionMark)) - err = class.NewStd(errno.ErrWrongValue).GenWithStackByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrWrongValue].Raw, NoSensitiveValue, QuestionMark)) - err = class.NewStd(errno.ErrNoPartitionForGivenValue).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrNoPartitionForGivenValue].Raw, QuestionMark)) - err = class.NewStd(errno.ErrDataOutOfRange).GenWithStackByArgs(NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDataOutOfRange].Raw, NoSensitiveValue, QuestionMark)) + err = class.NewStd(errno.ErrPartitionWrongValues).GenWithStackByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrPartitionWrongValues].Raw, noSensitiveValue, questionMark)) + err = class.NewStd(errno.ErrNoParts).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrNoParts].Raw, questionMark)) + err = class.NewStd(errno.ErrWrongValue).GenWithStackByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrWrongValue].Raw, noSensitiveValue, questionMark)) + err = class.NewStd(errno.ErrNoPartitionForGivenValue).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrNoPartitionForGivenValue].Raw, questionMark)) + err = class.NewStd(errno.ErrDataOutOfRange).GenWithStackByArgs(noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDataOutOfRange].Raw, noSensitiveValue, questionMark)) - err = class.NewStd(errno.ErrRowInWrongPartition).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrRowInWrongPartition].Raw, QuestionMark)) - err = class.NewStd(errno.ErrInvalidJSONText).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidJSONText].Raw, QuestionMark)) - err = class.NewStd(errno.ErrTxnRetryable).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTxnRetryable].Raw, QuestionMark)) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTxnRetryable].Raw, QuestionMark)) - err = class.NewStd(errno.ErrIncorrectDatetimeValue).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrIncorrectDatetimeValue].Raw, QuestionMark)) - err = class.NewStd(errno.ErrInvalidTimeFormat).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidTimeFormat].Raw, QuestionMark)) - err = class.NewStd(errno.ErrRowNotFound).GenWithStackByArgs(SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrRowNotFound].Raw, QuestionMark)) - err = class.NewStd(errno.ErrWriteConflict).GenWithStackByArgs(NoSensitiveValue, NoSensitiveValue, NoSensitiveValue, SensitiveData) - require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrWriteConflict].Raw, NoSensitiveValue, NoSensitiveValue, NoSensitiveValue, QuestionMark)) + err = class.NewStd(errno.ErrRowInWrongPartition).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrRowInWrongPartition].Raw, questionMark)) + err = class.NewStd(errno.ErrInvalidJSONText).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidJSONText].Raw, questionMark)) + err = class.NewStd(errno.ErrTxnRetryable).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTxnRetryable].Raw, questionMark)) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTxnRetryable].Raw, questionMark)) + err = class.NewStd(errno.ErrIncorrectDatetimeValue).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrIncorrectDatetimeValue].Raw, questionMark)) + err = class.NewStd(errno.ErrInvalidTimeFormat).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidTimeFormat].Raw, questionMark)) + err = class.NewStd(errno.ErrRowNotFound).GenWithStackByArgs(sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrRowNotFound].Raw, questionMark)) + err = class.NewStd(errno.ErrWriteConflict).GenWithStackByArgs(noSensitiveValue, noSensitiveValue, noSensitiveValue, sensitiveData) + require.Contains(t, err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrWriteConflict].Raw, noSensitiveValue, noSensitiveValue, noSensitiveValue, questionMark)) } diff --git a/util/dbutil/BUILD.bazel b/util/dbutil/BUILD.bazel index b9b55839a52ad..b1f69096da54b 100644 --- a/util/dbutil/BUILD.bazel +++ b/util/dbutil/BUILD.bazel @@ -39,6 +39,7 @@ go_library( go_test( name = "dbutil_test", + timeout = "short", srcs = [ "common_test.go", "index_test.go", diff --git a/util/dbutil/common.go b/util/dbutil/common.go index 674314af3492f..e4278028f9ff7 100644 --- a/util/dbutil/common.go +++ b/util/dbutil/common.go @@ -250,7 +250,7 @@ func GetRandomValues(ctx context.Context, db QueryExecutor, schemaName, table, c } // GetMinMaxValue return min and max value of given column by specified limitRange condition. -func GetMinMaxValue(ctx context.Context, db QueryExecutor, schema, table, column string, limitRange string, limitArgs []interface{}, collation string) (string, string, error) { +func GetMinMaxValue(ctx context.Context, db QueryExecutor, schema, table, column string, limitRange string, limitArgs []interface{}, collation string) (minStr string, maxStr string, err error) { /* example: mysql> SELECT MIN(`id`) as MIN, MAX(`id`) as MAX FROM `test`.`testa` WHERE id > 0 AND id < 10; @@ -334,7 +334,6 @@ func FormatTimeZoneOffset(offset time.Duration) string { minutes := (offset % time.Hour) / time.Minute return fmt.Sprintf("%s%02d:%02d", prefix, hours, minutes) - } func queryTables(ctx context.Context, db QueryExecutor, q string) (tables []string, err error) { diff --git a/util/ddl-checker/executable_checker.go b/util/ddl-checker/executable_checker.go index 8f9381f69dd5a..47fd059a79530 100644 --- a/util/ddl-checker/executable_checker.go +++ b/util/ddl-checker/executable_checker.go @@ -109,7 +109,6 @@ func (ec *ExecutableChecker) Close() error { // Parse parses a query and returns an ast.StmtNode. func (ec *ExecutableChecker) Parse(sql string) (stmt ast.StmtNode, err error) { - charset, collation := ec.session.GetSessionVars().GetCharsetInfo() stmt, err = ec.parser.ParseOneStmt(sql, charset, collation) return diff --git a/util/disjointset/BUILD.bazel b/util/disjointset/BUILD.bazel index 564cf031d3041..1f50ae31c6f95 100644 --- a/util/disjointset/BUILD.bazel +++ b/util/disjointset/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "disjointset_test", + timeout = "short", srcs = [ "int_set_test.go", "main_test.go", diff --git a/util/encrypt/BUILD.bazel b/util/encrypt/BUILD.bazel index 7011814e32f68..d6ab0eb9a7c0a 100644 --- a/util/encrypt/BUILD.bazel +++ b/util/encrypt/BUILD.bazel @@ -14,6 +14,7 @@ go_library( go_test( name = "encrypt_test", + timeout = "short", srcs = [ "aes_layer_test.go", "aes_test.go", diff --git a/util/etcd/BUILD.bazel b/util/etcd/BUILD.bazel index 33024813f8778..545c83f127e7c 100644 --- a/util/etcd/BUILD.bazel +++ b/util/etcd/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "etcd_test", + timeout = "short", srcs = ["etcd_test.go"], embed = [":etcd"], deps = [ diff --git a/util/etcd/etcd.go b/util/etcd/etcd.go index 26604a01dc2f4..e6447b9de9b78 100644 --- a/util/etcd/etcd.go +++ b/util/etcd/etcd.go @@ -304,8 +304,8 @@ func (e *Client) DoTxn(ctx context.Context, operations []*Operation) (int64, err return txnResp.Header.Revision, nil } -func parseToDirTree(root *Node, path string) *Node { - pathDirs := strings.Split(path, "/") +func parseToDirTree(root *Node, p string) *Node { + pathDirs := strings.Split(p, "/") current := root var next *Node var ok bool diff --git a/util/execdetails/BUILD.bazel b/util/execdetails/BUILD.bazel index d2c9142fe8cd4..755981338fdc0 100644 --- a/util/execdetails/BUILD.bazel +++ b/util/execdetails/BUILD.bazel @@ -15,6 +15,7 @@ go_library( go_test( name = "execdetails_test", + timeout = "short", srcs = [ "execdetails_test.go", "main_test.go", diff --git a/util/execdetails/execdetails.go b/util/execdetails/execdetails.go index 170c5fe4516e0..db54f2c05c74a 100644 --- a/util/execdetails/execdetails.go +++ b/util/execdetails/execdetails.go @@ -80,10 +80,14 @@ const ( CommitTimeStr = "Commit_time" // GetCommitTSTimeStr means the time of getting commit ts. GetCommitTSTimeStr = "Get_commit_ts_time" + // GetLatestTsTimeStr means the time of getting latest ts in async commit and 1pc. + GetLatestTsTimeStr = "Get_latest_ts_time" // CommitBackoffTimeStr means the time of commit backoff. CommitBackoffTimeStr = "Commit_backoff_time" // BackoffTypesStr means the backoff type. BackoffTypesStr = "Backoff_types" + // SlowestCommitRPCDetailStr means the details of the slowest RPC during the transaction commit process. + SlowestCommitRPCDetailStr = "Slowest_commit_rpc_detail" // ResolveLockTimeStr means the time of resolving lock. ResolveLockTimeStr = "Resolve_lock_time" // LocalLatchWaitTimeStr means the time of waiting in local latch. @@ -96,6 +100,8 @@ const ( PrewriteRegionStr = "Prewrite_region" // TxnRetryStr means the count of transaction retry. TxnRetryStr = "Txn_retry" + // GetSnapshotTimeStr means the time spent on getting an engine snapshot. + GetSnapshotTimeStr = "Get_snapshot_time" // RocksdbDeleteSkippedCountStr means the count of rocksdb delete skipped count. RocksdbDeleteSkippedCountStr = "Rocksdb_delete_skipped_count" // RocksdbKeySkippedCountStr means the count of rocksdb key skipped count. @@ -106,6 +112,8 @@ const ( RocksdbBlockReadCountStr = "Rocksdb_block_read_count" // RocksdbBlockReadByteStr means the bytes of rocksdb block read. RocksdbBlockReadByteStr = "Rocksdb_block_read_byte" + // RocksdbBlockReadTimeStr means the time spent on rocksdb block read. + RocksdbBlockReadTimeStr = "Rocksdb_block_read_time" ) // String implements the fmt.Stringer interface. @@ -143,6 +151,9 @@ func (d ExecDetails) String() string { if commitDetails.GetCommitTsTime > 0 { parts = append(parts, GetCommitTSTimeStr+": "+strconv.FormatFloat(commitDetails.GetCommitTsTime.Seconds(), 'f', -1, 64)) } + if commitDetails.GetLatestTsTime > 0 { + parts = append(parts, GetLatestTsTimeStr+": "+strconv.FormatFloat(commitDetails.GetLatestTsTime.Seconds(), 'f', -1, 64)) + } commitDetails.Mu.Lock() commitBackoffTime := commitDetails.Mu.CommitBackoffTime if commitBackoffTime > 0 { @@ -151,6 +162,12 @@ func (d ExecDetails) String() string { if len(commitDetails.Mu.BackoffTypes) > 0 { parts = append(parts, BackoffTypesStr+": "+fmt.Sprintf("%v", commitDetails.Mu.BackoffTypes)) } + if commitDetails.Mu.SlowestReqTotalTime > 0 { + parts = append(parts, SlowestCommitRPCDetailStr+": {total:"+strconv.FormatFloat(commitDetails.Mu.SlowestReqTotalTime.Seconds(), 'f', 3, 64)+ + "s, region_id: "+strconv.FormatUint(commitDetails.Mu.SlowestRegion, 10)+ + ", store: "+commitDetails.Mu.SlowestStoreAddr+ + ", "+commitDetails.Mu.SlowestExecDetails.String()+"}") + } commitDetails.Mu.Unlock() resolveLockTime := atomic.LoadInt64(&commitDetails.ResolveLock.ResolveLockTime) if resolveLockTime > 0 { @@ -181,6 +198,9 @@ func (d ExecDetails) String() string { if scanDetail.TotalKeys > 0 { parts = append(parts, TotalKeysStr+": "+strconv.FormatInt(scanDetail.TotalKeys, 10)) } + if scanDetail.GetSnapshotDuration > 0 { + parts = append(parts, GetSnapshotTimeStr+": "+strconv.FormatFloat(scanDetail.GetSnapshotDuration.Seconds(), 'f', 3, 64)) + } if scanDetail.RocksdbDeleteSkippedCount > 0 { parts = append(parts, RocksdbDeleteSkippedCountStr+": "+strconv.FormatUint(scanDetail.RocksdbDeleteSkippedCount, 10)) } @@ -196,6 +216,9 @@ func (d ExecDetails) String() string { if scanDetail.RocksdbBlockReadByte > 0 { parts = append(parts, RocksdbBlockReadByteStr+": "+strconv.FormatUint(scanDetail.RocksdbBlockReadByte, 10)) } + if scanDetail.RocksdbBlockReadDuration > 0 { + parts = append(parts, RocksdbBlockReadTimeStr+": "+strconv.FormatFloat(scanDetail.RocksdbBlockReadDuration.Seconds(), 'f', 3, 64)) + } } return strings.Join(parts, " ") } @@ -304,7 +327,7 @@ func (e *basicCopRuntimeStats) Merge(rs RuntimeStats) { } // Tp implements the RuntimeStats interface. -func (e *basicCopRuntimeStats) Tp() int { +func (*basicCopRuntimeStats) Tp() int { return TpBasicCopRunTimeStats } @@ -345,28 +368,33 @@ func (crs *CopRuntimeStats) GetActRows() (totalRows int64) { return totalRows } -func (crs *CopRuntimeStats) String() string { - if len(crs.stats) == 0 { - return "" - } - - var totalTasks int64 - var totalIters int32 - var totalThreads int32 - procTimes := make([]time.Duration, 0, 32) +// MergeBasicStats traverses basicCopRuntimeStats in the CopRuntimeStats and collects some useful information. +func (crs *CopRuntimeStats) MergeBasicStats() (procTimes []time.Duration, totalTime time.Duration, totalTasks, totalLoops, totalThreads int32) { + procTimes = make([]time.Duration, 0, 32) for _, instanceStats := range crs.stats { for _, stat := range instanceStats { procTimes = append(procTimes, time.Duration(stat.consume)*time.Nanosecond) - totalIters += stat.loop + totalTime += time.Duration(stat.consume) + totalLoops += stat.loop totalThreads += stat.threads totalTasks++ } } + return +} + +func (crs *CopRuntimeStats) String() string { + if len(crs.stats) == 0 { + return "" + } + + procTimes, totalTime, totalTasks, totalLoops, totalThreads := crs.MergeBasicStats() + avgTime := time.Duration(totalTime.Nanoseconds() / int64(totalTasks)) isTiFlashCop := crs.storeType == "tiflash" buf := bytes.NewBuffer(make([]byte, 0, 16)) if totalTasks == 1 { - buf.WriteString(fmt.Sprintf("%v_task:{time:%v, loops:%d", crs.storeType, FormatDuration(procTimes[0]), totalIters)) + buf.WriteString(fmt.Sprintf("%v_task:{time:%v, loops:%d", crs.storeType, FormatDuration(procTimes[0]), totalLoops)) if isTiFlashCop { buf.WriteString(fmt.Sprintf(", threads:%d}", totalThreads)) } else { @@ -375,9 +403,9 @@ func (crs *CopRuntimeStats) String() string { } else { n := len(procTimes) slices.Sort(procTimes) - buf.WriteString(fmt.Sprintf("%v_task:{proc max:%v, min:%v, p80:%v, p95:%v, iters:%v, tasks:%v", - crs.storeType, FormatDuration(procTimes[n-1]), FormatDuration(procTimes[0]), - FormatDuration(procTimes[n*4/5]), FormatDuration(procTimes[n*19/20]), totalIters, totalTasks)) + buf.WriteString(fmt.Sprintf("%v_task:{proc max:%v, min:%v, avg: %v, p80:%v, p95:%v, iters:%v, tasks:%v", + crs.storeType, FormatDuration(procTimes[n-1]), FormatDuration(procTimes[0]), FormatDuration(avgTime), + FormatDuration(procTimes[n*4/5]), FormatDuration(procTimes[n*19/20]), totalLoops, totalTasks)) if isTiFlashCop { buf.WriteString(fmt.Sprintf(", threads:%d}", totalThreads)) } else { @@ -473,7 +501,7 @@ func (e *BasicRuntimeStats) Merge(rs RuntimeStats) { } // Tp implements the RuntimeStats interface. -func (e *BasicRuntimeStats) Tp() int { +func (*BasicRuntimeStats) Tp() int { return TpBasicRuntimeStats } @@ -492,40 +520,61 @@ func (e *RootRuntimeStats) GetActRows() int64 { return num } +// MergeBasicStats merges BasicRuntimeStats in the RootRuntimeStats into single one. +func (e *RootRuntimeStats) MergeBasicStats() *BasicRuntimeStats { + if len(e.basics) == 0 { + return nil + } + basic := e.basics[0].Clone().(*BasicRuntimeStats) + for i := 1; i < len(e.basics); i++ { + basic.Merge(e.basics[i]) + } + return basic +} + +// MergeGroupStats merges every slice in e.groupRss into single RuntimeStats. +func (e *RootRuntimeStats) MergeGroupStats() (res []RuntimeStats) { + if len(e.groupRss) == 0 { + return nil + } + for _, rss := range e.groupRss { + if len(rss) == 0 { + continue + } else if len(rss) == 1 { + res = append(res, rss[0]) + continue + } + rs := rss[0].Clone() + for i := 1; i < len(rss); i++ { + rs.Merge(rss[i]) + } + res = append(res, rs) + } + return +} + +// MergeStats merges stats in the RootRuntimeStats and return the stats suitable for display directly. +func (e *RootRuntimeStats) MergeStats() (basic *BasicRuntimeStats, groups []RuntimeStats) { + basic = e.MergeBasicStats() + groups = e.MergeGroupStats() + return +} + // String implements the RuntimeStats interface. func (e *RootRuntimeStats) String() string { - buf := bytes.NewBuffer(make([]byte, 0, 32)) - if len(e.basics) > 0 { - if len(e.basics) == 1 { - buf.WriteString(e.basics[0].String()) - } else { - basic := e.basics[0].Clone() - for i := 1; i < len(e.basics); i++ { - basic.Merge(e.basics[i]) - } - buf.WriteString(basic.String()) - } + basic, groups := e.MergeStats() + strs := make([]string, 0, len(groups)+1) + basicStr := basic.String() + if len(basicStr) > 0 { + strs = append(strs, basic.String()) } - if len(e.groupRss) > 0 { - if buf.Len() > 0 { - buf.WriteString(", ") - } - for i, rss := range e.groupRss { - if i > 0 { - buf.WriteString(", ") - } - if len(rss) == 1 { - buf.WriteString(rss[0].String()) - continue - } - rs := rss[0].Clone() - for i := 1; i < len(rss); i++ { - rs.Merge(rss[i]) - } - buf.WriteString(rs.String()) + for _, group := range groups { + str := group.String() + if len(str) > 0 { + strs = append(strs, group.String()) } } - return buf.String() + return strings.Join(strs, ", ") } // Record records executor's execution. @@ -542,6 +591,9 @@ func (e *BasicRuntimeStats) SetRowNum(rowNum int64) { // String implements the RuntimeStats interface. func (e *BasicRuntimeStats) String() string { + if e == nil { + return "" + } var str strings.Builder str.WriteString("time:") str.WriteString(FormatDuration(time.Duration(e.consume))) @@ -715,7 +767,7 @@ type RuntimeStatsWithConcurrencyInfo struct { } // Tp implements the RuntimeStats interface. -func (e *RuntimeStatsWithConcurrencyInfo) Tp() int { +func (*RuntimeStatsWithConcurrencyInfo) Tp() int { return TpRuntimeStatsWithConcurrencyInfo } @@ -757,8 +809,7 @@ func (e *RuntimeStatsWithConcurrencyInfo) String() string { } // Merge implements the RuntimeStats interface. -func (e *RuntimeStatsWithConcurrencyInfo) Merge(_ RuntimeStats) { -} +func (*RuntimeStatsWithConcurrencyInfo) Merge(RuntimeStats) {} // RuntimeStatsWithCommit is the RuntimeStats with commit detail. type RuntimeStatsWithCommit struct { @@ -768,7 +819,7 @@ type RuntimeStatsWithCommit struct { } // Tp implements the RuntimeStats interface. -func (e *RuntimeStatsWithCommit) Tp() int { +func (*RuntimeStatsWithCommit) Tp() int { return TpRuntimeStatsWithCommit } @@ -860,6 +911,17 @@ func (e *RuntimeStatsWithCommit) String() string { } buf.WriteString("}") } + if e.Commit.Mu.SlowestReqTotalTime > 0 { + buf.WriteString(", slowest_commit_rpc: {total: ") + buf.WriteString(strconv.FormatFloat(e.Commit.Mu.SlowestReqTotalTime.Seconds(), 'f', 3, 64)) + buf.WriteString("s, region_id: ") + buf.WriteString(strconv.FormatUint(e.Commit.Mu.SlowestRegion, 10)) + buf.WriteString(", store: ") + buf.WriteString(e.Commit.Mu.SlowestStoreAddr) + buf.WriteString(", ") + buf.WriteString(e.Commit.Mu.SlowestExecDetails.String()) + buf.WriteString("}") + } e.Commit.Mu.Unlock() if e.Commit.ResolveLock.ResolveLockTime > 0 { buf.WriteString(", resolve_lock: ") @@ -906,17 +968,28 @@ func (e *RuntimeStatsWithCommit) String() string { buf.WriteString(", resolve_lock:") buf.WriteString(FormatDuration(time.Duration(e.LockKeys.ResolveLock.ResolveLockTime))) } + e.LockKeys.Mu.Lock() if e.LockKeys.BackoffTime > 0 { buf.WriteString(", backoff: {time: ") buf.WriteString(FormatDuration(time.Duration(e.LockKeys.BackoffTime))) - e.LockKeys.Mu.Lock() if len(e.LockKeys.Mu.BackoffTypes) > 0 { buf.WriteString(", type: ") buf.WriteString(e.formatBackoff(e.LockKeys.Mu.BackoffTypes)) } - e.LockKeys.Mu.Unlock() buf.WriteString("}") } + if e.LockKeys.Mu.SlowestReqTotalTime > 0 { + buf.WriteString(", slowest_rpc: {total: ") + buf.WriteString(strconv.FormatFloat(e.LockKeys.Mu.SlowestReqTotalTime.Seconds(), 'f', 3, 64)) + buf.WriteString("s, region_id: ") + buf.WriteString(strconv.FormatUint(e.LockKeys.Mu.SlowestRegion, 10)) + buf.WriteString(", store: ") + buf.WriteString(e.LockKeys.Mu.SlowestStoreAddr) + buf.WriteString(", ") + buf.WriteString(e.LockKeys.Mu.SlowestExecDetails.String()) + buf.WriteString("}") + } + e.LockKeys.Mu.Unlock() if e.LockKeys.LockRPCTime > 0 { buf.WriteString(", lock_rpc:") buf.WriteString(time.Duration(e.LockKeys.LockRPCTime).String()) @@ -929,12 +1002,13 @@ func (e *RuntimeStatsWithCommit) String() string { buf.WriteString(", retry_count:") buf.WriteString(strconv.FormatInt(int64(e.LockKeys.RetryCount), 10)) } + buf.WriteString("}") } return buf.String() } -func (e *RuntimeStatsWithCommit) formatBackoff(backoffTypes []string) string { +func (*RuntimeStatsWithCommit) formatBackoff(backoffTypes []string) string { if len(backoffTypes) == 0 { return "" } diff --git a/util/execdetails/execdetails_test.go b/util/execdetails/execdetails_test.go index b13a09725c942..0495a833a13cd 100644 --- a/util/execdetails/execdetails_test.go +++ b/util/execdetails/execdetails_test.go @@ -32,20 +32,58 @@ func TestString(t *testing.T) { RequestCount: 1, CommitDetail: &util.CommitDetails{ GetCommitTsTime: time.Second, + GetLatestTsTime: time.Second, PrewriteTime: time.Second, CommitTime: time.Second, LocalLatchTime: time.Second, Mu: struct { sync.Mutex - CommitBackoffTime int64 - BackoffTypes []string + CommitBackoffTime int64 + BackoffTypes []string + SlowestReqTotalTime time.Duration + SlowestRegion uint64 + SlowestStoreAddr string + SlowestExecDetails util.TiKVExecDetails }{ CommitBackoffTime: int64(time.Second), BackoffTypes: []string{ "backoff1", "backoff2", }, + SlowestReqTotalTime: time.Second, + SlowestRegion: 1000, + SlowestStoreAddr: "tikv-1:20160", + SlowestExecDetails: util.TiKVExecDetails{ + TimeDetail: &util.TimeDetail{ + TotalRPCWallTime: 500 * time.Millisecond, + }, + ScanDetail: &util.ScanDetail{ + ProcessedKeys: 10, + TotalKeys: 100, + RocksdbDeleteSkippedCount: 1, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 1, + RocksdbBlockReadCount: 1, + RocksdbBlockReadByte: 100, + RocksdbBlockReadDuration: 20 * time.Millisecond, + }, + WriteDetail: &util.WriteDetail{ + StoreBatchWaitDuration: 10 * time.Microsecond, + ProposeSendWaitDuration: 20 * time.Microsecond, + PersistLogDuration: 30 * time.Microsecond, + RaftDbWriteLeaderWaitDuration: 40 * time.Microsecond, + RaftDbSyncLogDuration: 45 * time.Microsecond, + RaftDbWriteMemtableDuration: 50 * time.Microsecond, + CommitLogDuration: 60 * time.Microsecond, + ApplyBatchWaitDuration: 70 * time.Microsecond, + ApplyLogDuration: 80 * time.Microsecond, + ApplyMutexLockDuration: 90 * time.Microsecond, + ApplyWriteLeaderWaitDuration: 100 * time.Microsecond, + ApplyWriteWalDuration: 101 * time.Microsecond, + ApplyWriteMemtableDuration: 102 * time.Microsecond, + }, + }, }, WriteKeys: 1, WriteSize: 1, @@ -63,6 +101,7 @@ func TestString(t *testing.T) { RocksdbBlockCacheHitCount: 1, RocksdbBlockReadCount: 1, RocksdbBlockReadByte: 100, + RocksdbBlockReadDuration: time.Millisecond, }, TimeDetail: util.TimeDetail{ ProcessTime: 2*time.Second + 5*time.Millisecond, @@ -70,8 +109,14 @@ func TestString(t *testing.T) { }, } expected := "Cop_time: 1.003 Process_time: 2.005 Wait_time: 1 Backoff_time: 1 Request_count: 1 Prewrite_time: 1 Commit_time: 1 " + - "Get_commit_ts_time: 1 Commit_backoff_time: 1 Backoff_types: [backoff1 backoff2] Resolve_lock_time: 1 Local_latch_wait_time: 1 Write_keys: 1 Write_size: 1 Prewrite_region: 1 Txn_retry: 1 " + - "Process_keys: 10 Total_keys: 100 Rocksdb_delete_skipped_count: 1 Rocksdb_key_skipped_count: 1 Rocksdb_block_cache_hit_count: 1 Rocksdb_block_read_count: 1 Rocksdb_block_read_byte: 100" + "Get_commit_ts_time: 1 Get_latest_ts_time: 1 Commit_backoff_time: 1 Backoff_types: [backoff1 backoff2] " + + "Slowest_commit_rpc_detail: {total:1.000s, region_id: 1000, store: tikv-1:20160, tikv_wall_time: 500ms, " + + "scan_detail: {total_process_keys: 10, total_keys: 100, rocksdb: {delete_skipped_count: 1, key_skipped_count: 1, " + + "block: {cache_hit_count: 1, read_count: 1, read_byte: 100 Bytes, read_time: 20ms}}}, write_detail: " + + "{store_batch_wait: 10µs, propose_send_wait: 20µs, persist_log: {total: 30µs, write_leader_wait: 40µs, sync_log: 45µs, write_memtable: 50µs}, " + + "commit_log: 60µs, apply_batch_wait: 70µs, apply: {total:80µs, mutex_lock: 90µs, write_leader_wait: 100µs, write_wal: 101µs, write_memtable: 102µs}}} " + + "Resolve_lock_time: 1 Local_latch_wait_time: 1 Write_keys: 1 Write_size: 1 Prewrite_region: 1 Txn_retry: 1 " + + "Process_keys: 10 Total_keys: 100 Rocksdb_delete_skipped_count: 1 Rocksdb_key_skipped_count: 1 Rocksdb_block_cache_hit_count: 1 Rocksdb_block_read_count: 1 Rocksdb_block_read_byte: 100 Rocksdb_block_read_time: 0.001" require.Equal(t, expected, detail.String()) detail = &ExecDetails{} require.Equal(t, "", detail.String()) @@ -110,7 +155,7 @@ func TestCopRuntimeStats(t *testing.T) { require.True(t, stats.ExistsCopStats(tableScanID)) cop := stats.GetOrCreateCopStats(tableScanID, "tikv") - expected := "tikv_task:{proc max:2ns, min:1ns, p80:2ns, p95:2ns, iters:3, tasks:2}, " + + expected := "tikv_task:{proc max:2ns, min:1ns, avg: 1ns, p80:2ns, p95:2ns, iters:3, tasks:2}, " + "scan_detail: {total_process_keys: 10, total_process_keys_size: 10, total_keys: 15, rocksdb: {delete_skipped_count: 5, key_skipped_count: 1, block: {cache_hit_count: 10, read_count: 20, read_byte: 100 Bytes}}}" require.Equal(t, expected, cop.String()) @@ -120,7 +165,7 @@ func TestCopRuntimeStats(t *testing.T) { copStats[0].SetRowNum(10) copStats[0].Record(time.Second, 10) require.Equal(t, "time:1s, loops:2", copStats[0].String()) - require.Equal(t, "tikv_task:{proc max:4ns, min:3ns, p80:4ns, p95:4ns, iters:7, tasks:2}", stats.GetOrCreateCopStats(aggID, "tikv").String()) + require.Equal(t, "tikv_task:{proc max:4ns, min:3ns, avg: 3ns, p80:4ns, p95:4ns, iters:7, tasks:2}", stats.GetOrCreateCopStats(aggID, "tikv").String()) rootStats := stats.GetRootStats(tableReaderID) require.NotNil(t, rootStats) @@ -131,8 +176,8 @@ func TestCopRuntimeStats(t *testing.T) { cop.scanDetail.RocksdbKeySkippedCount = 0 cop.scanDetail.RocksdbBlockReadCount = 0 // Print all fields even though the value of some fields is 0. - str := "tikv_task:{proc max:1s, min:2ns, p80:1s, p95:1s, iters:4, tasks:2}, " + - "scan_detail: {total_process_keys: 0, total_process_keys_size: 0, total_keys: 15, rocksdb: {delete_skipped_count: 5, key_skipped_count: 0, block: {cache_hit_count: 10, read_count: 0, read_byte: 100 Bytes}}}" + str := "tikv_task:{proc max:1s, min:2ns, avg: 500ms, p80:1s, p95:1s, iters:4, tasks:2}, " + + "scan_detail: {total_keys: 15, rocksdb: {delete_skipped_count: 5, block: {cache_hit_count: 10, read_byte: 100 Bytes}}}" require.Equal(t, str, cop.String()) zeroScanDetail := util.ScanDetail{} @@ -161,7 +206,7 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { require.True(t, stats.ExistsCopStats(tableScanID)) cop := stats.GetOrCreateCopStats(tableScanID, "tiflash") - require.Equal(t, "tiflash_task:{proc max:2ns, min:1ns, p80:2ns, p95:2ns, iters:3, tasks:2, threads:2}", cop.String()) + require.Equal(t, "tiflash_task:{proc max:2ns, min:1ns, avg: 1ns, p80:2ns, p95:2ns, iters:3, tasks:2, threads:2}", cop.String()) copStats := cop.stats["8.8.8.8"] require.NotNil(t, copStats) @@ -169,7 +214,7 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { copStats[0].SetRowNum(10) copStats[0].Record(time.Second, 10) require.Equal(t, "time:1s, loops:2, threads:1", copStats[0].String()) - expected := "tiflash_task:{proc max:4ns, min:3ns, p80:4ns, p95:4ns, iters:7, tasks:2, threads:2}" + expected := "tiflash_task:{proc max:4ns, min:3ns, avg: 3ns, p80:4ns, p95:4ns, iters:7, tasks:2, threads:2}" require.Equal(t, expected, stats.GetOrCreateCopStats(aggID, "tiflash").String()) rootStats := stats.GetRootStats(tableReaderID) @@ -184,11 +229,48 @@ func TestRuntimeStatsWithCommit(t *testing.T) { CommitTime: time.Second, Mu: struct { sync.Mutex - CommitBackoffTime int64 - BackoffTypes []string + CommitBackoffTime int64 + BackoffTypes []string + SlowestReqTotalTime time.Duration + SlowestRegion uint64 + SlowestStoreAddr string + SlowestExecDetails util.TiKVExecDetails }{ - CommitBackoffTime: int64(time.Second), - BackoffTypes: []string{"backoff1", "backoff2", "backoff1"}, + CommitBackoffTime: int64(time.Second), + BackoffTypes: []string{"backoff1", "backoff2", "backoff1"}, + SlowestReqTotalTime: time.Second, + SlowestRegion: 1000, + SlowestStoreAddr: "tikv-1:20160", + SlowestExecDetails: util.TiKVExecDetails{ + TimeDetail: &util.TimeDetail{ + TotalRPCWallTime: 500 * time.Millisecond, + }, + ScanDetail: &util.ScanDetail{ + ProcessedKeys: 10, + TotalKeys: 100, + RocksdbDeleteSkippedCount: 1, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 1, + RocksdbBlockReadCount: 1, + RocksdbBlockReadByte: 100, + RocksdbBlockReadDuration: 20 * time.Millisecond, + }, + WriteDetail: &util.WriteDetail{ + StoreBatchWaitDuration: 10 * time.Microsecond, + ProposeSendWaitDuration: 20 * time.Microsecond, + PersistLogDuration: 30 * time.Microsecond, + RaftDbWriteLeaderWaitDuration: 40 * time.Microsecond, + RaftDbSyncLogDuration: 45 * time.Microsecond, + RaftDbWriteMemtableDuration: 50 * time.Microsecond, + CommitLogDuration: 60 * time.Microsecond, + ApplyBatchWaitDuration: 70 * time.Microsecond, + ApplyLogDuration: 80 * time.Microsecond, + ApplyMutexLockDuration: 90 * time.Microsecond, + ApplyWriteLeaderWaitDuration: 100 * time.Microsecond, + ApplyWriteWalDuration: 101 * time.Microsecond, + ApplyWriteMemtableDuration: 102 * time.Microsecond, + }, + }, }, WriteKeys: 3, WriteSize: 66, @@ -201,7 +283,13 @@ func TestRuntimeStatsWithCommit(t *testing.T) { stats := &RuntimeStatsWithCommit{ Commit: commitDetail, } - expect := "commit_txn: {prewrite:1s, get_commit_ts:1s, commit:1s, backoff: {time: 1s, type: [backoff1 backoff2]}, resolve_lock: 1s, region_num:5, write_keys:3, write_byte:66, txn_retry:2}" + expect := "commit_txn: {prewrite:1s, get_commit_ts:1s, commit:1s, backoff: {time: 1s, type: [backoff1 backoff2]}, " + + "slowest_commit_rpc: {total: 1.000s, region_id: 1000, store: tikv-1:20160, tikv_wall_time: 500ms, scan_detail: " + + "{total_process_keys: 10, total_keys: 100, rocksdb: {delete_skipped_count: 1, key_skipped_count: 1, block: " + + "{cache_hit_count: 1, read_count: 1, read_byte: 100 Bytes, read_time: 20ms}}}, write_detail: " + + "{store_batch_wait: 10µs, propose_send_wait: 20µs, persist_log: {total: 30µs, write_leader_wait: 40µs, sync_log: 45µs, write_memtable: 50µs}, " + + "commit_log: 60µs, apply_batch_wait: 70µs, apply: {total:80µs, mutex_lock: 90µs, write_leader_wait: 100µs, write_wal: 101µs, write_memtable: 102µs}}}, " + + "resolve_lock: 1s, region_num:5, write_keys:3, write_byte:66, txn_retry:2}" require.Equal(t, expect, stats.String()) lockDetail := &util.LockKeysDetails{ @@ -211,12 +299,50 @@ func TestRuntimeStatsWithCommit(t *testing.T) { BackoffTime: int64(time.Second * 3), Mu: struct { sync.Mutex - BackoffTypes []string - }{BackoffTypes: []string{ - "backoff4", - "backoff5", - "backoff5", - }}, + BackoffTypes []string + SlowestReqTotalTime time.Duration + SlowestRegion uint64 + SlowestStoreAddr string + SlowestExecDetails util.TiKVExecDetails + }{ + BackoffTypes: []string{ + "backoff4", + "backoff5", + "backoff5", + }, + SlowestReqTotalTime: time.Second, + SlowestRegion: 1000, + SlowestStoreAddr: "tikv-1:20160", + SlowestExecDetails: util.TiKVExecDetails{ + TimeDetail: &util.TimeDetail{ + TotalRPCWallTime: 500 * time.Millisecond, + }, + ScanDetail: &util.ScanDetail{ + ProcessedKeys: 10, + TotalKeys: 100, + RocksdbDeleteSkippedCount: 1, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 1, + RocksdbBlockReadCount: 1, + RocksdbBlockReadByte: 100, + RocksdbBlockReadDuration: 20 * time.Millisecond, + }, + WriteDetail: &util.WriteDetail{ + StoreBatchWaitDuration: 10 * time.Microsecond, + ProposeSendWaitDuration: 20 * time.Microsecond, + PersistLogDuration: 30 * time.Microsecond, + RaftDbWriteLeaderWaitDuration: 40 * time.Microsecond, + RaftDbSyncLogDuration: 45 * time.Microsecond, + RaftDbWriteMemtableDuration: 50 * time.Microsecond, + CommitLogDuration: 60 * time.Microsecond, + ApplyBatchWaitDuration: 70 * time.Microsecond, + ApplyLogDuration: 80 * time.Microsecond, + ApplyMutexLockDuration: 90 * time.Microsecond, + ApplyWriteLeaderWaitDuration: 100 * time.Microsecond, + ApplyWriteWalDuration: 101 * time.Microsecond, + ApplyWriteMemtableDuration: 102 * time.Microsecond, + }, + }}, LockRPCTime: int64(time.Second * 5), LockRPCCount: 50, RetryCount: 2, @@ -227,7 +353,13 @@ func TestRuntimeStatsWithCommit(t *testing.T) { stats = &RuntimeStatsWithCommit{ LockKeys: lockDetail, } - expect = "lock_keys: {time:1s, region:2, keys:10, resolve_lock:2s, backoff: {time: 3s, type: [backoff4 backoff5]}, lock_rpc:5s, rpc_count:50, retry_count:2}" + expect = "lock_keys: {time:1s, region:2, keys:10, resolve_lock:2s, backoff: {time: 3s, type: [backoff4 backoff5]}, " + + "slowest_rpc: {total: 1.000s, region_id: 1000, store: tikv-1:20160, tikv_wall_time: 500ms, scan_detail: " + + "{total_process_keys: 10, total_keys: 100, rocksdb: {delete_skipped_count: 1, key_skipped_count: 1, block: " + + "{cache_hit_count: 1, read_count: 1, read_byte: 100 Bytes, read_time: 20ms}}}, write_detail: " + + "{store_batch_wait: 10µs, propose_send_wait: 20µs, persist_log: {total: 30µs, write_leader_wait: 40µs, sync_log: 45µs, write_memtable: 50µs}, " + + "commit_log: 60µs, apply_batch_wait: 70µs, apply: {total:80µs, mutex_lock: 90µs, write_leader_wait: 100µs, write_wal: 101µs, write_memtable: 102µs}}}, " + + "lock_rpc:5s, rpc_count:50, retry_count:2}" require.Equal(t, expect, stats.String()) } diff --git a/util/expensivequery/BUILD.bazel b/util/expensivequery/BUILD.bazel index 21576dc13d95b..b96ffc97a9c27 100644 --- a/util/expensivequery/BUILD.bazel +++ b/util/expensivequery/BUILD.bazel @@ -25,6 +25,7 @@ go_library( go_test( name = "expensivequery_test", + timeout = "short", srcs = ["expensivequerey_test.go"], embed = [":expensivequery"], deps = [ diff --git a/util/expensivequery/expensivequery.go b/util/expensivequery/expensivequery.go index 035e90aec0190..c2dab7582fa5c 100644 --- a/util/expensivequery/expensivequery.go +++ b/util/expensivequery/expensivequery.go @@ -65,6 +65,7 @@ func (eqh *Handle) Run() { if len(info.Info) == 0 { continue } + costTime := time.Since(info.Time) if !info.ExceedExpensiveTimeThresh && costTime >= time.Second*time.Duration(threshold) && log.GetLevel() <= zapcore.WarnLevel { logExpensiveQuery(costTime, info) diff --git a/util/expensivequery/memory_usage_alarm.go b/util/expensivequery/memory_usage_alarm.go index fab62ea9bf1f5..8ce19c6264640 100644 --- a/util/expensivequery/memory_usage_alarm.go +++ b/util/expensivequery/memory_usage_alarm.go @@ -236,6 +236,7 @@ func (record *memoryUsageAlarm) recordProfile() { logutil.BgLogger().Error(fmt.Sprintf("create %v profile file fail", item.name), zap.Error(err)) return } + //nolint: revive defer func() { err := f.Close() if err != nil { diff --git a/util/fastrand/BUILD.bazel b/util/fastrand/BUILD.bazel index 42e40bc901991..5e40856edb6b3 100644 --- a/util/fastrand/BUILD.bazel +++ b/util/fastrand/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "fastrand_test", + timeout = "short", srcs = [ "main_test.go", "random_test.go", diff --git a/util/filter/BUILD.bazel b/util/filter/BUILD.bazel index a9e565b1329a0..07e3af82d1225 100644 --- a/util/filter/BUILD.bazel +++ b/util/filter/BUILD.bazel @@ -17,6 +17,7 @@ go_library( go_test( name = "filter_test", + timeout = "short", srcs = [ "filter_test.go", "schema_test.go", diff --git a/util/format/BUILD.bazel b/util/format/BUILD.bazel index fb99a71d52804..de1583911289a 100644 --- a/util/format/BUILD.bazel +++ b/util/format/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "format_test", + timeout = "short", srcs = [ "format_test.go", "main_test.go", diff --git a/util/generatedexpr/BUILD.bazel b/util/generatedexpr/BUILD.bazel index 74e9fc7259df6..02612944f02c1 100644 --- a/util/generatedexpr/BUILD.bazel +++ b/util/generatedexpr/BUILD.bazel @@ -17,6 +17,7 @@ go_library( go_test( name = "generatedexpr_test", + timeout = "short", srcs = [ "gen_expr_test.go", "main_test.go", diff --git a/util/generatedexpr/generated_expr.go b/util/generatedexpr/generated_expr.go index e4405286015bf..1af0fb1adac7b 100644 --- a/util/generatedexpr/generated_expr.go +++ b/util/generatedexpr/generated_expr.go @@ -33,12 +33,13 @@ type nameResolver struct { } // Enter implements ast.Visitor interface. -func (nr *nameResolver) Enter(inNode ast.Node) (ast.Node, bool) { +func (*nameResolver) Enter(inNode ast.Node) (ast.Node, bool) { return inNode, false } // Leave implements ast.Visitor interface. func (nr *nameResolver) Leave(inNode ast.Node) (node ast.Node, ok bool) { + //nolint:revive switch v := inNode.(type) { case *ast.ColumnNameExpr: for _, col := range nr.tableInfo.Columns { diff --git a/util/hack/BUILD.bazel b/util/hack/BUILD.bazel index 53a083731d5f7..c52303037a6b5 100644 --- a/util/hack/BUILD.bazel +++ b/util/hack/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "hack_test", + timeout = "short", srcs = [ "hack_test.go", "main_test.go", diff --git a/util/hack/hack.go b/util/hack/hack.go index 8e586485ee9bd..1c8dc15ef8a16 100644 --- a/util/hack/hack.go +++ b/util/hack/hack.go @@ -33,7 +33,7 @@ func String(b []byte) (s MutableString) { pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pstring.Data = pbytes.Data pstring.Len = pbytes.Len - return + return s } // Slice converts string to slice without copy. @@ -44,7 +44,7 @@ func Slice(s string) (b []byte) { pbytes.Data = pstring.Data pbytes.Len = pstring.Len pbytes.Cap = pstring.Len - return + return b } // LoadFactor is the maximum average load of a bucket that triggers growth is 6.5 in Golang Map. diff --git a/util/hint/BUILD.bazel b/util/hint/BUILD.bazel index 817a1237fa9df..05fb356dcfbf2 100644 --- a/util/hint/BUILD.bazel +++ b/util/hint/BUILD.bazel @@ -14,7 +14,6 @@ go_library( "//sessionctx", "//util/dbterror", "//util/logutil", - "@com_github_pingcap_errors//:errors", "@org_uber_go_zap//:zap", ], ) diff --git a/util/hint/hint_processor.go b/util/hint/hint_processor.go index 1bc49d92da301..ce61936aa1cf7 100644 --- a/util/hint/hint_processor.go +++ b/util/hint/hint_processor.go @@ -19,7 +19,6 @@ import ( "strconv" "strings" - "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" @@ -260,7 +259,7 @@ func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*Hints return nil, nil, nil, err } if len(stmtNodes) != 1 { - return nil, nil, nil, errors.New(fmt.Sprintf("bind_sql must be a single statement: %s", sql)) + return nil, nil, nil, fmt.Errorf("bind_sql must be a single statement: %s", sql) } hs := CollectHint(stmtNodes[0]) processor := &BlockHintProcessor{} @@ -279,7 +278,7 @@ func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*Hints offset := processor.GetHintOffset(tblHint.QBName, curOffset) if offset < 0 || !processor.checkTableQBName(tblHint.Tables) { hintStr := RestoreTableOptimizerHint(tblHint) - return nil, nil, nil, errors.New(fmt.Sprintf("Unknown query block name in hint %s", hintStr)) + return nil, nil, nil, fmt.Errorf("Unknown query block name in hint %s", hintStr) } tblHint.QBName, err = GenerateQBName(topNodeType, offset) if err != nil { @@ -342,7 +341,7 @@ func (p *BlockHintProcessor) Enter(in ast.Node) (ast.Node, bool) { } // Leave implements Visitor interface. -func (p *BlockHintProcessor) Leave(in ast.Node) (ast.Node, bool) { +func (*BlockHintProcessor) Leave(in ast.Node) (ast.Node, bool) { return in, true } @@ -357,7 +356,7 @@ func (p *BlockHintProcessor) checkQueryBlockHints(hints []*ast.TableOptimizerHin } if qbName != "" { if p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New(fmt.Sprintf("There are more than two query names in same query block,, using the first one %s", qbName))) + 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 @@ -371,7 +370,7 @@ func (p *BlockHintProcessor) checkQueryBlockHints(hints []*ast.TableOptimizerHin } if _, ok := p.QbNameMap[qbName]; ok { if p.Ctx != nil { - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New(fmt.Sprintf("Duplicate query block name %s, only the first one is effective", qbName))) + p.Ctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("Duplicate query block name %s, only the first one is effective", qbName)) } } else { p.QbNameMap[qbName] = offset @@ -465,7 +464,7 @@ func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint offset := p.GetHintOffset(hint.QBName, currentOffset) if offset < 0 || !p.checkTableQBName(hint.Tables) { hintStr := RestoreTableOptimizerHint(hint) - p.Ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New(fmt.Sprintf("Hint %s is ignored due to unknown query block name", hintStr))) + 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) @@ -482,7 +481,7 @@ func GenerateQBName(nodeType NodeType, blockOffset int) (model.CIStr, error) { if nodeType == TypeUpdate { return model.NewCIStr(defaultUpdateBlockName), nil } - return model.NewCIStr(""), errors.New(fmt.Sprintf("Unexpected NodeType %d when block offset is 0", nodeType)) + return model.NewCIStr(""), fmt.Errorf("Unexpected NodeType %d when block offset is 0", nodeType) } return model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, blockOffset)), nil } diff --git a/util/importer/db.go b/util/importer/db.go index 17956b67f3c07..14a5bf46ecddd 100644 --- a/util/importer/db.go +++ b/util/importer/db.go @@ -28,7 +28,7 @@ import ( "go.uber.org/zap" ) -func intRangeValue(column *column, min int64, max int64) (int64, int64) { +func intRangeValue(column *column, min int64, max int64) (maxInt int64, minInt int64) { var err error if len(column.min) > 0 { min, err = strconv.ParseInt(column.min, 10, 64) diff --git a/util/importer/parser.go b/util/importer/parser.go index 0950c4e2060d7..ec121c006f138 100644 --- a/util/importer/parser.go +++ b/util/importer/parser.go @@ -170,7 +170,7 @@ func newTable() *table { } } -func (t *table) findCol(cols []*column, name string) *column { +func (*table) findCol(cols []*column, name string) *column { for _, col := range cols { if col.name == name { return col diff --git a/util/keydecoder/BUILD.bazel b/util/keydecoder/BUILD.bazel index ef29440153448..21b5d1ee3466a 100644 --- a/util/keydecoder/BUILD.bazel +++ b/util/keydecoder/BUILD.bazel @@ -18,6 +18,7 @@ go_library( go_test( name = "keydecoder_test", + timeout = "short", srcs = [ "keydecoder_test.go", "main_test.go", diff --git a/util/kvcache/BUILD.bazel b/util/kvcache/BUILD.bazel index 139b64ada66f1..79ac25f1dff5d 100644 --- a/util/kvcache/BUILD.bazel +++ b/util/kvcache/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "kvcache_test", + timeout = "short", srcs = [ "main_test.go", "simple_lru_test.go", diff --git a/util/localpool/BUILD.bazel b/util/localpool/BUILD.bazel index ed161eed10518..108c9fdd07ab6 100644 --- a/util/localpool/BUILD.bazel +++ b/util/localpool/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "localpool_test", + timeout = "short", srcs = [ "localpool_test.go", "main_test.go", diff --git a/util/logutil/BUILD.bazel b/util/logutil/BUILD.bazel index ee230fe0d184d..6d0732c980b38 100644 --- a/util/logutil/BUILD.bazel +++ b/util/logutil/BUILD.bazel @@ -24,6 +24,7 @@ go_library( go_test( name = "logutil_test", + timeout = "short", srcs = [ "hex_test.go", "log_test.go", diff --git a/util/logutil/consistency/reporter.go b/util/logutil/consistency/reporter.go index db14c25a865cf..fd7fd655eb26a 100644 --- a/util/logutil/consistency/reporter.go +++ b/util/logutil/consistency/reporter.go @@ -105,7 +105,8 @@ func DecodeRowMvccData(tableInfo *model.TableInfo) func(kv.Key, *kvrpcpb.MvccGet return func(key kv.Key, respValue *kvrpcpb.MvccGetByKeyResponse, outMap map[string]interface{}) { colMap := make(map[int64]*types.FieldType, 3) for _, col := range tableInfo.Columns { - colMap[col.ID] = &col.FieldType + var fieldType = col.FieldType + colMap[col.ID] = &fieldType } if respValue.Info != nil { diff --git a/util/logutil/log.go b/util/logutil/log.go index 138b989a35962..83eb44eb9d2cc 100644 --- a/util/logutil/log.go +++ b/util/logutil/log.go @@ -233,7 +233,7 @@ type traceLog struct { ctx context.Context } -func (t *traceLog) Enabled(_ zapcore.Level) bool { +func (*traceLog) Enabled(_ zapcore.Level) bool { return true } @@ -242,7 +242,7 @@ func (t *traceLog) Write(p []byte) (n int, err error) { return len(p), nil } -func (t *traceLog) Sync() error { +func (*traceLog) Sync() error { return nil } diff --git a/util/logutil/slow_query_logger.go b/util/logutil/slow_query_logger.go index d5d59f98aface..a0c0a6c3b665c 100644 --- a/util/logutil/slow_query_logger.go +++ b/util/logutil/slow_query_logger.go @@ -60,36 +60,36 @@ func newSlowQueryLogConfig(cfg *LogConfig) *log.Config { type slowLogEncoder struct{} -func (e *slowLogEncoder) EncodeEntry(entry zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) { +func (*slowLogEncoder) EncodeEntry(entry zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) { b := _pool.Get() fmt.Fprintf(b, "# Time: %s\n", entry.Time.Format(SlowLogTimeFormat)) fmt.Fprintf(b, "%s\n", entry.Message) return b, nil } -func (e *slowLogEncoder) Clone() zapcore.Encoder { return e } -func (e *slowLogEncoder) AddArray(string, zapcore.ArrayMarshaler) error { return nil } -func (e *slowLogEncoder) AddObject(string, zapcore.ObjectMarshaler) error { return nil } -func (e *slowLogEncoder) AddBinary(string, []byte) {} -func (e *slowLogEncoder) AddByteString(string, []byte) {} -func (e *slowLogEncoder) AddBool(string, bool) {} -func (e *slowLogEncoder) AddComplex128(string, complex128) {} -func (e *slowLogEncoder) AddComplex64(string, complex64) {} -func (e *slowLogEncoder) AddDuration(string, time.Duration) {} -func (e *slowLogEncoder) AddFloat64(string, float64) {} -func (e *slowLogEncoder) AddFloat32(string, float32) {} -func (e *slowLogEncoder) AddInt(string, int) {} -func (e *slowLogEncoder) AddInt64(string, int64) {} -func (e *slowLogEncoder) AddInt32(string, int32) {} -func (e *slowLogEncoder) AddInt16(string, int16) {} -func (e *slowLogEncoder) AddInt8(string, int8) {} -func (e *slowLogEncoder) AddString(string, string) {} -func (e *slowLogEncoder) AddTime(string, time.Time) {} -func (e *slowLogEncoder) AddUint(string, uint) {} -func (e *slowLogEncoder) AddUint64(string, uint64) {} -func (e *slowLogEncoder) AddUint32(string, uint32) {} -func (e *slowLogEncoder) AddUint16(string, uint16) {} -func (e *slowLogEncoder) AddUint8(string, uint8) {} -func (e *slowLogEncoder) AddUintptr(string, uintptr) {} -func (e *slowLogEncoder) AddReflected(string, interface{}) error { return nil } -func (e *slowLogEncoder) OpenNamespace(string) {} +func (e *slowLogEncoder) Clone() zapcore.Encoder { return e } +func (*slowLogEncoder) AddArray(string, zapcore.ArrayMarshaler) error { return nil } +func (*slowLogEncoder) AddObject(string, zapcore.ObjectMarshaler) error { return nil } +func (*slowLogEncoder) AddBinary(string, []byte) {} +func (*slowLogEncoder) AddByteString(string, []byte) {} +func (*slowLogEncoder) AddBool(string, bool) {} +func (*slowLogEncoder) AddComplex128(string, complex128) {} +func (*slowLogEncoder) AddComplex64(string, complex64) {} +func (*slowLogEncoder) AddDuration(string, time.Duration) {} +func (*slowLogEncoder) AddFloat64(string, float64) {} +func (*slowLogEncoder) AddFloat32(string, float32) {} +func (*slowLogEncoder) AddInt(string, int) {} +func (*slowLogEncoder) AddInt64(string, int64) {} +func (*slowLogEncoder) AddInt32(string, int32) {} +func (*slowLogEncoder) AddInt16(string, int16) {} +func (*slowLogEncoder) AddInt8(string, int8) {} +func (*slowLogEncoder) AddString(string, string) {} +func (*slowLogEncoder) AddTime(string, time.Time) {} +func (*slowLogEncoder) AddUint(string, uint) {} +func (*slowLogEncoder) AddUint64(string, uint64) {} +func (*slowLogEncoder) AddUint32(string, uint32) {} +func (*slowLogEncoder) AddUint16(string, uint16) {} +func (*slowLogEncoder) AddUint8(string, uint8) {} +func (*slowLogEncoder) AddUintptr(string, uintptr) {} +func (*slowLogEncoder) AddReflected(string, interface{}) error { return nil } +func (*slowLogEncoder) OpenNamespace(string) {} diff --git a/util/mathutil/BUILD.bazel b/util/mathutil/BUILD.bazel index 7edebf6fb4de5..a14ce2301728e 100644 --- a/util/mathutil/BUILD.bazel +++ b/util/mathutil/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "mathutil_test", + timeout = "short", srcs = [ "main_test.go", "math_test.go", diff --git a/util/memory/BUILD.bazel b/util/memory/BUILD.bazel index d630240a6b4c6..4b7d11880acdc 100644 --- a/util/memory/BUILD.bazel +++ b/util/memory/BUILD.bazel @@ -24,6 +24,7 @@ go_library( go_test( name = "memory_test", + timeout = "short", srcs = [ "bench_test.go", "main_test.go", diff --git a/util/memory/action.go b/util/memory/action.go index 4342d620de5eb..af2c33351068d 100644 --- a/util/memory/action.go +++ b/util/memory/action.go @@ -115,7 +115,7 @@ func (a *LogOnExceed) Action(t *Tracker) { } // GetPriority get the priority of the Action -func (a *LogOnExceed) GetPriority() int64 { +func (*LogOnExceed) GetPriority() int64 { return DefLogPriority } @@ -134,7 +134,7 @@ func (a *PanicOnExceed) SetLogHook(hook func(uint64)) { } // Action panics when memory usage exceeds memory quota. -func (a *PanicOnExceed) Action(t *Tracker) { +func (a *PanicOnExceed) Action(_ *Tracker) { a.mutex.Lock() if a.acted { a.mutex.Unlock() @@ -149,7 +149,7 @@ func (a *PanicOnExceed) Action(t *Tracker) { } // GetPriority get the priority of the Action -func (a *PanicOnExceed) GetPriority() int64 { +func (*PanicOnExceed) GetPriority() int64 { return DefPanicPriority } diff --git a/util/memory/meminfo.go b/util/memory/meminfo.go index e14a6be73adb8..e5125468b8b93 100644 --- a/util/memory/meminfo.go +++ b/util/memory/meminfo.go @@ -72,17 +72,17 @@ type memInfoCache struct { updateTime time.Time } -func (c *memInfoCache) get() (mem uint64, t time.Time) { +func (c *memInfoCache) get() (memo uint64, t time.Time) { c.RLock() defer c.RUnlock() - mem, t = c.mem, c.updateTime + memo, t = c.mem, c.updateTime return } -func (c *memInfoCache) set(mem uint64, t time.Time) { +func (c *memInfoCache) set(memo uint64, t time.Time) { c.Lock() defer c.Unlock() - c.mem, c.updateTime = mem, t + c.mem, c.updateTime = memo, t } // expiration time is 60s @@ -97,30 +97,30 @@ var serverMemUsage *memInfoCache // MemTotalCGroup returns the total amount of RAM on this system in container environment. func MemTotalCGroup() (uint64, error) { - mem, t := memLimit.get() + memo, t := memLimit.get() if time.Since(t) < 60*time.Second { - return mem, nil + return memo, nil } - mem, err := readUint(cGroupMemLimitPath) + memo, err := readUint(cGroupMemLimitPath) if err != nil { - return mem, err + return memo, err } - memLimit.set(mem, time.Now()) - return mem, nil + memLimit.set(memo, time.Now()) + return memo, nil } // MemUsedCGroup returns the total used amount of RAM on this system in container environment. func MemUsedCGroup() (uint64, error) { - mem, t := memUsage.get() + memo, t := memUsage.get() if time.Since(t) < 500*time.Millisecond { - return mem, nil + return memo, nil } - mem, err := readUint(cGroupMemUsagePath) + memo, err := readUint(cGroupMemUsagePath) if err != nil { - return mem, err + return memo, err } - memUsage.set(mem, time.Now()) - return mem, nil + memUsage.set(memo, time.Now()) + return memo, nil } func init() { diff --git a/util/memory/tracker.go b/util/memory/tracker.go index 75dba11cea11f..8754dfbc353cb 100644 --- a/util/memory/tracker.go +++ b/util/memory/tracker.go @@ -17,6 +17,7 @@ package memory import ( "bytes" "fmt" + "runtime" "strconv" "sync" "sync/atomic" @@ -72,6 +73,7 @@ type Tracker struct { label int // Label of this "Tracker". bytesConsumed int64 // Consumed bytes. + bytesReleased int64 // Released bytes. bytesLimit atomic.Value maxConsumed atomicutil.Int64 // max number of bytes consumed during execution. isGlobal bool // isGlobal indicates whether this tracker is global tracker @@ -82,6 +84,15 @@ type actionMu struct { actionOnExceed ActionOnExceed } +// EnableGCAwareMemoryTrack is used to turn on/off the GC-aware memory track +var EnableGCAwareMemoryTrack = atomicutil.NewBool(false) + +// https://golang.google.cn/pkg/runtime/#SetFinalizer +// It is not guaranteed that a finalizer will run if the size of *obj is zero bytes. +type finalizerRef struct { + byte //nolint:unused +} + // softScale means the scale of the soft limit to the hard limit. const softScale = 0.8 @@ -340,18 +351,19 @@ func (t *Tracker) ReplaceChild(oldChild, newChild *Tracker) { // Consume is used to consume a memory usage. "bytes" can be a negative value, // which means this is a memory release operation. When memory usage of a tracker // exceeds its bytesSoftLimit/bytesHardLimit, the tracker calls its action, so does each of its ancestors. -func (t *Tracker) Consume(bytes int64) { - if bytes == 0 { +func (t *Tracker) Consume(bs int64) { + if bs == 0 { return } var rootExceed, rootExceedForSoftLimit *Tracker for tracker := t; tracker != nil; tracker = tracker.getParent() { - bytesConsumed := atomic.AddInt64(&tracker.bytesConsumed, bytes) + bytesConsumed := atomic.AddInt64(&tracker.bytesConsumed, bs) + bytesReleased := atomic.LoadInt64(&tracker.bytesReleased) limits := tracker.bytesLimit.Load().(*bytesLimits) - if bytesConsumed >= limits.bytesHardLimit && limits.bytesHardLimit > 0 { + if bytesConsumed+bytesReleased >= limits.bytesHardLimit && limits.bytesHardLimit > 0 { rootExceed = tracker } - if bytesConsumed >= limits.bytesSoftLimit && limits.bytesSoftLimit > 0 { + if bytesConsumed+bytesReleased >= limits.bytesSoftLimit && limits.bytesSoftLimit > 0 { rootExceedForSoftLimit = tracker } @@ -362,7 +374,7 @@ func (t *Tracker) Consume(bytes int64) { continue } if label, ok := MetricsTypes[tracker.label]; ok { - metrics.MemoryUsage.WithLabelValues(label).Set(float64(consumed)) + metrics.MemoryUsage.WithLabelValues(label[0], label[1]).Set(float64(consumed)) } break } @@ -379,29 +391,90 @@ func (t *Tracker) Consume(bytes int64) { } } - if bytes > 0 && rootExceedForSoftLimit != nil { + if bs > 0 && rootExceedForSoftLimit != nil { tryAction(&rootExceedForSoftLimit.actionMuForSoftLimit, rootExceedForSoftLimit) } - if bytes > 0 && rootExceed != nil { + if bs > 0 && rootExceed != nil { tryAction(&rootExceed.actionMuForHardLimit, rootExceed) } } // BufferedConsume is used to buffer memory usage and do late consume +// not thread-safe, should be called in one goroutine func (t *Tracker) BufferedConsume(bufferedMemSize *int64, bytes int64) { *bufferedMemSize += bytes - if *bufferedMemSize > int64(TrackMemWhenExceeds) { + if *bufferedMemSize >= int64(TrackMemWhenExceeds) { t.Consume(*bufferedMemSize) *bufferedMemSize = int64(0) } } +// Release is used to release memory tracked, track the released memory until GC triggered if needed +// If you want your track to be GC-aware, please use Release(bytes) instead of Consume(-bytes), and pass the memory size of the real object. +// Only Analyze is integrated with Release so far. +func (t *Tracker) Release(bytes int64) { + if bytes == 0 { + return + } + defer t.Consume(-bytes) + for tracker := t; tracker != nil; tracker = tracker.getParent() { + if tracker.shouldRecordRelease() { + // use fake ref instead of obj ref, otherwise obj will be reachable again and gc in next cycle + newRef := &finalizerRef{} + runtime.SetFinalizer(newRef, func(ref *finalizerRef) { + tracker.release(bytes) + }) + tracker.recordRelease(bytes) + return + } + } +} + +// BufferedRelease is used to buffer memory release and do late release +// not thread-safe, should be called in one goroutine +func (t *Tracker) BufferedRelease(bufferedMemSize *int64, bytes int64) { + *bufferedMemSize += bytes + if *bufferedMemSize >= int64(TrackMemWhenExceeds) { + t.Release(*bufferedMemSize) + *bufferedMemSize = int64(0) + } +} + +func (t *Tracker) shouldRecordRelease() bool { + return EnableGCAwareMemoryTrack.Load() && t.label == LabelForGlobalAnalyzeMemory +} + +func (t *Tracker) recordRelease(bytes int64) { + for tracker := t; tracker != nil; tracker = tracker.getParent() { + bytesReleased := atomic.AddInt64(&tracker.bytesReleased, bytes) + if label, ok := MetricsTypes[tracker.label]; ok { + metrics.MemoryUsage.WithLabelValues(label[0], label[2]).Set(float64(bytesReleased)) + } + } +} + +func (t *Tracker) release(bytes int64) { + for tracker := t; tracker != nil; tracker = tracker.getParent() { + bytesReleased := atomic.AddInt64(&tracker.bytesReleased, -bytes) + if label, ok := MetricsTypes[tracker.label]; ok { + metrics.MemoryUsage.WithLabelValues(label[0], label[2]).Set(float64(bytesReleased)) + } + } +} + // BytesConsumed returns the consumed memory usage value in bytes. func (t *Tracker) BytesConsumed() int64 { return atomic.LoadInt64(&t.bytesConsumed) } +// BytesReleased returns the released memory value in bytes. +func (t *Tracker) BytesReleased() int64 { + return atomic.LoadInt64(&t.bytesReleased) +} + // MaxConsumed returns max number of bytes consumed during execution. +// Note: Don't make this method return -1 for special meanings in the future. Because binary plan has used -1 to +// distinguish between "0 bytes" and "N/A". ref: binaryOpFromFlatOp() func (t *Tracker) MaxConsumed() int64 { return t.maxConsumed.Load() } @@ -418,6 +491,20 @@ func (t *Tracker) SearchTrackerWithoutLock(label int) *Tracker { return nil } +// SearchTrackerConsumedMoreThanNBytes searches the specific tracker that consumes more than NBytes. +func (t *Tracker) SearchTrackerConsumedMoreThanNBytes(limit int64) (res []*Tracker) { + t.mu.Lock() + defer t.mu.Unlock() + for _, childSlice := range t.mu.children { + for _, tracker := range childSlice { + if tracker.BytesConsumed() > limit { + res = append(res, tracker) + } + } + } + return +} + // String returns the string representation of this Tracker tree. func (t *Tracker) String() string { buffer := bytes.NewBufferString("\n") @@ -450,25 +537,25 @@ func (t *Tracker) toString(indent string, buffer *bytes.Buffer) { } // FormatBytes uses to format bytes, this function will prune precision before format bytes. -func (t *Tracker) FormatBytes(numBytes int64) string { +func (*Tracker) FormatBytes(numBytes int64) string { return FormatBytes(numBytes) } // BytesToString converts the memory consumption to a readable string. func BytesToString(numBytes int64) string { - GB := float64(numBytes) / float64(byteSizeGB) - if GB > 1 { - return fmt.Sprintf("%v GB", GB) + gb := float64(numBytes) / float64(byteSizeGB) + if gb > 1 { + return fmt.Sprintf("%v GB", gb) } - MB := float64(numBytes) / float64(byteSizeMB) - if MB > 1 { - return fmt.Sprintf("%v MB", MB) + mb := float64(numBytes) / float64(byteSizeMB) + if mb > 1 { + return fmt.Sprintf("%v MB", mb) } - KB := float64(numBytes) / float64(byteSizeKB) - if KB > 1 { - return fmt.Sprintf("%v KB", KB) + kb := float64(numBytes) / float64(byteSizeKB) + if kb > 1 { + return fmt.Sprintf("%v KB", kb) } return fmt.Sprintf("%v Bytes", numBytes) @@ -619,6 +706,7 @@ const ( ) // MetricsTypes is used to get label for metrics -var MetricsTypes = map[int]string{ - LabelForGlobalAnalyzeMemory: "analyze", +// string[0] is LblModule, string[1] is heap-in-use type, string[2] is released type +var MetricsTypes = map[int][]string{ + LabelForGlobalAnalyzeMemory: {"analyze", "inuse", "released"}, } diff --git a/util/memory/tracker_test.go b/util/memory/tracker_test.go index 263de711b5da2..58e4395470994 100644 --- a/util/memory/tracker_test.go +++ b/util/memory/tracker_test.go @@ -17,6 +17,8 @@ package memory import ( "errors" "math/rand" + "runtime" + "runtime/debug" "strconv" "strings" "sync" @@ -82,6 +84,91 @@ func TestConsume(t *testing.T) { require.Equal(t, int64(100), tracker.BytesConsumed()) } +func TestRelease(t *testing.T) { + debug.SetGCPercent(-1) + defer debug.SetGCPercent(100) + parentTracker := NewGlobalTracker(LabelForGlobalAnalyzeMemory, -1) + tracker := NewTracker(1, -1) + tracker.AttachToGlobalTracker(parentTracker) + require.Equal(t, int64(0), tracker.BytesConsumed()) + EnableGCAwareMemoryTrack.Store(false) + tracker.Consume(100) + require.Equal(t, int64(100), tracker.BytesConsumed()) + require.Equal(t, int64(100), parentTracker.BytesConsumed()) + tracker.Release(100) + require.Equal(t, int64(0), tracker.BytesConsumed()) + require.Equal(t, int64(0), parentTracker.BytesConsumed()) + require.Equal(t, int64(0), tracker.BytesReleased()) + require.Equal(t, int64(0), parentTracker.BytesReleased()) + + EnableGCAwareMemoryTrack.Store(true) + tracker.Consume(100) + require.Equal(t, int64(100), tracker.BytesConsumed()) + require.Equal(t, int64(100), parentTracker.BytesConsumed()) + tracker.Release(100) + require.Equal(t, int64(0), tracker.BytesConsumed()) + require.Equal(t, int64(0), parentTracker.BytesConsumed()) + require.Equal(t, int64(0), tracker.BytesReleased()) + require.Equal(t, int64(100), parentTracker.BytesReleased()) + // call GC() twice to workaround as the same way GO does due to GC() returns without finishing sweep + // https://github.com/golang/go/issues/45315 + runtime.GC() + runtime.GC() + require.Equal(t, int64(0), parentTracker.BytesReleased()) + + waitGroup := sync.WaitGroup{} + waitGroup.Add(10) + for i := 0; i < 10; i++ { + go func() { + defer waitGroup.Done() + tracker.Consume(10) + }() + } + waitGroup.Add(10) + for i := 0; i < 10; i++ { + go func() { + defer waitGroup.Done() + tracker.Release(10) + }() + } + waitGroup.Wait() + // call GC() twice to workaround as the same way GO does due to GC() returns without finishing sweep + // https://github.com/golang/go/issues/45315 + runtime.GC() + runtime.GC() + require.Equal(t, int64(0), tracker.BytesConsumed()) + require.Equal(t, int64(0), parentTracker.BytesConsumed()) + require.Equal(t, int64(0), tracker.BytesReleased()) + require.Equal(t, int64(0), parentTracker.BytesReleased()) +} + +func TestBufferedConsumeAndRelease(t *testing.T) { + debug.SetGCPercent(-1) + defer debug.SetGCPercent(100) + parentTracker := NewGlobalTracker(LabelForGlobalAnalyzeMemory, -1) + tracker := NewTracker(1, -1) + tracker.AttachToGlobalTracker(parentTracker) + require.Equal(t, int64(0), tracker.BytesConsumed()) + EnableGCAwareMemoryTrack.Store(true) + bufferedMemSize := int64(0) + tracker.BufferedConsume(&bufferedMemSize, int64(TrackMemWhenExceeds)/2) + require.Equal(t, int64(0), tracker.BytesConsumed()) + tracker.BufferedConsume(&bufferedMemSize, int64(TrackMemWhenExceeds)/2) + require.Equal(t, int64(TrackMemWhenExceeds), tracker.BytesConsumed()) + bufferedReleaseSize := int64(0) + tracker.BufferedRelease(&bufferedReleaseSize, int64(TrackMemWhenExceeds)/2) + require.Equal(t, int64(TrackMemWhenExceeds), parentTracker.BytesConsumed()) + require.Equal(t, int64(0), parentTracker.BytesReleased()) + tracker.BufferedRelease(&bufferedReleaseSize, int64(TrackMemWhenExceeds)/2) + require.Equal(t, int64(0), parentTracker.BytesConsumed()) + require.Equal(t, int64(TrackMemWhenExceeds), parentTracker.BytesReleased()) + // call GC() twice to workaround as the same way GO does due to GC() returns without finishing sweep + // https://github.com/golang/go/issues/45315 + runtime.GC() + runtime.GC() + require.Equal(t, int64(0), parentTracker.BytesReleased()) +} + func TestOOMAction(t *testing.T) { tracker := NewTracker(1, 100) // make sure no panic here. diff --git a/util/misc.go b/util/misc.go index 9434ee3f98106..cad205c1c746f 100644 --- a/util/misc.go +++ b/util/misc.go @@ -16,6 +16,10 @@ package util import ( "context" + "crypto" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/elliptic" "crypto/rand" "crypto/rsa" "crypto/tls" @@ -98,7 +102,7 @@ func WithRecovery(exec func(), recoverFn func(r interface{})) { // recoverFn: Handler will be called after recover and before dump stack, passing `nil` means noop. // quit: If this value is true, the current program exits after recovery. func Recover(metricsLabel, funcInfo string, recoverFn func(), quit bool) { - r := recover() + r := recover() //nolint: revive if r == nil { return } @@ -525,7 +529,6 @@ func LoadTLSCertificates(ca, key, cert string, autoTLS bool, rsaKeySize int) (tl cipherNames = append(cipherNames, sc.Name) cipherSuites = append(cipherSuites, sc.ID) } - } logutil.BgLogger().Info("Enabled ciphersuites", zap.Strings("cipherNames", cipherNames)) @@ -615,12 +618,9 @@ func QueryStrForLog(query string) string { return query } -func createTLSCertificates(certpath string, keypath string, rsaKeySize int) error { - privkey, err := rsa.GenerateKey(rand.Reader, rsaKeySize) - if err != nil { - return err - } - +// CreateCertificates creates and writes a cert based on the params. +func CreateCertificates(certpath string, keypath string, rsaKeySize int, pubKeyAlgo x509.PublicKeyAlgorithm, + signAlgo x509.SignatureAlgorithm) error { certValidity := 90 * 24 * time.Hour // 90 days notBefore := time.Now() notAfter := notBefore.Add(certValidity) @@ -633,14 +633,29 @@ func createTLSCertificates(certpath string, keypath string, rsaKeySize int) erro Subject: pkix.Name{ CommonName: "TiDB_Server_Auto_Generated_Server_Certificate", }, - SerialNumber: big.NewInt(1), - NotBefore: notBefore, - NotAfter: notAfter, - DNSNames: []string{hostname}, + SerialNumber: big.NewInt(1), + NotBefore: notBefore, + NotAfter: notAfter, + DNSNames: []string{hostname}, + SignatureAlgorithm: signAlgo, + } + + var privKey crypto.Signer + switch pubKeyAlgo { + case x509.RSA: + privKey, err = rsa.GenerateKey(rand.Reader, rsaKeySize) + case x509.ECDSA: + privKey, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + case x509.Ed25519: + _, privKey, err = ed25519.GenerateKey(rand.Reader) + default: + return errors.Errorf("unknown public key algorithm: %s", pubKeyAlgo.String()) + } + if err != nil { + return err } - // DER: Distinguished Encoding Rules, this is the ASN.1 encoding rule of the certificate. - derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privkey.PublicKey, privkey) + derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, privKey.Public(), privKey) if err != nil { return err } @@ -661,7 +676,7 @@ func createTLSCertificates(certpath string, keypath string, rsaKeySize int) erro return err } - privBytes, err := x509.MarshalPKCS8PrivateKey(privkey) + privBytes, err := x509.MarshalPKCS8PrivateKey(privKey) if err != nil { return err } @@ -678,3 +693,8 @@ func createTLSCertificates(certpath string, keypath string, rsaKeySize int) erro zap.Duration("validity", certValidity), zap.Int("rsaKeySize", rsaKeySize)) return nil } + +func createTLSCertificates(certpath string, keypath string, rsaKeySize int) error { + // use RSA and unspecified signature algorithm + return CreateCertificates(certpath, keypath, rsaKeySize, x509.RSA, x509.UnknownSignatureAlgorithm) +} diff --git a/util/mock/BUILD.bazel b/util/mock/BUILD.bazel index a438de7ec2cb5..d5c9c1adbae3b 100644 --- a/util/mock/BUILD.bazel +++ b/util/mock/BUILD.bazel @@ -37,6 +37,7 @@ go_library( go_test( name = "mock_test", + timeout = "short", srcs = [ "iter_test.go", "main_test.go", diff --git a/util/mock/client.go b/util/mock/client.go index a8b64d9b1bf74..ffcf393cc99fd 100644 --- a/util/mock/client.go +++ b/util/mock/client.go @@ -28,6 +28,6 @@ type Client struct { } // Send implement kv.Client interface. -func (c *Client) Send(ctx context.Context, req *kv.Request, kv interface{}, option *kv.ClientSendOption) kv.Response { +func (c *Client) Send(_ context.Context, _ *kv.Request, _ interface{}, _ *kv.ClientSendOption) kv.Response { return c.MockResponse } diff --git a/util/mock/context.go b/util/mock/context.go index b8be5b9ddaaf9..06d1774c58566 100644 --- a/util/mock/context.go +++ b/util/mock/context.go @@ -38,6 +38,7 @@ import ( "github.com/pingcap/tidb/util/topsql/stmtstats" "github.com/pingcap/tipb/go-binlog" "github.com/tikv/client-go/v2/oracle" + "github.com/tikv/client-go/v2/tikv" ) var ( @@ -61,9 +62,33 @@ type Context struct { type wrapTxn struct { kv.Transaction + tsFuture oracle.Future } -func (txn *wrapTxn) Wait(_ context.Context, _ sessionctx.Context) (kv.Transaction, error) { +func (txn *wrapTxn) validOrPending() bool { + return txn.tsFuture != nil || txn.Transaction.Valid() +} + +func (txn *wrapTxn) pending() bool { + return txn.Transaction == nil && txn.tsFuture != nil +} + +// Wait creates a new kvTransaction +func (txn *wrapTxn) Wait(_ context.Context, sctx sessionctx.Context) (kv.Transaction, error) { + if !txn.validOrPending() { + return txn, errors.AddStack(kv.ErrInvalidTxn) + } + if txn.pending() { + ts, err := txn.tsFuture.Wait() + if err != nil { + return nil, err + } + kvTxn, err := sctx.GetStore().Begin(tikv.WithStartTS(ts)) + if err != nil { + return nil, errors.Trace(err) + } + txn.Transaction = kvTxn + } return txn, nil } @@ -86,12 +111,12 @@ func (txn *wrapTxn) GetTableInfo(id int64) *model.TableInfo { } // Execute implements sqlexec.SQLExecutor Execute interface. -func (c *Context) Execute(ctx context.Context, sql string) ([]sqlexec.RecordSet, error) { +func (*Context) Execute(_ context.Context, _ string) ([]sqlexec.RecordSet, error) { return nil, errors.Errorf("Not Supported") } // ExecuteStmt implements sqlexec.SQLExecutor ExecuteStmt interface. -func (c *Context) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlexec.RecordSet, error) { +func (*Context) ExecuteStmt(_ context.Context, _ ast.StmtNode) (sqlexec.RecordSet, error) { return nil, errors.Errorf("Not Supported") } @@ -106,17 +131,17 @@ func (c *Context) ClearDiskFullOpt() { } // ExecuteInternal implements sqlexec.SQLExecutor ExecuteInternal interface. -func (c *Context) ExecuteInternal(ctx context.Context, sql string, args ...interface{}) (sqlexec.RecordSet, error) { +func (*Context) ExecuteInternal(_ context.Context, _ string, _ ...interface{}) (sqlexec.RecordSet, error) { return nil, errors.Errorf("Not Supported") } // ShowProcess implements sessionctx.Context ShowProcess interface. -func (c *Context) ShowProcess() *util.ProcessInfo { +func (*Context) ShowProcess() *util.ProcessInfo { return &util.ProcessInfo{} } // IsDDLOwner checks whether this session is DDL owner. -func (c *Context) IsDDLOwner() bool { +func (*Context) IsDDLOwner() bool { return true } @@ -137,7 +162,7 @@ func (c *Context) ClearValue(key fmt.Stringer) { } // HasDirtyContent implements sessionctx.Context ClearValue interface. -func (c *Context) HasDirtyContent(tid int64) bool { +func (*Context) HasDirtyContent(_ int64) bool { return false } @@ -196,17 +221,15 @@ func (c *Context) GetDomainInfoSchema() sessionctx.InfoschemaMetaVersion { } // GetBuiltinFunctionUsage implements sessionctx.Context GetBuiltinFunctionUsage interface. -func (c *Context) GetBuiltinFunctionUsage() map[string]uint32 { +func (*Context) GetBuiltinFunctionUsage() map[string]uint32 { return make(map[string]uint32) } // BuiltinFunctionUsageInc implements sessionctx.Context. -func (c *Context) BuiltinFunctionUsageInc(scalarFuncSigName string) { - -} +func (*Context) BuiltinFunctionUsageInc(_ string) {} // GetGlobalSysVar implements GlobalVarAccessor GetGlobalSysVar interface. -func (c *Context) GetGlobalSysVar(ctx sessionctx.Context, name string) (string, error) { +func (*Context) GetGlobalSysVar(_ sessionctx.Context, name string) (string, error) { v := variable.GetSysVar(name) if v == nil { return "", variable.ErrUnknownSystemVar.GenWithStackByArgs(name) @@ -215,7 +238,7 @@ func (c *Context) GetGlobalSysVar(ctx sessionctx.Context, name string) (string, } // SetGlobalSysVar implements GlobalVarAccessor SetGlobalSysVar interface. -func (c *Context) SetGlobalSysVar(ctx sessionctx.Context, name string, value string) error { +func (*Context) SetGlobalSysVar(_ sessionctx.Context, name string, value string) error { v := variable.GetSysVar(name) if v == nil { return variable.ErrUnknownSystemVar.GenWithStackByArgs(name) @@ -250,7 +273,7 @@ func (c *Context) NewTxn(context.Context) error { } // NewStaleTxnWithStartTS implements the sessionctx.Context interface. -func (c *Context) NewStaleTxnWithStartTS(ctx context.Context, startTS uint64) error { +func (c *Context) NewStaleTxnWithStartTS(ctx context.Context, _ uint64) error { return c.NewTxn(ctx) } @@ -260,12 +283,12 @@ func (c *Context) RefreshTxnCtx(ctx context.Context) error { } // RefreshVars implements the sessionctx.Context interface. -func (c *Context) RefreshVars(ctx context.Context) error { +func (*Context) RefreshVars(_ context.Context) error { return nil } // RollbackTxn indicates an expected call of RollbackTxn. -func (c *Context) RollbackTxn(ctx context.Context) { +func (c *Context) RollbackTxn(_ context.Context) { defer c.sessionVars.SetInTxn(false) if c.txn.Valid() { terror.Log(c.txn.Rollback()) @@ -308,105 +331,110 @@ func (c *Context) GoCtx() context.Context { } // StoreQueryFeedback stores the query feedback. -func (c *Context) StoreQueryFeedback(_ interface{}) {} +func (*Context) StoreQueryFeedback(_ interface{}) {} // UpdateColStatsUsage updates the column stats usage. -func (c *Context) UpdateColStatsUsage(_ []model.TableColumnID) {} +func (*Context) UpdateColStatsUsage(_ []model.TableItemID) {} // StoreIndexUsage strores the index usage information. -func (c *Context) StoreIndexUsage(_ int64, _ int64, _ int64) {} +func (*Context) StoreIndexUsage(_ int64, _ int64, _ int64) {} // GetTxnWriteThroughputSLI implements the sessionctx.Context interface. -func (c *Context) GetTxnWriteThroughputSLI() *sli.TxnWriteThroughputSLI { +func (*Context) GetTxnWriteThroughputSLI() *sli.TxnWriteThroughputSLI { return &sli.TxnWriteThroughputSLI{} } // StmtCommit implements the sessionctx.Context interface. -func (c *Context) StmtCommit() {} +func (*Context) StmtCommit() {} // StmtRollback implements the sessionctx.Context interface. -func (c *Context) StmtRollback() { +func (*Context) StmtRollback() { } // StmtGetMutation implements the sessionctx.Context interface. -func (c *Context) StmtGetMutation(tableID int64) *binlog.TableMutation { +func (*Context) StmtGetMutation(_ int64) *binlog.TableMutation { return nil } // AddTableLock implements the sessionctx.Context interface. -func (c *Context) AddTableLock(_ []model.TableLockTpInfo) { +func (*Context) AddTableLock(_ []model.TableLockTpInfo) { } // ReleaseTableLocks implements the sessionctx.Context interface. -func (c *Context) ReleaseTableLocks(locks []model.TableLockTpInfo) { +func (*Context) ReleaseTableLocks(_ []model.TableLockTpInfo) { } // ReleaseTableLockByTableIDs implements the sessionctx.Context interface. -func (c *Context) ReleaseTableLockByTableIDs(tableIDs []int64) { +func (*Context) ReleaseTableLockByTableIDs(_ []int64) { } // CheckTableLocked implements the sessionctx.Context interface. -func (c *Context) CheckTableLocked(_ int64) (bool, model.TableLockType) { +func (*Context) CheckTableLocked(_ int64) (bool, model.TableLockType) { return false, model.TableLockNone } // GetAllTableLocks implements the sessionctx.Context interface. -func (c *Context) GetAllTableLocks() []model.TableLockTpInfo { +func (*Context) GetAllTableLocks() []model.TableLockTpInfo { return nil } // ReleaseAllTableLocks implements the sessionctx.Context interface. -func (c *Context) ReleaseAllTableLocks() { +func (*Context) ReleaseAllTableLocks() { } // HasLockedTables implements the sessionctx.Context interface. -func (c *Context) HasLockedTables() bool { +func (*Context) HasLockedTables() bool { return false } // PrepareTSFuture implements the sessionctx.Context interface. -func (c *Context) PrepareTSFuture(ctx context.Context, future oracle.Future, scope string) error { +func (c *Context) PrepareTSFuture(_ context.Context, future oracle.Future, _ string) error { + c.txn.Transaction = nil + c.txn.tsFuture = future return nil } -// GetPreparedTxnFuture returns the prepared ts future +// GetPreparedTxnFuture returns the TxnFuture if it is prepared. +// It returns nil otherwise. func (c *Context) GetPreparedTxnFuture() sessionctx.TxnFuture { + if !c.txn.validOrPending() { + return nil + } return &c.txn } // GetStmtStats implements the sessionctx.Context interface. -func (c *Context) GetStmtStats() *stmtstats.StatementStats { +func (*Context) GetStmtStats() *stmtstats.StatementStats { return nil } // GetAdvisoryLock acquires an advisory lock -func (c *Context) GetAdvisoryLock(lockName string, timeout int64) error { +func (*Context) GetAdvisoryLock(_ string, _ int64) error { return nil } // ReleaseAdvisoryLock releases an advisory lock -func (c *Context) ReleaseAdvisoryLock(lockName string) bool { +func (*Context) ReleaseAdvisoryLock(_ string) bool { return true } // ReleaseAllAdvisoryLocks releases all advisory locks -func (c *Context) ReleaseAllAdvisoryLocks() int { +func (*Context) ReleaseAllAdvisoryLocks() int { return 0 } // EncodeSessionStates implements sessionctx.Context EncodeSessionStates interface. -func (c *Context) EncodeSessionStates(context.Context, sessionctx.Context, *sessionstates.SessionStates) error { +func (*Context) EncodeSessionStates(context.Context, sessionctx.Context, *sessionstates.SessionStates) error { return errors.Errorf("Not Supported") } // DecodeSessionStates implements sessionctx.Context DecodeSessionStates interface. -func (c *Context) DecodeSessionStates(context.Context, sessionctx.Context, *sessionstates.SessionStates) error { +func (*Context) DecodeSessionStates(context.Context, sessionctx.Context, *sessionstates.SessionStates) error { return errors.Errorf("Not Supported") } // Close implements the sessionctx.Context interface. -func (c *Context) Close() { -} +func (*Context) Close() {} // NewContext creates a new mocked sessionctx.Context. func NewContext() *Context { @@ -423,6 +451,8 @@ func NewContext() *Context { sctx.sessionVars.StmtCtx.MemTracker = memory.NewTracker(-1, -1) sctx.sessionVars.StmtCtx.DiskTracker = disk.NewTracker(-1, -1) sctx.sessionVars.GlobalVarsAccessor = variable.NewMockGlobalAccessor() + sctx.sessionVars.EnablePaging = variable.DefTiDBEnablePaging + sctx.sessionVars.MinPagingSize = variable.DefMinPagingSize if err := sctx.GetSessionVars().SetSystemVar(variable.MaxAllowedPacket, "67108864"); err != nil { panic(err) } diff --git a/util/mock/store.go b/util/mock/store.go index 9d0ba2815cda5..3e5784fdb4d5a 100644 --- a/util/mock/store.go +++ b/util/mock/store.go @@ -32,51 +32,51 @@ type Store struct { func (s *Store) GetClient() kv.Client { return s.Client } // GetMPPClient implements kv.Storage interface. -func (s *Store) GetMPPClient() kv.MPPClient { return nil } +func (*Store) GetMPPClient() kv.MPPClient { return nil } // GetOracle implements kv.Storage interface. -func (s *Store) GetOracle() oracle.Oracle { return nil } +func (*Store) GetOracle() oracle.Oracle { return nil } // Begin implements kv.Storage interface. -func (s *Store) Begin(opts ...tikv.TxnOption) (kv.Transaction, error) { return nil, nil } +func (*Store) Begin(_ ...tikv.TxnOption) (kv.Transaction, error) { return nil, nil } // GetSnapshot implements kv.Storage interface. -func (s *Store) GetSnapshot(ver kv.Version) kv.Snapshot { return nil } +func (*Store) GetSnapshot(_ kv.Version) kv.Snapshot { return nil } // Close implements kv.Storage interface. -func (s *Store) Close() error { return nil } +func (*Store) Close() error { return nil } // UUID implements kv.Storage interface. -func (s *Store) UUID() string { return "mock" } +func (*Store) UUID() string { return "mock" } // CurrentVersion implements kv.Storage interface. -func (s *Store) CurrentVersion(txnScope string) (kv.Version, error) { return kv.Version{}, nil } +func (*Store) CurrentVersion(_ string) (kv.Version, error) { return kv.Version{}, nil } // SupportDeleteRange implements kv.Storage interface. -func (s *Store) SupportDeleteRange() bool { return false } +func (*Store) SupportDeleteRange() bool { return false } // Name implements kv.Storage interface. -func (s *Store) Name() string { return "UtilMockStorage" } +func (*Store) Name() string { return "UtilMockStorage" } // Describe implements kv.Storage interface. -func (s *Store) Describe() string { +func (*Store) Describe() string { return "UtilMockStorage is a mock Store implementation, only for unittests in util package" } // GetMemCache implements kv.Storage interface -func (s *Store) GetMemCache() kv.MemManager { +func (*Store) GetMemCache() kv.MemManager { return nil } // ShowStatus implements kv.Storage interface. -func (s *Store) ShowStatus(ctx context.Context, key string) (interface{}, error) { return nil, nil } +func (*Store) ShowStatus(_ context.Context, _ string) (interface{}, error) { return nil, nil } // GetMinSafeTS implements kv.Storage interface. -func (s *Store) GetMinSafeTS(txnScope string) uint64 { +func (*Store) GetMinSafeTS(_ string) uint64 { return 0 } // GetLockWaits implements kv.Storage interface. -func (s *Store) GetLockWaits() ([]*deadlockpb.WaitForEntry, error) { +func (*Store) GetLockWaits() ([]*deadlockpb.WaitForEntry, error) { return nil, nil } diff --git a/util/mvmap/BUILD.bazel b/util/mvmap/BUILD.bazel index b6a1819054206..9171f5cd8f8cb 100644 --- a/util/mvmap/BUILD.bazel +++ b/util/mvmap/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "mvmap_test", + timeout = "short", srcs = [ "bench_test.go", "main_test.go", diff --git a/util/paging/BUILD.bazel b/util/paging/BUILD.bazel index f07dbeb8ff1f9..9f7c24e6c8045 100644 --- a/util/paging/BUILD.bazel +++ b/util/paging/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "paging_test", + timeout = "short", srcs = [ "main_test.go", "paging_test.go", diff --git a/util/paging/paging.go b/util/paging/paging.go index 5f2618ea341db..510e1847fbc2b 100644 --- a/util/paging/paging.go +++ b/util/paging/paging.go @@ -17,16 +17,15 @@ package paging import "math" // A paging request may be separated into multi requests if there are more data than a page. -// The paging size grows from min to max, it's not well tuned yet. -// e.g. a paging request scans over range (r1, r200), it requires 64 rows in the first batch, +// The paging size grows from min to max. See https://github.com/pingcap/tidb/issues/36328 +// e.g. a paging request scans over range (r1, r200), it requires 128 rows in the first batch, // if it's not drained, then the paging size grows, the new range is calculated like (r100, r200), then send a request again. // Compare with the common unary request, paging request allows early access of data, it offers a streaming-like way processing data. -// TODO: may make the paging parameters configurable. const ( - MinPagingSize uint64 = 64 + MinPagingSize uint64 = 128 maxPagingSizeShift = 7 pagingSizeGrow = 2 - MaxPagingSize = MinPagingSize << maxPagingSizeShift + MaxPagingSize = 8192 pagingGrowingSum = ((2 << maxPagingSizeShift) - 1) * MinPagingSize Threshold uint64 = 960 ) diff --git a/util/paging/paging_test.go b/util/paging/paging_test.go index 1890b4d754d54..6d9bba9121e86 100644 --- a/util/paging/paging_test.go +++ b/util/paging/paging_test.go @@ -22,8 +22,8 @@ import ( func TestGrowPagingSize(t *testing.T) { require.Equal(t, GrowPagingSize(MinPagingSize), MinPagingSize*pagingSizeGrow) - require.Equal(t, GrowPagingSize(MaxPagingSize), MaxPagingSize) - require.Equal(t, GrowPagingSize(MaxPagingSize/pagingSizeGrow+1), MaxPagingSize) + require.Equal(t, GrowPagingSize(MaxPagingSize), uint64(MaxPagingSize)) + require.Equal(t, GrowPagingSize(MaxPagingSize/pagingSizeGrow+1), uint64(MaxPagingSize)) } func TestCalculateSeekCnt(t *testing.T) { diff --git a/util/parser/BUILD.bazel b/util/parser/BUILD.bazel index bc2fed3317381..999c032219586 100644 --- a/util/parser/BUILD.bazel +++ b/util/parser/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "parser_test", + timeout = "short", srcs = [ "ast_test.go", "main_test.go", diff --git a/util/parser/ast.go b/util/parser/ast.go index 91ac97871021b..f9ab939c03bb3 100644 --- a/util/parser/ast.go +++ b/util/parser/ast.go @@ -44,11 +44,12 @@ func (i *implicitDatabase) Enter(in ast.Node) (out ast.Node, skipChildren bool) i.hasImplicit = true } return in, true + default: + return in, i.hasImplicit } - return in, i.hasImplicit } -func (i *implicitDatabase) Leave(in ast.Node) (out ast.Node, ok bool) { +func (*implicitDatabase) Leave(in ast.Node) (out ast.Node, ok bool) { return in, true } diff --git a/util/parser/parser.go b/util/parser/parser.go index 441ddbcf26183..bcd02facd8818 100644 --- a/util/parser/parser.go +++ b/util/parser/parser.go @@ -27,9 +27,10 @@ var ( ) // Match matches the `pat` at least `times`, and returns the match, the rest and the error -func Match(buf string, pat func(byte) bool, times int) (string, string, error) { - var i int - for i = 0; i < len(buf) && pat(buf[i]); i++ { +func Match(buf string, pat func(byte) bool, times int) (match string, rest string, err error) { + var i int = 0 + for i < len(buf) && pat(buf[i]) { + i++ } if i < times { return "", buf, ErrPatternNotMatch @@ -84,7 +85,7 @@ func Space0(buf string) string { } // Digit matches at least `times` digits -func Digit(buf string, times int) (string, string, error) { +func Digit(buf string, times int) (match string, rest string, err error) { return Match(buf, func(c byte) bool { return unicode.IsDigit(rune(c)) }, times) diff --git a/util/plancodec/BUILD.bazel b/util/plancodec/BUILD.bazel index 199bde529da8a..c9709e3d298d7 100644 --- a/util/plancodec/BUILD.bazel +++ b/util/plancodec/BUILD.bazel @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "plancodec", srcs = [ + "binary_plan_decode.go", "codec.go", "id.go", ], @@ -10,14 +11,18 @@ go_library( visibility = ["//visibility:public"], deps = [ "//kv", + "//util/hack", + "//util/memory", "//util/texttree", "@com_github_golang_snappy//:snappy", "@com_github_pingcap_errors//:errors", + "@com_github_pingcap_tipb//go-tipb", ], ) go_test( name = "plancodec_test", + timeout = "short", srcs = [ "codec_test.go", "id_test.go", diff --git a/util/plancodec/binary_plan_decode.go b/util/plancodec/binary_plan_decode.go new file mode 100644 index 0000000000000..74f5c097bc94d --- /dev/null +++ b/util/plancodec/binary_plan_decode.go @@ -0,0 +1,300 @@ +// 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 plancodec + +import ( + "strconv" + "strings" + + "github.com/pingcap/tidb/util/memory" + "github.com/pingcap/tidb/util/texttree" + "github.com/pingcap/tipb/go-tipb" +) + +// DecodeBinaryPlan decode the binary plan and display it similar to EXPLAIN ANALYZE statement. +func DecodeBinaryPlan(binaryPlan string) (string, error) { + protoBytes, err := decompress(binaryPlan) + if err != nil { + return "", err + } + pb := &tipb.ExplainData{} + err = pb.Unmarshal(protoBytes) + if err != nil { + return "", err + } + if pb.DiscardedDueToTooLong { + return planDiscardedDecoded, nil + } + // 1. decode the protobuf into strings + rows := decodeBinaryOperator(pb.Main, "", true, pb.WithRuntimeStats, nil) + for _, cte := range pb.Ctes { + rows = decodeBinaryOperator(cte, "", true, pb.WithRuntimeStats, rows) + } + if len(rows) == 0 { + return "", nil + } + + // 2. calculate the max length of each column and the total length + // Because the text tree part of the "id" column contains characters that consist of multiple bytes, we need the + // lengths calculated in bytes and runes both. Length in bytes is for preallocating memory. Length in runes is + // for padding space to align the content. + runeMaxLens, byteMaxLens := calculateMaxFieldLens(rows, pb.WithRuntimeStats) + singleRowLen := 0 + for _, fieldLen := range byteMaxLens { + singleRowLen += fieldLen + // every field begins with "| " and ends with " " + singleRowLen += 3 + } + // every row ends with " |\n" + singleRowLen += 3 + // length for a row * (row count + 1(for title row)) + totalBytes := singleRowLen * (len(rows) + 1) + // there is a "\n" at the beginning + totalBytes++ + + // 3. format the strings and get the final result + var b strings.Builder + b.Grow(totalBytes) + var titleFields []string + if pb.WithRuntimeStats { + titleFields = fullTitleFields + } else { + titleFields = noRuntimeStatsTitleFields + } + b.WriteString("\n") + for i, str := range titleFields { + b.WriteString("| ") + b.WriteString(str) + if len([]rune(str)) < runeMaxLens[i] { + // append spaces to align the content + b.WriteString(strings.Repeat(" ", runeMaxLens[i]-len([]rune(str)))) + } + b.WriteString(" ") + if i == len(titleFields)-1 { + b.WriteString(" |\n") + } + } + for _, row := range rows { + for i, str := range row { + b.WriteString("| ") + b.WriteString(str) + if len([]rune(str)) < runeMaxLens[i] { + // append spaces to align the content + b.WriteString(strings.Repeat(" ", runeMaxLens[i]-len([]rune(str)))) + } + b.WriteString(" ") + if i == len(titleFields)-1 { + b.WriteString(" |\n") + } + } + } + return b.String(), nil +} + +var ( + noRuntimeStatsTitleFields = []string{"id", "estRows", "estCost", "task", "access object", "operator info"} + fullTitleFields = []string{"id", "estRows", "estCost", "actRows", "task", "access object", "execution info", "operator info", "memory", "disk"} +) + +func calculateMaxFieldLens(rows [][]string, hasRuntimeStats bool) (runeLens, byteLens []int) { + runeLens = make([]int, len(rows[0])) + byteLens = make([]int, len(rows[0])) + for _, row := range rows { + for i, field := range row { + if runeLens[i] < len([]rune(field)) { + runeLens[i] = len([]rune(field)) + } + if byteLens[i] < len(field) { + byteLens[i] = len(field) + } + } + } + var titleFields []string + if hasRuntimeStats { + titleFields = fullTitleFields + } else { + titleFields = noRuntimeStatsTitleFields + } + for i := range byteLens { + if runeLens[i] < len([]rune(titleFields[i])) { + runeLens[i] = len([]rune(titleFields[i])) + } + if byteLens[i] < len(titleFields[i]) { + byteLens[i] = len(titleFields[i]) + } + } + return +} + +func decodeBinaryOperator(op *tipb.ExplainOperator, indent string, isLastChild, hasRuntimeStats bool, out [][]string) [][]string { + row := make([]string, 0, 10) + + // 1. extract the information and turn them into strings for display + explainID := texttree.PrettyIdentifier(op.Name+printDriverSide(op.Labels), indent, isLastChild) + estRows := strconv.FormatFloat(op.EstRows, 'f', 2, 64) + cost := strconv.FormatFloat(op.Cost, 'f', 2, 64) + var actRows, execInfo, memInfo, diskInfo string + if hasRuntimeStats { + actRows = strconv.FormatInt(int64(op.ActRows), 10) + execInfo = op.RootBasicExecInfo + groupExecInfo := strings.Join(op.RootGroupExecInfo, ",") + if len(groupExecInfo) > 0 { + if len(execInfo) > 0 { + execInfo += ", " + } + execInfo += groupExecInfo + } + if len(op.CopExecInfo) > 0 { + if len(execInfo) > 0 { + execInfo += ", " + } + execInfo += op.CopExecInfo + } + if op.MemoryBytes < 0 { + memInfo = "N/A" + } else { + memInfo = memory.FormatBytes(op.MemoryBytes) + } + if op.DiskBytes < 0 { + diskInfo = "N/A" + } else { + diskInfo = memory.FormatBytes(op.DiskBytes) + } + } + task := op.TaskType.String() + if op.TaskType != tipb.TaskType_unknown && op.TaskType != tipb.TaskType_root { + task = task + "[" + op.StoreType.String() + "]" + } + accessObject := printAccessObject(op.AccessObjects) + + // 2. append the strings to the slice + row = append(row, explainID, estRows, cost) + if hasRuntimeStats { + row = append(row, actRows) + } + row = append(row, task, accessObject) + if hasRuntimeStats { + row = append(row, execInfo) + } + row = append(row, op.OperatorInfo) + if hasRuntimeStats { + row = append(row, memInfo, diskInfo) + } + out = append(out, row) + + // 3. recursively process the children + children := make([]*tipb.ExplainOperator, len(op.Children)) + copy(children, op.Children) + if len(children) == 2 && + len(children[0].Labels) >= 1 && + children[0].Labels[0] == tipb.OperatorLabel_probeSide && + len(children[1].Labels) >= 1 && + children[1].Labels[0] == tipb.OperatorLabel_buildSide { + children[0], children[1] = children[1], children[0] + } + childIndent := texttree.Indent4Child(indent, isLastChild) + for i, child := range children { + out = decodeBinaryOperator(child, childIndent, i == len(children)-1, hasRuntimeStats, out) + } + return out +} + +func printDriverSide(labels []tipb.OperatorLabel) string { + strs := make([]string, 0, len(labels)) + for _, label := range labels { + switch label { + case tipb.OperatorLabel_empty: + strs = append(strs, "") + case tipb.OperatorLabel_buildSide: + strs = append(strs, "(Build)") + case tipb.OperatorLabel_probeSide: + strs = append(strs, "(Probe)") + case tipb.OperatorLabel_seedPart: + strs = append(strs, "(Seed Part)") + case tipb.OperatorLabel_recursivePart: + strs = append(strs, "(Recursive Part)") + } + } + return strings.Join(strs, "") +} + +func printDynamicPartitionObject(ao *tipb.DynamicPartitionAccessObject) string { + if ao == nil { + return "" + } + if ao.AllPartitions { + return "partition:all" + } else if len(ao.Partitions) == 0 { + return "partition:dual" + } + return "partition:" + strings.Join(ao.Partitions, ",") +} + +func printAccessObject(pbAccessObjs []*tipb.AccessObject) string { + strs := make([]string, 0, len(pbAccessObjs)) + for _, pbAccessObj := range pbAccessObjs { + switch ao := pbAccessObj.AccessObject.(type) { + case *tipb.AccessObject_DynamicPartitionObjects: + if ao == nil || ao.DynamicPartitionObjects == nil { + return "" + } + aos := ao.DynamicPartitionObjects.Objects + if len(aos) == 0 { + return "" + } + // If it only involves one table, just print the partitions. + if len(aos) == 1 { + return printDynamicPartitionObject(aos[0]) + } + var b strings.Builder + // If it involves multiple tables, we also need to print the table name. + for i, access := range aos { + if access == nil { + continue + } + if i != 0 { + b.WriteString(", ") + } + b.WriteString(printDynamicPartitionObject(access)) + b.WriteString(" of " + access.Table) + } + strs = append(strs, b.String()) + case *tipb.AccessObject_ScanObject: + if ao == nil || ao.ScanObject == nil { + return "" + } + scanAO := ao.ScanObject + var b strings.Builder + if len(scanAO.Table) > 0 { + b.WriteString("table:" + scanAO.Table) + } + if len(scanAO.Partitions) > 0 { + b.WriteString(", partition:" + strings.Join(scanAO.Partitions, ",")) + } + for _, index := range scanAO.Indexes { + if index.IsClusteredIndex { + b.WriteString(", clustered index:") + } else { + b.WriteString(", index:") + } + b.WriteString(index.Name + "(" + strings.Join(index.Cols, ", ") + ")") + } + strs = append(strs, b.String()) + case *tipb.AccessObject_OtherObject: + strs = append(strs, ao.OtherObject) + } + } + return strings.Join(strs, "") +} diff --git a/util/plancodec/codec.go b/util/plancodec/codec.go index 28284020aca16..179ef945d23ff 100644 --- a/util/plancodec/codec.go +++ b/util/plancodec/codec.go @@ -25,7 +25,9 @@ import ( "github.com/golang/snappy" "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/texttree" + "github.com/pingcap/tipb/go-tipb" ) const ( @@ -45,6 +47,15 @@ var ( // PlanDiscardedEncoded indicates the discard plan because it is too long PlanDiscardedEncoded = "[discard]" planDiscardedDecoded = "(plan discarded because too long)" + // BinaryPlanDiscardedEncoded is a special binary plan that represents it's discarded because of too long. + BinaryPlanDiscardedEncoded = func() string { + binary := &tipb.ExplainData{DiscardedDueToTooLong: true} + proto, err := binary.Marshal() + if err != nil { + return "" + } + return Compress(proto) + }() ) var decoderPool = sync.Pool{ @@ -92,14 +103,14 @@ type planInfo struct { } func (pd *planDecoder) decode(planString string) (string, error) { - str, err := decompress(planString) + b, err := decompress(planString) if err != nil { if planString == PlanDiscardedEncoded { return planDiscardedDecoded, nil } return "", err } - return pd.buildPlanTree(str) + return pd.buildPlanTree(string(hack.String(b))) } func (pd *planDecoder) buildPlanTree(planString string) (string, error) { @@ -323,7 +334,7 @@ func decodePlanInfo(str string) (*planInfo, error) { } // EncodePlanNode is used to encode the plan to a string. -func EncodePlanNode(depth, pid int, planType string, rowCount float64, +func EncodePlanNode(depth int, pid, planType string, rowCount float64, taskTypeInfo, explainInfo, actRows, analyzeInfo, memoryInfo, diskInfo string, buf *bytes.Buffer) { explainInfo = escapeString(explainInfo) buf.WriteString(strconv.Itoa(depth)) @@ -371,9 +382,9 @@ func NormalizePlanNode(depth int, planType string, taskTypeInfo string, explainI buf.WriteByte(lineBreaker) } -func encodeID(planType string, id int) string { +func encodeID(planType, id string) string { planID := TypeStringToPhysicalID(planType) - return strconv.Itoa(planID) + idSeparator + strconv.Itoa(id) + return strconv.Itoa(planID) + idSeparator + id } // EncodeTaskType is used to encode task type to a string. @@ -409,21 +420,21 @@ func decodeTaskType(str string) (string, error) { return "cop[" + ((kv.StoreType)(storeType)).Name() + "]", nil } -// Compress is used to compress the input with zlib. +// Compress compresses the input with snappy then encodes it with base64. func Compress(input []byte) string { compressBytes := snappy.Encode(nil, input) return base64.StdEncoding.EncodeToString(compressBytes) } -func decompress(str string) (string, error) { +func decompress(str string) ([]byte, error) { decodeBytes, err := base64.StdEncoding.DecodeString(str) if err != nil { - return "", err + return nil, err } bs, err := snappy.Decode(nil, decodeBytes) if err != nil { - return "", err + return nil, err } - return string(bs), nil + return bs, nil } diff --git a/util/printer/BUILD.bazel b/util/printer/BUILD.bazel index a39b3d7170e7a..e64b34df78622 100644 --- a/util/printer/BUILD.bazel +++ b/util/printer/BUILD.bazel @@ -17,6 +17,7 @@ go_library( go_test( name = "printer_test", + timeout = "short", srcs = [ "main_test.go", "printer_test.go", diff --git a/util/profile/BUILD.bazel b/util/profile/BUILD.bazel index e868e3200d0c6..bed70150e7c00 100644 --- a/util/profile/BUILD.bazel +++ b/util/profile/BUILD.bazel @@ -20,6 +20,7 @@ go_library( go_test( name = "profile_test", + timeout = "short", srcs = [ "flamegraph_test.go", "main_test.go", diff --git a/util/profile/profile.go b/util/profile/profile.go index 720a2ff1bd524..686b08c31499d 100644 --- a/util/profile/profile.go +++ b/util/profile/profile.go @@ -44,7 +44,7 @@ func (c *Collector) ProfileReaderToDatums(f io.Reader) ([][]types.Datum, error) return c.profileToDatums(p) } -func (c *Collector) profileToFlamegraphNode(p *profile.Profile) (*flamegraphNode, error) { +func (*Collector) profileToFlamegraphNode(p *profile.Profile) (*flamegraphNode, error) { err := p.CheckValid() if err != nil { return nil, err @@ -108,7 +108,7 @@ func (c *Collector) ProfileGraph(name string) ([][]types.Datum, error) { } // ParseGoroutines returns the groutine list for given string representation -func (c *Collector) ParseGoroutines(reader io.Reader) ([][]types.Datum, error) { +func (*Collector) ParseGoroutines(reader io.Reader) ([][]types.Datum, error) { content, err := io.ReadAll(reader) if err != nil { return nil, err diff --git a/util/promutil/BUILD.bazel b/util/promutil/BUILD.bazel index aaf715fd6cdf7..f49505157e266 100644 --- a/util/promutil/BUILD.bazel +++ b/util/promutil/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "promutil_test", + timeout = "short", srcs = ["registry_test.go"], embed = [":promutil"], deps = [ diff --git a/util/promutil/registry.go b/util/promutil/registry.go index dc13cb965e6de..f52f0bd359246 100644 --- a/util/promutil/registry.go +++ b/util/promutil/registry.go @@ -23,13 +23,13 @@ var _ Registry = noopRegistry{} type noopRegistry struct{} -func (noopRegistry) Register(collector prometheus.Collector) error { +func (noopRegistry) Register(_ prometheus.Collector) error { return nil } -func (noopRegistry) MustRegister(collector ...prometheus.Collector) {} +func (noopRegistry) MustRegister(_ ...prometheus.Collector) {} -func (noopRegistry) Unregister(collector prometheus.Collector) bool { +func (noopRegistry) Unregister(_ prometheus.Collector) bool { return true } diff --git a/util/ranger/BUILD.bazel b/util/ranger/BUILD.bazel index 6f331de00afb7..c5b4eb725fd27 100644 --- a/util/ranger/BUILD.bazel +++ b/util/ranger/BUILD.bazel @@ -36,6 +36,7 @@ go_library( go_test( name = "ranger_test", + timeout = "short", srcs = [ "main_test.go", "ranger_test.go", diff --git a/util/ranger/checker.go b/util/ranger/checker.go index cb3056c00bb70..c0ac86a453c59 100644 --- a/util/ranger/checker.go +++ b/util/ranger/checker.go @@ -80,14 +80,14 @@ func (c *conditionChecker) checkScalarFunction(scalar *expression.ScalarFunction return c.checkColumn(scalar.GetArgs()[0]) case ast.UnaryNot: // TODO: support "not like" convert to access conditions. - if s, ok := scalar.GetArgs()[0].(*expression.ScalarFunction); ok { - if s.FuncName.L == ast.Like { - return false - } - } else { + s, ok := scalar.GetArgs()[0].(*expression.ScalarFunction) + if !ok { // "not column" or "not constant" can't lead to a range. return false } + if s.FuncName.L == ast.Like { + return false + } return c.check(scalar.GetArgs()[0]) case ast.In: if !c.checkColumn(scalar.GetArgs()[0]) { @@ -131,7 +131,6 @@ func (c *conditionChecker) checkLikeFunc(scalar *expression.ScalarFunction) bool pattern, ok := scalar.GetArgs()[1].(*expression.Constant) if !ok { return false - } if pattern.Value.IsNull() { return false diff --git a/util/ranger/detacher.go b/util/ranger/detacher.go index cbde3ddef60c6..3d18126494f70 100644 --- a/util/ranger/detacher.go +++ b/util/ranger/detacher.go @@ -82,14 +82,14 @@ func detachColumnDNFConditions(sctx sessionctx.Context, conditions []expression. } rebuildCNF := expression.ComposeCNFCondition(sctx, columnCNFItems...) accessConditions = append(accessConditions, rebuildCNF) - } else if checker.check(cond) { + } else if !checker.check(cond) { + return nil, true + } else { accessConditions = append(accessConditions, cond) if checker.shouldReserve { hasResidualConditions = true checker.shouldReserve = checker.length != types.UnspecifiedLength } - } else { - return nil, true } } return accessConditions, hasResidualConditions @@ -662,7 +662,9 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression } } } - } else if firstColumnChecker.check(item) { + } else if !firstColumnChecker.check(item) { + return FullRange(), nil, nil, true, nil + } else { if firstColumnChecker.shouldReserve { hasResidual = true firstColumnChecker.shouldReserve = d.lengths[0] != types.UnspecifiedLength @@ -686,8 +688,6 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression columnValues[0] = nil } } - } else { - return FullRange(), nil, nil, true, nil } } @@ -894,7 +894,6 @@ func AddGcColumnCond(sctx sessionctx.Context, cols []*expression.Column, accessesCond []expression.Expression, columnValues []*valueInfo) ([]expression.Expression, error) { - if cond := accessesCond[1]; cond != nil { if f, ok := cond.(*expression.ScalarFunction); ok { switch f.FuncName.L { @@ -916,7 +915,6 @@ func AddGcColumnCond(sctx sessionctx.Context, func AddGcColumn4InCond(sctx sessionctx.Context, cols []*expression.Column, accessesCond []expression.Expression) ([]expression.Expression, error) { - var errRes error var newAccessCond []expression.Expression record := make([]types.Datum, 1) @@ -985,7 +983,6 @@ func AddGcColumn4EqCond(sctx sessionctx.Context, cols []*expression.Column, accessesCond []expression.Expression, columnValues []*valueInfo) ([]expression.Expression, error) { - expr := cols[0].VirtualExpr.Clone() record := make([]types.Datum, len(columnValues)-1) @@ -1026,7 +1023,6 @@ func AddGcColumn4EqCond(sctx sessionctx.Context, // @retval - the new condition after adding tidb_shard() prefix func AddExpr4EqAndInCondition(sctx sessionctx.Context, conditions []expression.Expression, cols []*expression.Column) ([]expression.Expression, error) { - accesses := make([]expression.Expression, len(cols)) columnValues := make([]*valueInfo, len(cols)) offsets := make([]int, len(conditions)) @@ -1096,7 +1092,6 @@ func NeedAddGcColumn4ShardIndex( cols []*expression.Column, accessCond []expression.Expression, columnValues []*valueInfo) bool { - // the columns of shard index shoude be more than 2, like (tidb_shard(a),a,...) // check cols and columnValues in the sub call function if len(accessCond) < 2 || len(cols) < 2 { diff --git a/util/ranger/points.go b/util/ranger/points.go index e731a8ccaa89b..0268c7d964bb9 100644 --- a/util/ranger/points.go +++ b/util/ranger/points.go @@ -114,7 +114,7 @@ func rangePointLess(sc *stmtctx.StatementContext, a, b *point, collator collate. return rangePointEqualValueLess(a, b), errors.Trace(err) } -func rangePointEnumLess(sc *stmtctx.StatementContext, a, b *point) (bool, error) { +func rangePointEnumLess(_ *stmtctx.StatementContext, a, b *point) (bool, error) { cmp := types.CompareInt64(a.value.GetInt64(), b.value.GetInt64()) if cmp != 0 { return cmp < 0, nil @@ -188,7 +188,7 @@ type builder struct { func (r *builder) build(expr expression.Expression, collator collate.Collator) []*point { switch x := expr.(type) { case *expression.Column: - return r.buildFromColumn(x) + return r.buildFromColumn() case *expression.ScalarFunction: return r.buildFromScalarFunc(x, collator) case *expression.Constant: @@ -220,7 +220,7 @@ func (r *builder) buildFromConstant(expr *expression.Constant) []*point { return getFullRange() } -func (r *builder) buildFromColumn(expr *expression.Column) []*point { +func (*builder) buildFromColumn() []*point { // column name expression is equivalent to column name is true. startPoint1 := &point{value: types.MinNotNullDatum(), start: true} endPoint1 := &point{excl: true} @@ -504,7 +504,7 @@ func handleEnumFromBinOp(sc *stmtctx.StatementContext, ft *types.FieldType, val return res } -func (r *builder) buildFromIsTrue(expr *expression.ScalarFunction, isNot int, keepNull bool) []*point { +func (*builder) buildFromIsTrue(_ *expression.ScalarFunction, isNot int, keepNull bool) []*point { if isNot == 1 { if keepNull { // Range is {[0, 0]} @@ -533,7 +533,7 @@ func (r *builder) buildFromIsTrue(expr *expression.ScalarFunction, isNot int, ke return []*point{startPoint1, endPoint1, startPoint2, endPoint2} } -func (r *builder) buildFromIsFalse(expr *expression.ScalarFunction, isNot int) []*point { +func (*builder) buildFromIsFalse(_ *expression.ScalarFunction, isNot int) []*point { if isNot == 1 { // NOT FALSE range is {[-inf, 0), (0, +inf], [null, null]} startPoint1 := &point{start: true} diff --git a/util/ranger/ranger.go b/util/ranger/ranger.go index 0aeae0ceca5ac..4481f739b6760 100644 --- a/util/ranger/ranger.go +++ b/util/ranger/ranger.go @@ -105,6 +105,7 @@ func convertPoint(sctx sessionctx.Context, point *point, tp *types.FieldType) (* // do not ignore these errors if in prepared plan building for safety return nil, errors.Trace(err) } + //revive:disable:empty-block if tp.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) { @@ -134,6 +135,7 @@ func convertPoint(sctx sessionctx.Context, point *point, tp *types.FieldType) (* } else { return point, errors.Trace(err) } + //revive:enable:empty-block } valCmpCasted, err := point.value.Compare(sc, &casted, collate.GetCollator(tp.GetCollate())) if err != nil { diff --git a/util/ranger/types.go b/util/ranger/types.go index b932650588f86..5f387ed0f469b 100644 --- a/util/ranger/types.go +++ b/util/ranger/types.go @@ -46,7 +46,7 @@ func (rs Ranges) Range() []*Range { } // Rebuild rebuilds this range. -func (rs Ranges) Rebuild() error { +func (Ranges) Rebuild() error { return nil } diff --git a/util/regexpr-router/BUILD.bazel b/util/regexpr-router/BUILD.bazel index 361067d88c1bf..3b1a2dfa8b3bd 100644 --- a/util/regexpr-router/BUILD.bazel +++ b/util/regexpr-router/BUILD.bazel @@ -14,6 +14,7 @@ go_library( go_test( name = "regexpr-router_test", + timeout = "short", srcs = ["regexpr_router_test.go"], embed = [":regexpr-router"], deps = [ diff --git a/util/regexpr-router/regexpr_router.go b/util/regexpr-router/regexpr_router.go index 4bc4563a470a0..48ebabb730a7d 100644 --- a/util/regexpr-router/regexpr_router.go +++ b/util/regexpr-router/regexpr_router.go @@ -108,7 +108,7 @@ func (r *RouteTable) AddRule(rule *router.TableRule) error { } // Route is to route table -func (r *RouteTable) Route(schema, table string) (string, string, error) { +func (r *RouteTable) Route(schema, table string) (targetSchema string, targetTable string, err error) { curTable := &filter.Table{ Schema: schema, Name: table, @@ -124,10 +124,6 @@ func (r *RouteTable) Route(schema, table string) (string, string, error) { } } } - var ( - targetSchema string - targetTable string - ) if table == "" || len(tblRules) == 0 { // 1. no need to match table or // 2. match no table @@ -158,11 +154,11 @@ func (r *RouteTable) AllRules() ([]router.TableRule, []router.TableRule) { schmRouteRules []router.TableRule tableRouteRules []router.TableRule ) - for _, filter := range r.filters { - if filter.typ == SchmFilter { - schmRouteRules = append(schmRouteRules, *filter.rawRule) + for _, f := range r.filters { + if f.typ == SchmFilter { + schmRouteRules = append(schmRouteRules, *f.rawRule) } else { - tableRouteRules = append(tableRouteRules, *filter.rawRule) + tableRouteRules = append(tableRouteRules, *f.rawRule) } } return schmRouteRules, tableRouteRules @@ -177,9 +173,9 @@ func (r *RouteTable) FetchExtendColumn(schema, table, source string) ([]string, Schema: schema, Name: table, } - for _, filter := range r.filters { - if filter.filter.Match(curTable) { - rules = append(rules, filter) + for _, f := range r.filters { + if f.filter.Match(curTable) { + rules = append(rules, f) } } var ( diff --git a/util/resourcegrouptag/BUILD.bazel b/util/resourcegrouptag/BUILD.bazel index 6047f0b7f9f8c..13d6c63293de2 100644 --- a/util/resourcegrouptag/BUILD.bazel +++ b/util/resourcegrouptag/BUILD.bazel @@ -18,6 +18,7 @@ go_library( go_test( name = "resourcegrouptag_test", + timeout = "short", srcs = [ "main_test.go", "resource_group_tag_test.go", diff --git a/util/rowDecoder/BUILD.bazel b/util/rowDecoder/BUILD.bazel index 7abf4578a8074..1bf06cf64d6d1 100644 --- a/util/rowDecoder/BUILD.bazel +++ b/util/rowDecoder/BUILD.bazel @@ -22,6 +22,7 @@ go_library( go_test( name = "rowDecoder_test", + timeout = "short", srcs = [ "decoder_test.go", "main_test.go", diff --git a/util/rowcodec/BUILD.bazel b/util/rowcodec/BUILD.bazel index 8a3457d5feb2e..b99642928ac0b 100644 --- a/util/rowcodec/BUILD.bazel +++ b/util/rowcodec/BUILD.bazel @@ -27,6 +27,7 @@ go_library( go_test( name = "rowcodec_test", + timeout = "short", srcs = [ "bench_test.go", "main_test.go", diff --git a/util/rowcodec/decoder.go b/util/rowcodec/decoder.go index 81c4c314fb599..b8b0da8ff8ad7 100644 --- a/util/rowcodec/decoder.go +++ b/util/rowcodec/decoder.go @@ -463,7 +463,7 @@ func (decoder *BytesDecoder) DecodeToBytes(outputOffset map[int64]int, handle kv return decoder.decodeToBytesInternal(outputOffset, handle, value, cacheBytes) } -func (decoder *BytesDecoder) encodeOldDatum(tp byte, val []byte) []byte { +func (*BytesDecoder) encodeOldDatum(tp byte, val []byte) []byte { buf := make([]byte, 0, 1+binary.MaxVarintLen64+len(val)) switch tp { case BytesFlag: diff --git a/util/rowcodec/row.go b/util/rowcodec/row.go index 0e6b1a9ede213..0f463c509cbcf 100644 --- a/util/rowcodec/row.go +++ b/util/rowcodec/row.go @@ -112,11 +112,11 @@ func (r *row) findColID(colID int64) (idx int, isNil, notFound bool) { } if v < colID { i = h + 1 - } else if v > colID { - j = h - } else { + } else if v == colID { idx = h return + } else { + j = h } } @@ -133,11 +133,11 @@ func (r *row) findColID(colID int64) (idx int, isNil, notFound bool) { } if v < colID { i = h + 1 - } else if v > colID { - j = h - } else { + } else if v == colID { isNil = true return + } else { + j = h } } notFound = true diff --git a/util/schemacmp/BUILD.bazel b/util/schemacmp/BUILD.bazel index 3d70a070d360c..35df7d02c8da5 100644 --- a/util/schemacmp/BUILD.bazel +++ b/util/schemacmp/BUILD.bazel @@ -17,11 +17,13 @@ go_library( "//parser/mysql", "//parser/types", "//types", + "@org_golang_x_exp//slices", ], ) go_test( name = "schemacmp_test", + timeout = "short", srcs = [ "lattice_test.go", "table_test.go", diff --git a/util/schemacmp/table.go b/util/schemacmp/table.go index b42b1b0a7bcfd..0bb3ab15b5068 100644 --- a/util/schemacmp/table.go +++ b/util/schemacmp/table.go @@ -15,13 +15,13 @@ package schemacmp import ( - "sort" "strings" "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/types" + "golang.org/x/exp/slices" ) const ( @@ -224,7 +224,7 @@ func (a indexMap) ForEach(f func(key string, value Lattice) error) error { return nil } -func (indexMap) CompareWithNil(value Lattice) (int, error) { +func (indexMap) CompareWithNil(_ Lattice) (int, error) { return -1, nil } @@ -232,7 +232,7 @@ func (indexMap) ShouldDeleteIncompatibleJoin() bool { return true } -func (indexMap) JoinWithNil(value Lattice) (Lattice, error) { +func (indexMap) JoinWithNil(_ Lattice) (Lattice, error) { return nil, nil } @@ -283,32 +283,20 @@ func encodeTableInfoToLattice(ti *model.TableInfo) Tuple { } } -type sortedMapSlice []struct { +type kvPair struct { key string value interface{} } -func (sl sortedMapSlice) Len() int { - return len(sl) -} - -func (sl sortedMapSlice) Less(i, j int) bool { - return sl[i].key < sl[j].key -} - -func (sl sortedMapSlice) Swap(i, j int) { - sl[i], sl[j] = sl[j], sl[i] -} - -func sortedMap(input map[string]interface{}) sortedMapSlice { - res := make(sortedMapSlice, 0, len(input)) +func sortedMap(input map[string]interface{}) []kvPair { + res := make([]kvPair, 0, len(input)) for key, value := range input { - res = append(res, struct { - key string - value interface{} - }{key: key, value: value}) + res = append(res, kvPair{key: key, value: value}) } - sort.Sort(res) + + slices.SortFunc(res, func(a, b kvPair) bool { + return a.key < b.key + }) return res } diff --git a/util/selection/BUILD.bazel b/util/selection/BUILD.bazel index 3e6d014d6e7d7..d5448ceb58925 100644 --- a/util/selection/BUILD.bazel +++ b/util/selection/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "selection_test", + timeout = "short", srcs = [ "main_test.go", "selection_test.go", diff --git a/util/selection/selection.go b/util/selection/selection.go index 7e72c43eee815..3974188ed3503 100644 --- a/util/selection/selection.go +++ b/util/selection/selection.go @@ -84,7 +84,7 @@ func medianOfMedians(data Interface, left, right, k int) int { } } -func randomPivot(data Interface, left, right int) int { +func randomPivot(_ Interface, left, right int) int { return left + (rand.Int() % (right - left + 1)) // #nosec G404 } diff --git a/util/sem/BUILD.bazel b/util/sem/BUILD.bazel index 5c01a761449fa..1e773af096d96 100644 --- a/util/sem/BUILD.bazel +++ b/util/sem/BUILD.bazel @@ -14,6 +14,7 @@ go_library( go_test( name = "sem_test", + timeout = "short", srcs = [ "main_test.go", "sem_test.go", diff --git a/util/set/BUILD.bazel b/util/set/BUILD.bazel index 0f733ad14ee41..27a5fd1ea1057 100644 --- a/util/set/BUILD.bazel +++ b/util/set/BUILD.bazel @@ -16,6 +16,7 @@ go_library( go_test( name = "set_test", + timeout = "short", srcs = [ "float64_set_test.go", "int_set_test.go", diff --git a/util/slice/BUILD.bazel b/util/slice/BUILD.bazel index 6a7d1275867f8..ee7ac9f59721e 100644 --- a/util/slice/BUILD.bazel +++ b/util/slice/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "slice_test", + timeout = "short", srcs = [ "main_test.go", "slice_test.go", diff --git a/util/sqlexec/BUILD.bazel b/util/sqlexec/BUILD.bazel index 9be58b47675a0..bbb2529713ad2 100644 --- a/util/sqlexec/BUILD.bazel +++ b/util/sqlexec/BUILD.bazel @@ -24,6 +24,7 @@ go_library( go_test( name = "sqlexec_test", + timeout = "short", srcs = [ "main_test.go", "utils_test.go", diff --git a/util/sqlexec/restricted_sql_executor.go b/util/sqlexec/restricted_sql_executor.go index 2db32927705f9..fbd7c63e714e0 100644 --- a/util/sqlexec/restricted_sql_executor.go +++ b/util/sqlexec/restricted_sql_executor.go @@ -58,6 +58,7 @@ type ExecOption struct { IgnoreWarning bool SnapshotTS uint64 AnalyzeVer int + AnalyzeSnapshot *bool PartitionPruneMode string UseCurSession bool TrackSysProcID uint64 @@ -90,6 +91,14 @@ func GetPartitionPruneModeOption(pruneMode string) OptionFuncAlias { } } +// GetAnalyzeSnapshotOption returns a function which tells ExecRestrictedStmt/SQL to run with analyzeSnapshot. +func GetAnalyzeSnapshotOption(analyzeSnapshot bool) OptionFuncAlias { + return func(option *ExecOption) { + option.AnalyzeSnapshot = new(bool) + *option.AnalyzeSnapshot = analyzeSnapshot + } +} + // ExecOptionUseCurSession tells ExecRestrictedStmt/SQL to use current session. var ExecOptionUseCurSession OptionFuncAlias = func(option *ExecOption) { option.UseCurSession = true diff --git a/util/sqlexec/simple_record_set.go b/util/sqlexec/simple_record_set.go index aef7d035aca01..4cb0d1e8d8df8 100644 --- a/util/sqlexec/simple_record_set.go +++ b/util/sqlexec/simple_record_set.go @@ -36,7 +36,7 @@ func (r *SimpleRecordSet) Fields() []*ast.ResultField { } // Next implements the sqlexec.RecordSet interface. -func (r *SimpleRecordSet) Next(ctx context.Context, req *chunk.Chunk) error { +func (r *SimpleRecordSet) Next(_ context.Context, req *chunk.Chunk) error { req.Reset() for r.idx < len(r.Rows) { if req.IsFull() { diff --git a/util/stmtsummary/BUILD.bazel b/util/stmtsummary/BUILD.bazel index e5c2d2950bf05..1a365ef883a99 100644 --- a/util/stmtsummary/BUILD.bazel +++ b/util/stmtsummary/BUILD.bazel @@ -31,6 +31,7 @@ go_library( go_test( name = "stmtsummary_test", + timeout = "short", srcs = [ "evicted_test.go", "main_test.go", diff --git a/util/stmtsummary/evicted.go b/util/stmtsummary/evicted.go index bb2e9f09a3111..be216c7414bdd 100644 --- a/util/stmtsummary/evicted.go +++ b/util/stmtsummary/evicted.go @@ -92,7 +92,6 @@ func (ssbde *stmtSummaryByDigestEvicted) AddEvicted(evictedKey *stmtSummaryByDig defer evictedElement.Unlock() // no record in ssbde.history, direct insert if ssbde.history.Len() == 0 && historySize != 0 { - eBeginTime := evictedElement.beginTime eEndTime := evictedElement.endTime record := newStmtSummaryByDigestEvictedElement(eBeginTime, eEndTime) @@ -102,7 +101,6 @@ func (ssbde *stmtSummaryByDigestEvicted) AddEvicted(evictedKey *stmtSummaryByDig h = ssbde.history.Back() return } - // look for matching history interval MATCHING: for ; h != nil; h = h.Prev() { diff --git a/util/stmtsummary/reader.go b/util/stmtsummary/reader.go index d9c3e338fdd6f..eca48ae4e82eb 100644 --- a/util/stmtsummary/reader.go +++ b/util/stmtsummary/reader.go @@ -309,6 +309,7 @@ const ( PrevSampleTextStr = "PREV_SAMPLE_TEXT" PlanDigestStr = "PLAN_DIGEST" PlanStr = "PLAN" + BinaryPlan = "BINARY_PLAN" ) type columnValueFactory func(reader *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, ssbd *stmtSummaryByDigest) interface{} @@ -616,4 +617,7 @@ var columnValueFactoryMap = map[string]columnValueFactory{ } return plan }, + BinaryPlan: func(_ *stmtSummaryReader, ssElement *stmtSummaryByDigestElement, _ *stmtSummaryByDigest) interface{} { + return ssElement.sampleBinaryPlan + }, } diff --git a/util/stmtsummary/statement_summary.go b/util/stmtsummary/statement_summary.go index d0722544f1f22..3d90c107b7cbf 100644 --- a/util/stmtsummary/statement_summary.go +++ b/util/stmtsummary/statement_summary.go @@ -112,16 +112,17 @@ type stmtSummaryByDigestElement struct { beginTime int64 endTime int64 // basic - sampleSQL string - charset string - collation string - prevSQL string - samplePlan string - planHint string - indexNames []string - execCount int64 - sumErrors int - sumWarnings int + sampleSQL string + charset string + collation string + prevSQL string + samplePlan string + sampleBinaryPlan string + planHint string + indexNames []string + execCount int64 + sumErrors int + sumWarnings int // latency sumLatency time.Duration maxLatency time.Duration @@ -211,33 +212,34 @@ type stmtSummaryByDigestElement struct { // StmtExecInfo records execution information of each statement. type StmtExecInfo struct { - SchemaName string - OriginalSQL string - Charset string - Collation string - NormalizedSQL string - Digest string - PrevSQL string - PrevSQLDigest string - PlanGenerator func() (string, string) - PlanDigest string - PlanDigestGen func() string - User string - TotalLatency time.Duration - ParseLatency time.Duration - CompileLatency time.Duration - StmtCtx *stmtctx.StatementContext - CopTasks *stmtctx.CopTasksDetails - ExecDetail *execdetails.ExecDetails - MemMax int64 - DiskMax int64 - StartTime time.Time - IsInternal bool - Succeed bool - PlanInCache bool - PlanInBinding bool - ExecRetryCount uint - ExecRetryTime time.Duration + SchemaName string + OriginalSQL string + Charset string + Collation string + NormalizedSQL string + Digest string + PrevSQL string + PrevSQLDigest string + PlanGenerator func() (string, string) + BinaryPlanGenerator func() string + PlanDigest string + PlanDigestGen func() string + User string + TotalLatency time.Duration + ParseLatency time.Duration + CompileLatency time.Duration + StmtCtx *stmtctx.StatementContext + CopTasks *stmtctx.CopTasksDetails + ExecDetail *execdetails.ExecDetails + MemMax int64 + DiskMax int64 + StartTime time.Time + IsInternal bool + Succeed bool + PlanInCache bool + PlanInBinding bool + ExecRetryCount uint + ExecRetryTime time.Duration execdetails.StmtExecDetails ResultRows int64 TiKVExecDetails util.ExecDetails @@ -246,7 +248,6 @@ type StmtExecInfo struct { // newStmtSummaryByDigestMap creates an empty stmtSummaryByDigestMap. func newStmtSummaryByDigestMap() *stmtSummaryByDigestMap { - ssbde := newStmtSummaryByDigestEvicted() // This initializes the stmtSummaryByDigestMap with "compiled defaults" @@ -498,7 +499,7 @@ func (ssMap *stmtSummaryByDigestMap) maxSQLLength() int { } // newStmtSummaryByDigest creates a stmtSummaryByDigest from StmtExecInfo. -func (ssbd *stmtSummaryByDigest) init(sei *StmtExecInfo, beginTime int64, intervalSeconds int64, historySize int) { +func (ssbd *stmtSummaryByDigest) init(sei *StmtExecInfo, _ int64, _ int64, _ int) { // Use "," to separate table names to support FIND_IN_SET. var buffer bytes.Buffer for i, value := range sei.StmtCtx.Tables { @@ -593,15 +594,23 @@ func (ssbd *stmtSummaryByDigest) collectHistorySummaries(checker *stmtSummaryChe return ssElements } -var maxEncodedPlanSizeInBytes = 1024 * 1024 +// MaxEncodedPlanSizeInBytes is the upper limit of the size of the plan and the binary plan in the stmt summary. +var MaxEncodedPlanSizeInBytes = 1024 * 1024 func newStmtSummaryByDigestElement(sei *StmtExecInfo, beginTime int64, intervalSeconds int64) *stmtSummaryByDigestElement { // sampleSQL / authUsers(sampleUser) / samplePlan / prevSQL / indexNames store the values shown at the first time, // because it compacts performance to update every time. samplePlan, planHint := sei.PlanGenerator() - if len(samplePlan) > maxEncodedPlanSizeInBytes { + if len(samplePlan) > MaxEncodedPlanSizeInBytes { samplePlan = plancodec.PlanDiscardedEncoded } + binPlan := "" + if sei.BinaryPlanGenerator != nil { + binPlan = sei.BinaryPlanGenerator() + if len(binPlan) > MaxEncodedPlanSizeInBytes { + binPlan = plancodec.BinaryPlanDiscardedEncoded + } + } ssElement := &stmtSummaryByDigestElement{ beginTime: beginTime, sampleSQL: formatSQL(sei.OriginalSQL), @@ -610,19 +619,20 @@ 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, - 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, } ssElement.add(sei, intervalSeconds) return ssElement @@ -659,7 +669,7 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco ssElement.endTime = ssElement.beginTime + intervalSeconds ssElement.execCount++ if !sei.Succeed { - ssElement.sumErrors += 1 + ssElement.sumErrors++ } ssElement.sumWarnings += int(sei.StmtCtx.WarningCount()) @@ -787,7 +797,7 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco } ssElement.sumBackoffTimes += int64(len(commitDetails.Mu.BackoffTypes)) for _, backoffType := range commitDetails.Mu.BackoffTypes { - ssElement.backoffTypes[backoffType] += 1 + ssElement.backoffTypes[backoffType]++ } commitDetails.Mu.Unlock() } @@ -795,7 +805,7 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco // plan cache if sei.PlanInCache { ssElement.planInCache = true - ssElement.planCacheHits += 1 + ssElement.planCacheHits++ } else { ssElement.planInCache = false } diff --git a/util/stmtsummary/statement_summary_test.go b/util/stmtsummary/statement_summary_test.go index 041de2989241f..a883c4aa51c28 100644 --- a/util/stmtsummary/statement_summary_test.go +++ b/util/stmtsummary/statement_summary_test.go @@ -185,8 +185,12 @@ func TestAddStatement(t *testing.T) { LocalLatchTime: 50, Mu: struct { sync.Mutex - CommitBackoffTime int64 - BackoffTypes []string + CommitBackoffTime int64 + BackoffTypes []string + SlowestReqTotalTime time.Duration + SlowestRegion uint64 + SlowestStoreAddr string + SlowestExecDetails util.TiKVExecDetails }{ CommitBackoffTime: 1000, BackoffTypes: []string{boTxnLockName}, @@ -317,8 +321,12 @@ func TestAddStatement(t *testing.T) { LocalLatchTime: 5, Mu: struct { sync.Mutex - CommitBackoffTime int64 - BackoffTypes []string + CommitBackoffTime int64 + BackoffTypes []string + SlowestReqTotalTime time.Duration + SlowestRegion uint64 + SlowestStoreAddr string + SlowestExecDetails util.TiKVExecDetails }{ CommitBackoffTime: 100, BackoffTypes: []string{boTxnLockName}, @@ -435,7 +443,7 @@ func TestAddStatement(t *testing.T) { stmtExecInfo7 := stmtExecInfo1 stmtExecInfo7.PlanDigest = "plan_digest7" stmtExecInfo7.PlanGenerator = func() (string, string) { - buf := make([]byte, maxEncodedPlanSizeInBytes+1) + buf := make([]byte, MaxEncodedPlanSizeInBytes+1) for i := range buf { buf[i] = 'a' } @@ -603,8 +611,12 @@ func generateAnyExecInfo() *StmtExecInfo { LocalLatchTime: 10, Mu: struct { sync.Mutex - CommitBackoffTime int64 - BackoffTypes []string + CommitBackoffTime int64 + BackoffTypes []string + SlowestReqTotalTime time.Duration + SlowestRegion uint64 + SlowestStoreAddr string + SlowestExecDetails util.TiKVExecDetails }{ CommitBackoffTime: 200, BackoffTypes: []string{boTxnLockName}, diff --git a/util/stringutil/BUILD.bazel b/util/stringutil/BUILD.bazel index 3d8e0f3433e12..c8b41d09208e7 100644 --- a/util/stringutil/BUILD.bazel +++ b/util/stringutil/BUILD.bazel @@ -15,6 +15,7 @@ go_library( go_test( name = "stringutil_test", + timeout = "short", srcs = [ "main_test.go", "string_util_test.go", diff --git a/util/sys/linux/BUILD.bazel b/util/sys/linux/BUILD.bazel index 292018077fa6c..78c1687b5e5f5 100644 --- a/util/sys/linux/BUILD.bazel +++ b/util/sys/linux/BUILD.bazel @@ -14,6 +14,7 @@ go_library( go_test( name = "linux_test", + timeout = "short", srcs = [ "main_test.go", "sys_test.go", diff --git a/util/sys/linux/sys_other.go b/util/sys/linux/sys_other.go index 2c5729dbefacc..49305e40dc30a 100644 --- a/util/sys/linux/sys_other.go +++ b/util/sys/linux/sys_other.go @@ -30,7 +30,7 @@ func OSVersion() (osVersion string, err error) { } // SetAffinity sets cpu affinity. -func SetAffinity(cpus []int) error { +func SetAffinity(_ []int) error { return nil } diff --git a/util/sys/storage/BUILD.bazel b/util/sys/storage/BUILD.bazel index d7a9e26a7fdd1..56594c494bf00 100644 --- a/util/sys/storage/BUILD.bazel +++ b/util/sys/storage/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "storage_test", + timeout = "short", srcs = [ "main_test.go", "sys_test.go", diff --git a/util/systimemon/BUILD.bazel b/util/systimemon/BUILD.bazel index d2529399ed24e..561ca9fae45b2 100644 --- a/util/systimemon/BUILD.bazel +++ b/util/systimemon/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "systimemon_test", + timeout = "short", srcs = [ "main_test.go", "systime_mon_test.go", diff --git a/util/table-filter/BUILD.bazel b/util/table-filter/BUILD.bazel index f86cc79fe35bd..7d92695ac08ca 100644 --- a/util/table-filter/BUILD.bazel +++ b/util/table-filter/BUILD.bazel @@ -17,6 +17,7 @@ go_library( go_test( name = "table-filter_test", + timeout = "short", srcs = [ "column_filter_test.go", "compat_test.go", diff --git a/util/table-filter/compat.go b/util/table-filter/compat.go index b695b8dd01a69..79fd760e810d1 100644 --- a/util/table-filter/compat.go +++ b/util/table-filter/compat.go @@ -90,7 +90,7 @@ type schemasFilter struct { schemas map[string]struct{} } -func (f schemasFilter) MatchTable(schema string, table string) bool { +func (f schemasFilter) MatchTable(schema string, _ string) bool { return f.MatchSchema(schema) } diff --git a/util/table-filter/parser.go b/util/table-filter/parser.go index 122984f95f86d..d30ddb7a17b48 100644 --- a/util/table-filter/parser.go +++ b/util/table-filter/parser.go @@ -58,7 +58,7 @@ func (p *tableRulesParser) parse(line string, canImport bool) error { return err } if len(line) == 0 { - return p.errorf("missing table pattern") + return p.errorf("wrong table pattern") } if line[0] != '.' { return p.errorf("syntax error: missing '.' between schema and table patterns") diff --git a/util/table-filter/table_filter_test.go b/util/table-filter/table_filter_test.go index 7e0eb8956239e..2928d498098ea 100644 --- a/util/table-filter/table_filter_test.go +++ b/util/table-filter/table_filter_test.go @@ -265,8 +265,8 @@ func TestMatchTables(t *testing.T) { require.NoError(t, err) fci := filter.CaseInsensitive(fcs) for i, tbl := range tc.tables { - require.Equalf(t, fcs.MatchTable(tbl.Schema, tbl.Name), tc.acceptedCS[i], "cs tbl %v", tbl) - require.Equalf(t, fci.MatchTable(tbl.Schema, tbl.Name), tc.acceptedCI[i], "ci tbl %v", tbl) + require.Equalf(t, tc.acceptedCS[i], fcs.MatchTable(tbl.Schema, tbl.Name), "cs tbl %v", tbl) + require.Equalf(t, tc.acceptedCI[i], fci.MatchTable(tbl.Schema, tbl.Name), "ci tbl %v", tbl) } } } @@ -383,7 +383,7 @@ func TestParseFailures2(t *testing.T) { }, { arg: "db", - msg: `.*: missing table pattern`, + msg: `.*: wrong table pattern`, }, { arg: "db.", diff --git a/util/table-router/BUILD.bazel b/util/table-router/BUILD.bazel index 3235c635b1e37..0396984c1dd7b 100644 --- a/util/table-router/BUILD.bazel +++ b/util/table-router/BUILD.bazel @@ -13,6 +13,7 @@ go_library( go_test( name = "table-router_test", + timeout = "short", srcs = ["router_test.go"], embed = [":table-router"], deps = [ diff --git a/util/table-router/router.go b/util/table-router/router.go index f465b014e2b78..af9d08f63dd7d 100644 --- a/util/table-router/router.go +++ b/util/table-router/router.go @@ -183,7 +183,7 @@ func (r *Table) RemoveRule(rule *TableRule) error { // Route routes schema/table to target schema/table // don't support to route schema/table to multiple schema/table -func (r *Table) Route(schema, table string) (string, string, error) { +func (r *Table) Route(schema, table string) (targetSchema string, targetTable string, err error) { schemaL, tableL := schema, table if !r.caseSensitive { schemaL, tableL = strings.ToLower(schema), strings.ToLower(table) @@ -209,10 +209,6 @@ func (r *Table) Route(schema, table string) (string, string, error) { } } - var ( - targetSchema string - targetTable string - ) if len(table) == 0 || len(tableRules) == 0 { if len(schemaRules) > 1 { return "", "", errors.NotSupportedf("`%s`.`%s` matches %d schema route rules which is more than one.\nThe first two rules are %+v, %+v.\nIt's", schema, table, len(schemaRules), schemaRules[0], schemaRules[1]) @@ -241,7 +237,7 @@ func (r *Table) Route(schema, table string) (string, string, error) { } // ExtractVal match value via regexp -func (t *TableRule) extractVal(s string, ext interface{}) string { +func (*TableRule) extractVal(s string, ext interface{}) string { var params []string switch e := ext.(type) { case *TableExtractor: diff --git a/util/table-rule-selector/BUILD.bazel b/util/table-rule-selector/BUILD.bazel index 8624836169e36..95edad36596fb 100644 --- a/util/table-rule-selector/BUILD.bazel +++ b/util/table-rule-selector/BUILD.bazel @@ -10,6 +10,7 @@ go_library( go_test( name = "table-rule-selector_test", + timeout = "short", srcs = ["selector_test.go"], embed = [":table-rule-selector"], deps = ["@com_github_stretchr_testify//require"], diff --git a/util/table-rule-selector/selector_test.go b/util/table-rule-selector/selector_test.go index c43956b911fda..950b5845893a7 100644 --- a/util/table-rule-selector/selector_test.go +++ b/util/table-rule-selector/selector_test.go @@ -196,7 +196,6 @@ func testReplace(t *testing.T, s Selector) { require.NoError(t, err) err = s.Insert(schema, "", replacedRule, Insert) require.Error(t, err) - } schemas, tables := s.AllRules() diff --git a/util/table-rule-selector/trie_selector.go b/util/table-rule-selector/trie_selector.go index 07cec79938ec9..2c49704241255 100644 --- a/util/table-rule-selector/trie_selector.go +++ b/util/table-rule-selector/trie_selector.go @@ -265,7 +265,7 @@ func (t *trieSelector) insertTable(schema, table string, rule interface{}, inser return nil } -func (t *trieSelector) getRangeItem(pattern string) (*rangeItem, int) { +func (*trieSelector) getRangeItem(pattern string) (*rangeItem, int) { nextI := -1 for i := range pattern { if pattern[i] == rangeClose { diff --git a/util/texttree/BUILD.bazel b/util/texttree/BUILD.bazel index b92b391e90608..987dfd79e9199 100644 --- a/util/texttree/BUILD.bazel +++ b/util/texttree/BUILD.bazel @@ -9,6 +9,7 @@ go_library( go_test( name = "texttree_test", + timeout = "short", srcs = [ "main_test.go", "texttree_test.go", diff --git a/util/timeutil/BUILD.bazel b/util/timeutil/BUILD.bazel index cd6ede1cdeb3f..c9b4ee8f5369f 100644 --- a/util/timeutil/BUILD.bazel +++ b/util/timeutil/BUILD.bazel @@ -14,6 +14,7 @@ go_library( go_test( name = "timeutil_test", + timeout = "short", srcs = [ "main_test.go", "time_test.go", diff --git a/util/topsql/BUILD.bazel b/util/topsql/BUILD.bazel index b8a1496328788..19b8b381c4b5f 100644 --- a/util/topsql/BUILD.bazel +++ b/util/topsql/BUILD.bazel @@ -21,6 +21,7 @@ go_library( go_test( name = "topsql_test", + timeout = "short", srcs = [ "main_test.go", "topsql_test.go", diff --git a/util/topsql/collector/BUILD.bazel b/util/topsql/collector/BUILD.bazel index 4ca8239fa300e..9e8fa4466cf27 100644 --- a/util/topsql/collector/BUILD.bazel +++ b/util/topsql/collector/BUILD.bazel @@ -18,6 +18,7 @@ go_library( go_test( name = "collector_test", + timeout = "short", srcs = ["main_test.go"], embed = [":collector"], deps = [ diff --git a/util/topsql/collector/cpu.go b/util/topsql/collector/cpu.go index eb7ba6183c3a6..de3cbb3206672 100644 --- a/util/topsql/collector/cpu.go +++ b/util/topsql/collector/cpu.go @@ -192,7 +192,7 @@ func (sp *SQLCPUCollector) parseCPUProfileBySQLLabels(p *profile.Profile) []SQLC return sp.createSQLStats(sqlMap) } -func (sp *SQLCPUCollector) createSQLStats(sqlMap map[string]*sqlStats) []SQLCPUTimeRecord { +func (*SQLCPUCollector) createSQLStats(sqlMap map[string]*sqlStats) []SQLCPUTimeRecord { stats := make([]SQLCPUTimeRecord, 0, len(sqlMap)) for sqlDigest, stmt := range sqlMap { stmt.tune() diff --git a/util/topsql/collector/mock/mock.go b/util/topsql/collector/mock/mock.go index 0320ca2c60aa8..ff94cfd185854 100644 --- a/util/topsql/collector/mock/mock.go +++ b/util/topsql/collector/mock/mock.go @@ -50,7 +50,7 @@ func NewTopSQLCollector() *TopSQLCollector { } // Start implements TopSQLReporter interface. -func (c *TopSQLCollector) Start() {} +func (*TopSQLCollector) Start() {} // Collect uses for testing. func (c *TopSQLCollector) Collect(stats []collector.SQLCPUTimeRecord) { @@ -78,7 +78,7 @@ func (c *TopSQLCollector) Collect(stats []collector.SQLCPUTimeRecord) { } // CollectStmtStatsMap implements stmtstats.Collector. -func (c *TopSQLCollector) CollectStmtStatsMap(_ stmtstats.StatementStatsMap) {} +func (*TopSQLCollector) CollectStmtStatsMap(_ stmtstats.StatementStatsMap) {} // GetSQLStatsBySQLWithRetry uses for testing. func (c *TopSQLCollector) GetSQLStatsBySQLWithRetry(sql string, planIsNotNull bool) []*collector.SQLCPUTimeRecord { @@ -149,7 +149,7 @@ func (c *TopSQLCollector) GetPlan(planDigest []byte) string { } // RegisterSQL uses for testing. -func (c *TopSQLCollector) RegisterSQL(sqlDigest []byte, normalizedSQL string, isInternal bool) { +func (c *TopSQLCollector) RegisterSQL(sqlDigest []byte, normalizedSQL string, _ bool) { digestStr := string(hack.String(sqlDigest)) c.Lock() _, ok := c.sqlMap[digestStr] @@ -157,7 +157,6 @@ func (c *TopSQLCollector) RegisterSQL(sqlDigest []byte, normalizedSQL string, is c.sqlMap[digestStr] = normalizedSQL } c.Unlock() - } // RegisterPlan uses for testing. @@ -209,9 +208,9 @@ func (c *TopSQLCollector) CollectCnt() int64 { } // Close implements the interface. -func (c *TopSQLCollector) Close() {} +func (*TopSQLCollector) Close() {} -func (c *TopSQLCollector) hash(stat collector.SQLCPUTimeRecord) string { +func (*TopSQLCollector) hash(stat collector.SQLCPUTimeRecord) string { return string(stat.SQLDigest) + string(stat.PlanDigest) } diff --git a/util/topsql/reporter/BUILD.bazel b/util/topsql/reporter/BUILD.bazel index 04f402018c9a2..a5621a615bf94 100644 --- a/util/topsql/reporter/BUILD.bazel +++ b/util/topsql/reporter/BUILD.bazel @@ -34,6 +34,7 @@ go_library( go_test( name = "reporter_test", + timeout = "short", srcs = [ "datamodel_test.go", "datasink_test.go", diff --git a/util/topsql/reporter/pubsub.go b/util/topsql/reporter/pubsub.go index 62e6d2af8c412..c18c50f648ab1 100644 --- a/util/topsql/reporter/pubsub.go +++ b/util/topsql/reporter/pubsub.go @@ -179,7 +179,7 @@ func (ds *pubSubDataSink) sendTopSQLRecords(ctx context.Context, records []tipb. if err = ds.stream.Send(r); err != nil { return } - sentCount += 1 + sentCount++ select { case <-ctx.Done(): @@ -216,7 +216,7 @@ func (ds *pubSubDataSink) sendSQLMeta(ctx context.Context, sqlMetas []tipb.SQLMe if err = ds.stream.Send(r); err != nil { return } - sentCount += 1 + sentCount++ select { case <-ctx.Done(): @@ -253,7 +253,7 @@ func (ds *pubSubDataSink) sendPlanMeta(ctx context.Context, planMetas []tipb.Pla if err = ds.stream.Send(r); err != nil { return } - sentCount += 1 + sentCount++ select { case <-ctx.Done(): diff --git a/util/topsql/reporter/single_target.go b/util/topsql/reporter/single_target.go index 3c75197be1737..197844da4f25f 100644 --- a/util/topsql/reporter/single_target.go +++ b/util/topsql/reporter/single_target.go @@ -94,8 +94,8 @@ func (ds *SingleTargetDataSink) recoverRun() { } ds.conn = nil }() - for ds.run() { + continue } } @@ -254,7 +254,7 @@ func (ds *SingleTargetDataSink) sendBatchTopSQLRecord(ctx context.Context, recor if err = stream.Send(&records[i]); err != nil { return } - sentCount += 1 + sentCount++ } // See https://pkg.go.dev/google.golang.org/grpc#ClientConn.NewStream for how to avoid leaking the stream @@ -289,7 +289,7 @@ func (ds *SingleTargetDataSink) sendBatchSQLMeta(ctx context.Context, sqlMetas [ if err = stream.Send(&sqlMetas[i]); err != nil { return } - sentCount += 1 + sentCount++ } // See https://pkg.go.dev/google.golang.org/grpc#ClientConn.NewStream for how to avoid leaking the stream @@ -324,7 +324,7 @@ func (ds *SingleTargetDataSink) sendBatchPlanMeta(ctx context.Context, planMetas if err = stream.Send(&planMetas[i]); err != nil { return err } - sentCount += 1 + sentCount++ } // See https://pkg.go.dev/google.golang.org/grpc#ClientConn.NewStream for how to avoid leaking the stream @@ -352,7 +352,7 @@ func (ds *SingleTargetDataSink) tryEstablishConnection(ctx context.Context, targ return nil } -func (ds *SingleTargetDataSink) dial(ctx context.Context, targetRPCAddr string) (*grpc.ClientConn, error) { +func (*SingleTargetDataSink) dial(ctx context.Context, targetRPCAddr string) (*grpc.ClientConn, error) { dialCtx, cancel := context.WithTimeout(ctx, dialTimeout) defer cancel() return grpc.DialContext( diff --git a/util/topsql/stmtstats/BUILD.bazel b/util/topsql/stmtstats/BUILD.bazel index 8216997d71a62..bea760d6f143b 100644 --- a/util/topsql/stmtstats/BUILD.bazel +++ b/util/topsql/stmtstats/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "stmtstats_test", + timeout = "short", srcs = [ "aggregator_test.go", "kv_exec_count_test.go", diff --git a/util/topsql/topsql.go b/util/topsql/topsql.go index 61ffca2b0d460..97e10dd58e498 100644 --- a/util/topsql/topsql.go +++ b/util/topsql/topsql.go @@ -168,6 +168,7 @@ func MockHighCPULoad(sql string, sqlPrefixs []string, load int64) bool { break } for i := 0; i < 10e5; i++ { + continue } } return true diff --git a/util/tracing/BUILD.bazel b/util/tracing/BUILD.bazel index d5b5552c156c8..619a66ac202c8 100644 --- a/util/tracing/BUILD.bazel +++ b/util/tracing/BUILD.bazel @@ -16,6 +16,7 @@ go_library( go_test( name = "tracing_test", + timeout = "short", srcs = [ "main_test.go", "noop_bench_test.go", diff --git a/util/tracing/opt_trace.go b/util/tracing/opt_trace.go index 6d7cae715cf0c..09de10828d8a8 100644 --- a/util/tracing/opt_trace.go +++ b/util/tracing/opt_trace.go @@ -62,7 +62,6 @@ func (tracer *LogicalOptimizeTracer) RecordFinalLogicalPlan(final *PlanTrace) { tracer.removeUselessStep() } -// TODO: use a switch to control it func (tracer *LogicalOptimizeTracer) removeUselessStep() { newSteps := make([]*LogicalRuleOptimizeTracer, 0) for _, step := range tracer.Steps { @@ -159,11 +158,18 @@ func DedupCETrace(records []*CETraceRecord) []*CETraceRecord { // PhysicalOptimizeTracer indicates the trace for the whole physicalOptimize processing type PhysicalOptimizeTracer struct { // final indicates the final physical plan trace - Final []*PlanTrace `json:"final"` - SelectedCandidates []*CandidatePlanTrace `json:"selected_candidates"` - DiscardedCandidates []*CandidatePlanTrace `json:"discarded_candidates"` - // (logical plan) -> physical plan codename -> physical plan - State map[string]map[string]*PlanTrace `json:"-"` + Final []*PlanTrace `json:"final"` + Candidates map[int]*CandidatePlanTrace `json:"candidates"` +} + +// AppendCandidate appends physical CandidatePlanTrace in tracer. +// If the candidate already exists, the previous candidate would be covered depends on whether it has mapping logical plan +func (tracer *PhysicalOptimizeTracer) AppendCandidate(c *CandidatePlanTrace) { + old, exists := tracer.Candidates[c.ID] + if exists && len(old.MappingLogicalPlan) > 0 && len(c.MappingLogicalPlan) < 1 { + return + } + tracer.Candidates[c.ID] = c } // RecordFinalPlanTrace records final physical plan trace @@ -178,48 +184,21 @@ type CandidatePlanTrace struct { MappingLogicalPlan string `json:"mapping"` } -func newCandidatePlanTrace(trace *PlanTrace, logicalPlanKey string, bestKey map[string]struct{}) *CandidatePlanTrace { - selected := false - if _, ok := bestKey[CodecPlanName(trace.TP, trace.ID)]; ok { - selected = true - } - c := &CandidatePlanTrace{ - MappingLogicalPlan: logicalPlanKey, - } - c.PlanTrace = trace - c.Selected = selected - for i, child := range c.Children { - if _, ok := bestKey[CodecPlanName(child.TP, child.ID)]; ok { - child.Selected = true - } - c.Children[i] = child - } - return c -} - // buildCandidatesInfo builds candidates info func (tracer *PhysicalOptimizeTracer) buildCandidatesInfo() { - if tracer == nil || len(tracer.State) < 1 { + if tracer == nil || len(tracer.Candidates) < 1 { return } - sCandidates := make([]*CandidatePlanTrace, 0) - dCandidates := make([]*CandidatePlanTrace, 0) - bestKeys := map[string]struct{}{} - for _, node := range tracer.Final { - bestKeys[CodecPlanName(node.TP, node.ID)] = struct{}{} + fID := make(map[int]struct{}, len(tracer.Final)) + for _, plan := range tracer.Final { + fID[plan.ID] = struct{}{} } - for logicalKey, pps := range tracer.State { - for _, pp := range pps { - c := newCandidatePlanTrace(pp, logicalKey, bestKeys) - if c.Selected { - sCandidates = append(sCandidates, c) - } else { - dCandidates = append(dCandidates, c) - } + + for _, candidate := range tracer.Candidates { + if _, ok := fID[candidate.ID]; ok { + candidate.Selected = true } } - tracer.SelectedCandidates = sCandidates - tracer.DiscardedCandidates = dCandidates } // CodecPlanName returns tp_id of plan. diff --git a/util/tracing/util_test.go b/util/tracing/util_test.go index 0e7760713803a..119f2777017b9 100644 --- a/util/tracing/util_test.go +++ b/util/tracing/util_test.go @@ -65,7 +65,6 @@ func TestChildSpanFromContext(t *testing.T) { // verify second span's operation is not nil, this way we can ensure // callback logic works. require.NotNil(t, collectedSpan[1].Operation) - } func TestFollowFrom(t *testing.T) { diff --git a/util/versioninfo/versioninfo.go b/util/versioninfo/versioninfo.go index 563a97e6356d9..8c2b9b57d42e3 100644 --- a/util/versioninfo/versioninfo.go +++ b/util/versioninfo/versioninfo.go @@ -26,5 +26,5 @@ var ( TiDBGitBranch = "None" TiDBEdition = CommunityEdition // TiKVMinVersion is the minimum version of TiKV that can be compatible with the current TiDB. - TiKVMinVersion = "v3.0.0-60965b006877ca7234adaced7890d7b029ed1306" + TiKVMinVersion = "6.2.0-alpha" ) diff --git a/util/vitess/BUILD.bazel b/util/vitess/BUILD.bazel index 5d3070de902fd..d05401ed0cacb 100644 --- a/util/vitess/BUILD.bazel +++ b/util/vitess/BUILD.bazel @@ -10,6 +10,7 @@ go_library( go_test( name = "vitess_test", + timeout = "short", srcs = [ "main_test.go", "vitess_hash_test.go", diff --git a/util/watcher/BUILD.bazel b/util/watcher/BUILD.bazel index 124a0c08436b5..b9ef440e70a58 100644 --- a/util/watcher/BUILD.bazel +++ b/util/watcher/BUILD.bazel @@ -16,6 +16,7 @@ go_library( go_test( name = "watcher_test", + timeout = "short", srcs = ["watcher_test.go"], embed = [":watcher"], flaky = True,